When sending a HTTP Response, should I conclude the response body (the content itself) with a newline (line separator)?
And if so, should I include the size of the line separator (I guess increase the count with 2 if sending \r\n) in the Content-Length?
HTTP headers are used to pass additional information in HTTP request or HTTP response. HTTP Content-Length entity-header is used to indicate the size of entity-body in decimal no of octets i.e. bytes and sent it to the recipient. It is a forbidden header name. Basically it is the number of bytes of data in the body of the request or response.
The status line in an HTTP response consists of 3 parts-HTTP Protocol Version; Status Code; Reason Phrase; It is the first line in the response section. In addition to that, below is the Status-Line for the response we received to our request. HTTP Protocol Version
Additionally, the client should interpret it in the same manner. Content-Length: defines the length of the data, i.e., the number of bytes in the response body. The response body consists of the resource data requested by the client.
HTTP Response contains the information requested by the Client. For example, the request to Weather Web Service made in the HTTP Request tutorial will contain the weather details of the location. Just like HTTP Request, HTTP Response also has the same structure: Status Line. Headers, 0 or more Headers in the request.
When sending a HTTP Response, should I conclude the response body (the content itself) with a newline (line separator)? And if so, should I include the size of the line separator (I guess increase the count with 2 if sending \r\n) in the Content-Length?
NO!
The resource data that is being sent in the HTTP response's message-body may include its own newlines (as is common in text files, etc), but that is arbitrary data as far as HTTP itself is concerned. Newlines inside the message-data are NOT part of the HTTP response itself. The HTTP response is terminated by reaching the Content-Length
(which is the byte size of the resource data) unless Transfer-Encoding
is used (in which case Content-Length
is ignored, and the chunked
encoding is used, which is self-terminating), or the connection is closed at the end of the response. This is described in RFC 2616 Section 4.4:
4.4 Message Length The transfer-length of a message is the length of the message-body as it appears in the message; that is, after any transfer-codings have been applied. When a message-body is included with a message, the transfer-length of that body is determined by one of the following (in order of precedence): 1.Any response message which "MUST NOT" include a message-body (such as the 1xx, 204, and 304 responses and any response to a HEAD request) is always terminated by the first empty line after the header fields, regardless of the entity-header fields present in the message. 2.If a Transfer-Encoding header field (section 14.41) is present and has any value other than "identity", then the transfer-length is defined by use of the "chunked" transfer-coding (section 3.6), unless the message is terminated by closing the connection. 3.If a Content-Length header field (section 14.13) is present, its decimal value in OCTETs represents both the entity-length and the transfer-length. The Content-Length header field MUST NOT be sent if these two lengths are different (i.e., if a Transfer-Encoding header field is present). If a message is received with both a Transfer-Encoding header field and a Content-Length header field, the latter MUST be ignored. 4.If the message uses the media type "multipart/byteranges", and the transfer-length is not otherwise specified, then this self- delimiting media type defines the transfer-length. This media type MUST NOT be used unless the sender knows that the recipient can parse it; the presence in a request of a Range header with multiple byte- range specifiers from a 1.1 client implies that the client can parse multipart/byteranges responses. A range header might be forwarded by a 1.0 proxy that does not understand multipart/byteranges; in this case the server MUST delimit the message using methods defined in items 1,3 or 5 of this section. 5.By the server closing the connection. (Closing the connection cannot be used to indicate the end of a request body, since that would leave no possibility for the server to send back a response.) For compatibility with HTTP/1.0 applications, HTTP/1.1 requests containing a message-body MUST include a valid Content-Length header field unless the server is known to be HTTP/1.1 compliant. If a request contains a message-body and a Content-Length is not given, the server SHOULD respond with 400 (bad request) if it cannot determine the length of the message, or with 411 (length required) if it wishes to insist on receiving a valid Content-Length. All HTTP/1.1 applications that receive entities MUST accept the "chunked" transfer-coding (section 3.6), thus allowing this mechanism to be used for messages when the message length cannot be determined in advance. Messages MUST NOT include both a Content-Length header field and a non-identity transfer-coding. If the message does include a non- identity transfer-coding, the Content-Length MUST be ignored. When a Content-Length is given in a message where a message-body is allowed, its field value MUST exactly match the number of OCTETs in the message-body. HTTP/1.1 user agents MUST notify the user when an invalid length is received and detected.
I don't see anything like this in RFC 2616:
Response = Status-Line ; Section 6.1 *(( general-header ; Section 4.5 | response-header ; Section 6.2 | entity-header ) CRLF) ; Section 7.1 CRLF [ message-body ] ; Section 7.2
There are two newlines in a response, both are at the end of the headers, not at the end of the message-body. The headers will describe how the message-body is terminated.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With