Are HTTP headers case-sensitive?

HttpHttp Headers

Http Problem Overview


In a blog post I use the following PHP to set the content-type of a response:

header('content-type: application/json; charset=utf-8');

I just got a comment on that post saying that content-type needs to be capitalized, Content-type. Is this correct? It seems to work for me with all lower-case, and I assumed the HTTP headers were case-insensitive. Or does it just work because browsers are nice?

Http Solutions


Solution 1 - Http

Header names are not case sensitive.

From RFC 2616 - "Hypertext Transfer Protocol -- HTTP/1.1", Section 4.2, "Message Headers":

> Each header field consists of a name followed by a colon (":") and the field value. Field names are case-insensitive.

The updating RFC 7230 does not list any changes from RFC 2616 at this part.

Solution 2 - Http

HTTP header names are case-insensitive, according to RFC 2616:

4.2: > Each header field consists of a name followed by a colon (":") and the field value. Field names are case-insensitive.

(Field values may or may not be case-sensitive.)

If you trust the major browsers to abide by this, you're all set.


BTW, unlike most of HTTP, methods (verbs) are case sensitive:

5.1.1 Method

> The Method token indicates the > method to be performed on the
> resource identified by the > Request-URI. The method is > case-sensitive. > > Method = "OPTIONS" ; Section 9.2 > | "GET" ; Section 9.3 > | "HEAD" ; Section 9.4 > | "POST" ; Section 9.5 > | "PUT" ; Section 9.6 > | "DELETE" ; Section 9.7 > | "TRACE" ; Section 9.8 > | "CONNECT" ; Section 9.9 > | extension-method > extension-method = token

Solution 3 - Http

tldr; both HTTP/1.1 and HTTP/2 headers are case-insensitive.

According to RFC 7230 (HTTP/1.1):

> Each header field consists of a case-insensitive field name > followed by a colon (":"), optional leading whitespace, the field > value, and optional trailing whitespace.

https://www.rfc-editor.org/rfc/rfc7230#section-3.2

Also, RFC 7540 (HTTP/2):

> Just as in HTTP/1.x, header field names are strings of ASCII
> characters that are compared in a case-insensitive fashion.

https://www.rfc-editor.org/rfc/rfc7540#section-8.1.2

Solution 4 - Http

header('Content-type: image/png') did not work with PHP 5.5 serving IE11, as in the image stream was shown as text

header('Content-Type: image/png') worked, as in the image appeared as an image

Only difference is the capital 'T'.

Solution 5 - Http

They are not case sensitive. In fact NodeJS web server explicitly converts them to lower-case, before making them available in the request object.

> It's important to note here that all headers are represented in > lower-case only, regardless of how the client actually sent them. This > simplifies the task of parsing headers for whatever purpose.

Solution 6 - Http

The RFC for HTTP (as cited above) dictates that the headers are case-insensitive, however you will find that with certain browsers (I'm looking at you, IE) that capitalizing each of the words tends to be best:

Location: http://stackoverflow.com

Content-Type: text/plain

vs

location: http://stackoverflow.com

content-type: text/plain

This isn't "HTTP" standard, but just another one of the browser quirks, we as developers, have to think about.

Solution 7 - Http

officially, headers are case insensitive, however, it is common practice to capitalize the first letter of every word.
but, because it is common practice, certain programs like IE assume the headers are capitalized.
so while the docs say the are case insensitive, bad programmers have basically changed the docs.

Solution 8 - Http

the Headers word are not case sensitive, but on the right like the Content-Type, is good practice to write it this way, because its case sensitve. like my example below

headers = headers.set('Content-Type'

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSvishView Question on Stackoverflow
Solution 1 - HttpIgnacio Vazquez-AbramsView Answer on Stackoverflow
Solution 2 - HttpLightness Races in OrbitView Answer on Stackoverflow
Solution 3 - HttpAfshin MehrabaniView Answer on Stackoverflow
Solution 4 - HttpRudiger W.View Answer on Stackoverflow
Solution 5 - HttpjayarjoView Answer on Stackoverflow
Solution 6 - HttpRobert LernerView Answer on Stackoverflow
Solution 7 - HttpGideonMaxView Answer on Stackoverflow
Solution 8 - HttpPPKView Answer on Stackoverflow