Search code examples
httphttp-headershttpwebrequestcontent-length

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?


Solution

  • 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.