HTTP - lesson 1

ashkan nasirzadeh اشکان نصیرزاده

اشکان نصیرزاده

ابزار مورد نیاز ویژگی های پایه client server پارامتر های HTTP HTTP - Messages start-line قسمت هدر ها قسمت body HTTP Request Request Header Fields HTTP - Responses Response Header Fields examples

http یک پروتکل application/level است که برای سیستم های توزیع شده ، مشترک و hypermedia information استفاده می شود . http اساس انتقال داده ها در بستر world wide web (یا اینترنت) از سال ۱۹۹۰ می باشد. این دوره بر اساس مشخصات فنی RFC-2616 میباشد که در مورد HTTP/1.1 می باشد.
تفاوت اصلی بین HTTP/1.1 و HTTP/1.0 این است که ورژن قدیمی تر برای هر تبادل request/responce از یک connection جدید استفاده می کرد.

در حقیقت http یک پروتکل تبادل داده ها بر اساس TCP/IP می باشد که برای انتقال دیتا در شبکه ی www استفاه می شود (انتقال عکس ها یا اچ تی ام ال ها یا query results یا ...) ، پورت مفروض TCP 80 می باشد اما پورت های دیگری هم می توانند استفاده بشوند.
HTTP مشخص می کند که چگونه داده های درخواست های client ساختار بندی بشوند و به سرور فرستاده بشوند و اینکه چگونه سرور به این درخواست ها پاسخ می دهد.

ابزار مورد نیاز

می توانید از devTools در firefox استفاده کنید.
می توانید از <a href="https://httpie.org">httpie</a> هم استفاده کنید.

ویژگی های پایه

سه ویژگی اساسی وجود دارد که باعث می شود این پروتکل ساده اما قدرتمند باشد:
۱- HTTP is connectionless: یک client اچ تی تی پی یک درخواستی رو initiate می کنه و بعد منتظر پاسخش می مونه و بعد که سرور بهش جواب می ده کانکشن رو می بنده در نتیجه سرور و کلاینت فقط روی همون درخواست/پاسخ همدیگه رو میشناسند و درخواست/پاسخ های بعدی روی کانکشن های جدید ایجاد می شوند.
۲- HTTP is media independent: یعنی تا زمانی که هم سرور و هم کلاینت بدونن که چجوری محتویات داده ها رو handle کنند هر داده ای می تواند در این بین منتقل شود و لذا هم برای کلاینت و هم برای سرور لازم است که نوع داده ها به وسیله ی MIME-type ها مشخص شود.
۳- HTTP is stateless: یعنی امکان نگاه داری اطلاعات بین درخواست های مختلف در طول صفحات وب وجود ندارد (به علت همون مورد اول)

دیاگرام زیر یک معماری خیلی پایه ای یک web application را نشان داده و نشان می دهد که HTTP کجا می نشیند:

 

client

http client یک درخواست در فرم یک request methode، URI, protocol version که با یک پیام MIME-like که شامل تصیح کننده ی درخواست ، اطلاعات client و possible body content را به سرور می فرستد اون هم روی یک کانکشن TCP/IP

server

http server با یک status line پاسخ می دهد که شامل message's protocol version and a success or error code می باشد و در ادامه اش a MIME-like message containing server information, entity meta information, and possible entity-body content آمده است.

پارامتر های HTTP

HTTP-Version = "HTTP" "/" 1*DIGIT "." 1*DIGIT
// e.g. : HTTP/1.1

URI = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]]
// empty port => default port = 80
// empty abs_path => default abs_path = /
// e.g. : http://abc.com:80/~smith/home.html
// e.g.(same): http://ABC.com/%7Esmith/home.html
// e.g.(same): http://ABC.com:/%7esmith/home.html

Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123
Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format

US-ASCII //default
or
ISO-8859-1
or
ISO-8859-7
// All content-coding values are case-insensitive
Accept-encoding: gzip
or
Accept-encoding: compress
or
Accept-encoding: deflate
media-type = type "/" subtype *( ";" parameter )
// e.g. : Accept: image/gif
// All the Media-type values are registered with the Internet Assigned Number Authority (IANA)

HTTP - Messages

یک client http یک برنامه ای هست که یک کانکشن رو با سرور با هدف فرستادن یک یا چند http request message ست آپ می کند. (مثل web browser)
یک server http یک برنامه ای هست که کانکشن ها رو می پذیرد با هدف serve کردن به http request به وسیله ی فرستادن http responce message (به طور کلی مثل وب سرور آپاچی یا IIS)

http از URI برای شناسایی کردن منبع داده شده و برای ست آپ کردن یک کانکشن استفاده می کند و به محض اینکه کانکشن established شد http messages ها با فرمت هایی شبیه با آنچه که استاندارد های RFC3522 و RFC2045 (که مربوط به internet mail و MIME هستند) عبور داده می شوند ، این message ها شامل درخواست های client به سرور پاسخ های server به کلاینت هستند که این message ها با فرمت زیر هستند:

HTTP-message = <Request> | <Response> ; HTTP/1.1 messages

http request و http responce از یک فرمت عمومی استفاده می کنند (با ضابطه ی RFC822) که این فرمت عمومی شامل ۴ مورد زیر است:

*A Start-line

*Zero or more header fields followed by CRLF

*An empty line (i.e., a line with nothing preceding the CRLF)

indicating the end of the header fields

