一共只有两种HTTPmessages:
HTTP-message = Request | Response ; HTTP/1.1 messages
Message的格式如下:
generic-message = start-line
*(message-header CRLF)
CRLF
[ message-body ]
start-line = Request-Line | Status-Line
Request-Line是给请求用的,Status-Line是给响应用的。服务器应该忽略start-line前任何的空格或多余的CRLF,但HTTP/1.0没有,在HTTP/1.1已经解决了。
message-header = field-name ":" [ field-value ]
field-name = token
field-value = *(field-content | LWS )
field-content = <theOCTETs making up the field-value andconsisting
of either*TEXT or combinations of token, separators,
andquoted-string>
LWS:linear white space。
根据message的内容和传送方向,又分为general-header,request-header, response-header, entity-header,但它们的格式都是一样的。
Message-body在通常情况下和entity-body是一样的,但如果message有Transfer-Encoding属性,entity-body会被使用Transfer-Encoding编码:
message-body = entity-body | <entity-bodyencoded as per transfer- encoding>
注意:Transfer-Encoding是message的属性,不是entity的。
Transfer-length是message-body的长度,但它的长度按下面的条件计算:
1. Response message没有message-body(1xx, 204,304等),这个message会被终止;忽略entity-length。
2. 如果有Transfer-Encoding,而且值不是”identity”,则transfer-length是经过Transfer-Encoding后的长度。
3. 如果有Content-Length,它同时表示的是entity-length和transfer-length(也就是说这两个的值是一样的)。如果entity-length和transfer-length不同,是不可以发送Content-Length的。如果Content-Length和Transfer-Encoding这两个header-field都有,则忽略Content-Length。
4. 如果message使用了”multipart/byteranges”,transfer-length由media的大小决定。
为了兼容HTTP/1.0,HTTP/1.1请求一定包含了一个合法的Content-Length头字段,除非已知服务器是HTTP/1.1兼容的。如果一个请求包含了message-body而且Content-Length没有给,但服务器没法判断message的长度则返回400(bad request);如果服务器坚持要一个合法的Content-Length,则返回411。
general-header = Cache-Control
| Connection
| Date
|Pragma
|Trailer
|Transfer-Encoding
|Upgrade
| Via
|Warning
Request =Request-Line
*((general-header
|request-header
|entity-header ) CRLF)
CRLF
[message-body ]
Request-Line = Method SP Request-URI SP HTTP-Version CRLF
Method = "OPTIONS"
|"GET"
| "HEAD"
|"POST"
| "PUT"
|"DELETE"
| "TRACE"
|"CONNECT"
|extension-method
extension-method =token
OPTIONS:: Response to are notcacheable。
GET :Responseis cacheable if and only if it meets the requirements for HTTP caching.
HEAD:服务器不需要在响应中有message-body。
POST:响应一般不是cacheable,除非响应包含适当的Cache-Control或Expires头字段。但303响应是用来指示用户代理去获取一个可以缓存的资源。
DELETE:一般用来删除源服务器上的某个资源,这个method的响应不能cacheable。
PUT:用来保存entity在指定的Request-URI。
这个请求不能有entity,而且和Max-Forwards这个请求头字段有关。使用这个method,可以在客户端看到在请求链的其它端点收到了什么。尤其是”Via”这个头字段,可以跟踪请求的路径。”Max-Forwards”可以限制请求链的长度。
这个是保留给代理用的,用来动态控制使其成为一个tunnel(如SSLtuneling)。
Request-URI = "*" | absoluteURI | abs_path |authority
“*”号表示请求指向服务器本身,典型例子是:
OPTIONS * HTTP/1.1
把请求的其它相关信息,以及客户端自身的信息传送到服务器。
request-header =Accept
|Accept-Charset
|Accept-Encoding
|Accept-Language
|Authorization
|Expect
|From
|Host
|If-Match
|If-Modified-Since
| If-None-Match
|If-Range
|If-Unmodified-Since
|Max-Forwards
|Proxy-Authorization
|Range
|Referer
|TE
|User-Agent
Response = Status-Line
*((general-header
|response-header
|entity-header ) CRLF)
CRLF
[ message-body ]
Status-Line =HTTP-Version SP Status-Code SP Reason-Phrase CRLF
- 1xx: Informational - Request received,continuing process
- 2xx: Success - The action wassuccessfully received, understood, andaccepted
- 3xx: Redirection - Further action mustbe taken in order to complete therequest
- 4xx: Client Error - The requestcontains bad syntax or cannot befulfilled
- 5xx: Server Error - The server failedto fulfill an apparently valid request
response-header =Accept-Ranges
|Age
|ETag
|Location
|Proxy-Authenticate
|Retry-After
|Server
|Vary
| WWW-Authenticate
entity-header = Allow
|Content-Encoding
|Content-Language
|Content-Length
|Content-Location
|Content-MD5
|Content-Range
|Content-Type
|Expires
|Last-Modified
|extension-header
extension-header= message-header
entity-body = *OCTET
有message-body才可能有entity-body。Entity-body是从message-body中解码了Transfer-Encoding后得到的。因此,如果没有Transfer-Encoding,则entity-body就是message-body。
entity-body :=Content-Encoding( Content-Type( data ) )
实体中的数据类型,由entity header field中的Content-Type和Content-Encoding决定。
Entity-length是message-body被应用Transfer-coding之前的长度。
这个中间响应是通知客户端,请求的初始部分已经被服务器接收了,客户端应该继续发送请求的剩余部分。
· GET 对应请求的entity已经在响应中被返回了。
· HEAD 对应请求的entity-header字段已经在响应中了,但没有message-body。
· POST 返回的entity描述了这个action的结果。
· TRACE 返回的entity包含了被服务器接收的请求信息。
表明请求已经完成,并且在服务器产生了一个新的资源。这个新资源可以通过响应中返回URI引用。
请求已经被接受了,但还在处理中。
请求已经完成,但没有返回。这个时候页面不应该有刷新。
请求已经完成,用户代理应该重新刷新document视图。
请求的资源有多个表现,用户选择其中一个偏爱的表现,用户代理可能自动跳转。
请求的资源已经赋予了一个新的URI。如果是GET或HEAD之外的请求收到了301状态码,用户代理不能自动跳到新的请求地址。
请求的资源必须通过Location头字段指定的代理访问。
请求无法被服务器识别。
请求需要验证,响应必须包含WWW-Authenticate头字段。
服务器已经懂了这个请求,但拒绝完成。
服务器没有找到处理Request-URI的方法。
发送请求的method不劫持,可能是拼写错误。
与401相似,但这个是要求首先客户端过了代理的验证。
服务器拒绝接受请求,因为没有定义Content-Length。
服务器遇到了意外,拒绝完成请求。
服务器不支持要求的功能来完成这个请求。
服务器超负荷或服务器在维护中,当前无法完成该请求。