Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the correct Content-Length to set for a GET request?

When I make a POST request using the following code:

string body = "Hello World";
byte[] bytes = Encoding.ASCII.GetBytes(body);
WebRequest request = WebRequest.Create("http://internalurl");
request.Method = "POST";
request.ContentLength = bytes.Length;

I set the content length to the number of bytes POSTed. What is the correct ContentLength for a GET request?

like image 886
merlin2011 Avatar asked Dec 16 '11 22:12

merlin2011


People also ask

What is Content Length for a GET request?

The Content-Length entity-header field indicates the size of the entity-body, in decimal number of OCTETs, sent to the recipient or, in the case of the HEAD method, the size of the entity-body that would have been sent had the request been a GET.

What is Content Length in request header?

The Content-Length header indicates the size of the message body, in bytes, sent to the recipient.

How is Content Length determined?

As bytes are represented with two hexadecimal digits, one can divide the number of digits by two to obtain the content length (There are 12 hexadecimal digits in "48656c6c6f21" which equates to six bytes, as indicated in the header "Content-Length: 6" sent from the server).

Is Content Length required?

The Content-Length header is mandatory for messages with entity bodies, unless the message is transported using chunked encoding. Content-Length is needed to detect premature message truncation when servers crash and to properly segment messages that share a persistent connection.


1 Answers

Since you normally doesn't send any additional data when you do a GET request, the header Content-Length should not be sent at all.

The header Content-Length should only be included when you are sending a message-body, and the value of the header in question is always the length of this field, measured in (OCTETs) bytes.

(RFC2616) 14.13 Content-Length

The Content-Length entity-header field indicates the size of the entity-body, in decimal number of OCTETs, sent to the recipient or, in the case of the HEAD method, the size of the entity-body that would have been sent had the request been a GET.

<snip />

Applications SHOULD use this field to indicate the transfer-length of the message-body, unless this is prohibited by the rules in section 4.4.


It's (AFAIK) considered bad practice to include a message-body when doing a GET request, but when reading the HTTP RFC2616 I see nothing stating that a GET request cannot include a message-body.

Though I will assume that most web servers today will not reply with what you want them to reply if you send data in a message-body and expects it to be parsed and handled in that case.

(RFC2616) 4.3 Message Body

The message-body (if any) of an HTTP message is used to carry the entity-body associated with the request or response. The message-body differs from the entity-body only when a transfer-coding has been applied, as indicated by the Transfer-Encoding header field (section 14.41).

   message-body = entity-body
                | <entity-body encoded as per Transfer-Encoding>

Transfer-Encoding MUST be used to indicate any transfer-codings applied by an application to ensure safe and proper transfer of the message. Transfer-Encoding is a property of the message, not of the entity, and thus MAY be added or removed by any application along the request/response chain. (However, section 3.6 places restrictions on when certain transfer-codings may be used.)

The rules for when a message-body is allowed in a message differ for requests and responses.

The presence of a message-body in a request is signaled by the inclusion of a Content-Length or Transfer-Encoding header field in the request's message-headers.

A message-body MUST NOT be included in a request if the specification of the request method (section 5.1.1) does not allow sending an entity-body in requests.

A server SHOULD read and forward a message-body on any request; if the request method does not include defined semantics for an entity-body, then the message-body SHOULD be ignored when handling the request.

like image 74
Filip Roséen - refp Avatar answered Sep 21 '22 14:09

Filip Roséen - refp