Skip to content

Preserve Case When Working With HTTP Headers in Go

Dec 27, 2023 · 1 min read

When you’re manipulating the HTTP headers with methods like Set(), Add(), etc., in Go, you’ll find that they’re automatically canonicalized. Canonicalization converts the first letter and any letter following a hyphen to uppercase, and every other letters to lowercase.

For example:

w.Header().Set("my-api-key", "secret-key")

Will be transformed into this:

My-Api-Key: secret-key

This is caused by Go passing your key through CanonicalMimeHeaderKey before calling your methods.

This is fine and all as HTTP headers are case-insensitive. But sometimes, you might find yourself in a situation where you’re forced to work with case-sensitive headers.

In that case, you can modify the HTTP headers like this:

w.Header()["my-api-key"] = []string{"secret-key"}

This is possible because the Header’s type is actually map[string][]string, meaning it’s just a map with key of type string and value of type []string.