*Optionally a message-body

start-line

به طور کلی سینتکس start-line به شکل زیر است:

start-line = Request-Line | Status-Line
// examples:
GET /hello.htm HTTP/1.1 #(This is Request-Line sent by the client)
HTTP/1.1 200 OK #(This is Status-Line sent by the server)

قسمت هدر ها

قسمت هدر ها اطلاعات مورد نیاز در مورد responce یا request یا object send in the message body رو فراهم می کنه و ۴ نوع هدر http داریم :
۱- General-header
۲- Request-header
۳- Response-header
۴- Entity-header: که meta information برای body یا در صورتی که body ای نیست اطلاعات در مورد resource ای که request شده رو میده.
همه ی انواع هدر های بالا از یک فرمت عمومی استفاده می کنند :

message-header = field-name ":" [ field-value ]

قسمت body

قسمت body برای یک http message یک قسمت دلخواه است اما اگر وجود داشته باشد اطلاعاتی در مورد request یا resource به ما می دهد و دقت کنید که معمولا اگر قسمت body وجود داشته باشد هدر های Content-Type و Content-Length در مورد قسمت body توضیح می دهند.

HTTP Request

فرمت http request همان فرمت http request message است که قبلا توضیح دادیم همانطور که قبلا توضیح دادیم قسمت اولش Request-Line می باشد که دارای فرمت زیر است :

Request-Line = Method SP Request-URI SP HTTP-Version CRLF

این فرمت می گه اول متد قرار می گیره (که مثلا می تونه GET یا POST یا DELETE یا PUT یا HEAD یا TRACE یا OPTIONS یا CONNECT باشه) بعدش SP که یک فاصله هستش بعدش REQUEST URI رو داریم که سه حالت داره: 
۱- * : که به هیچ resource خاصی اشاره نمی کنه بلکه کلا به خود سرور اشاره داره و فقط وقتی قابلیت استفاده داره که از متدی استفاده کنیم که لزوما نیاز به یک resource نداشته باشه

OPTIONS * HTTP/1.1

۲- absoluteURI : وقتی استفاده می شه http request به یک پروکسی فرستاده می شه مثل:

GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1

۳- و معمول ترین شکل request-uri حالتی است که برای مشخص کردن یک resource روی یک سرور یا gateway استفاده می شود. مثل:

GET /pub/WWW/TheProject.html HTTP/1.1

Host: www.w3.org

دقت کنید که absolute path نمیتونه خالی باشه و اگه original URI خالی باشه باید به شکل "/" داده بشود.

Request Header Fields

1- Accept-Charset
2- Accept-Encoding
3- Accept-Language
4- Authorization
5- Expect
6- Form
7- Host
8- if-Match
9- if-Modified-Since
10- if-None-Match
11- if-Range
12- if-Unmodified-Since
13- Max-Forwards
14- Proxy-Authorization
15- Range
16- Referer
17- TE
18- User-Agent
* You can introduce your custom fields

# Request Message example 1
GET /hello.htm HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.tutorialspoint.com
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
# Request Message example 2 - The following example shows how to send form data to the server using request message body
POST /cgi-bin/process.cgi HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.tutorialspoint.com
Content-Type: application/x-www-form-urlencoded
Content-Length: length
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

licenseID=string&content=string&/paramsXML=string
# Request Message example 3 - The following example shows how you can pass plain XML to your web server
POST /cgi-bin/process.cgi HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.tutorialspoint.com
Content-Type: text/xml; charset=utf-8
Content-Length: length
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://clearforest.com/">string</string>

HTTP - Responses

Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
HTTP-Version = HTTP/1.1
Status-Code = xxx
# 1xx: Informational
# 2xx: Success
# 3xx: Redirection
# 4xx: Client Error
# 5xx: Server Error

Response Header Fields

1- Accept-Ranges
2- Age
3- ETag
4- Location
5- Proxy-Authenticate
6- Retry-After
7- Server
8- Vary
9- WWW-Authenticate
*You can introduce your custom fields in case you are going to write your own custom Web Client and Server.

examples

# Response Message example 1 - HTTP response for a request to fetch the hello.htm page
HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
Content-Length: 88
Content-Type: text/html
Connection: Closed

<html>
<body>
<h1>Hello, World!</h1>
</body>
</html>
# Response Message example 2 - The following example shows an HTTP response message displaying error condition when the web server could not find the requested page
HTTP/1.1 404 Not Found
Date: Sun, 18 Oct 2012 10:36:20 GMT
Server: Apache/2.2.14 (Win32)
Content-Length: 230
Connection: Closed
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head>
   <title>404 Not Found</title>
</head>
<body>
   <h1>Not Found</h1>
   <p>The requested URL /t.html was not found on this server.</p>
</body>
</html>
# Response Message example 3 - Following is an example of HTTP response message showing error condition when the web server encountered a wrong HTTP version in the given HTTP request
HTTP/1.1 400 Bad Request
Date: Sun, 18 Oct 2012 10:36:20 GMT
Server: Apache/2.2.14 (Win32)
Content-Length: 230
Content-Type: text/html; charset=iso-8859-1
Connection: Closed

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head>
   <title>400 Bad Request</title>
</head>
<body>
   <h1>Bad Request</h1>
   <p>Your browser sent a request that this server could not understand.</p>
   <p>The request line contained invalid characters following the protocol string.</p>
</body>
</html>