4.1 消息类型
消息的类型分为:请求消息和响应消息。 HTTP-message = Request | Response ; HTTP/1.1 messages,任何类型的消息都是由开始行,0个或是多个头域,一个空行(CRLF)用来终止头信息,消息实体(也可能没有)。
generic-message = start-line *(message-header CRLF) CRLF [ message-body ] start-line = Request-Line | Status-Line 一个服务器在处理请求的时候,应该能够自动的过滤CRLF这样的空行。 一般一个存在问题的HTTP/1.0的客户端会在POST请求后,添加额外的CRLF,一个HTTP/1.1客户端不应该在请求前和请求后添加不必要的CRLF 4.2消息头 消息头有常用头、请求头、响应头和消息头几种。每一个头域由头名 :值域 组成,头的名不区分大小写的。
message-header = field-name ":" [ field-value ] field-name = token field-value = *( field-content | LWS ) field-content = <the OCTETs making up the field-value and consisting of either *TEXT or combinations of token, separators, and quoted-string> 头域的顺序是不强制要求的,但是最好是按照:常用头域、请求|响应头域,实体头域。 4.3 消息主体 通常,消息主体和实体是等价的,除非头域指定了 transfer-coding,对于响应消息,有没有消息实体是由请求方法和响应状态来决定的。HEAD请求不应该包含任何消息主体 哪怕是消息头域。另外,所有1XX,202(无内容),304(没有修改)的状态,都不能包含消息主体。其他任何情况都必须要包含消息主体,哪怕长度为0. 4.4 消息长度 当消息主体出现在消息中时候,一条信息的传输长度就是信息主体的长度,他由以下条件决定: 1.任何不包含消息主体的消息总是被头域得第一个空行CRLF终止。 2.如果Transfer-Encoding头域(见14.41节)出现,并且它的域值是非”“dentity”传输编码值,那么传输长度(transfer-length)被“块”(chunked)传输编码定义,除非消息因为通过 关闭连接而结束。 3.。如果出现Content-Length头域(属于实体头域)(见14.13节),那么它的十进制值(以字节表示)即代表实体主体长度(entity-length)。如果一个消息即存在传输译 码(Transfer-Encoding)头域并且也Content-Length头域,后者会被忽略。 4.如果消息用到媒体类型“multipart/byteranges”,并且传输长度(transfer-length)另外也没有指定,那么这种自我定界的媒体类型定义了传输长度(transfer-length)。 5.。通过服务器关闭连接能确定消息的传输长度。(请求端不能通过关闭连接来指明请求消息体的结束,因为这样可以让服务器没有机会继续给予响应)。 4.5 常用头域 有一些头域即适用于请求消息也适用于响应消息,但是这些头域并不适合传输实体。这些头域只能应用于传输消息