5

I am trying to set all-lowercase headers in a golang program and CanonicalMIMEHeaderKey is uppercasing the first letter. The API I am consuming only takes this particular header in all-lowercase at the moment. It's not an option to change that at this point in time. Is there a way to override that?

http://golang.org/pkg/net/textproto/#CanonicalMIMEHeaderKey

So for example, the header I want to add is:

req.Header.Add("myheader", "myheadervalue")

But it comes out as:

req.Header.Add("Myheader", "myheadervalue")

Can anyone help please?

Thanks

1
  • Apparently the OP got an answer that solved their problem, but there are cases where httputil simply won't allow you to control the case (ReverseProxy). The rationale that I have seen is that HTTP/2 requires lowercase -- therefore, they needn't bother letting you control this in HTTP/1 either. Commented Nov 24, 2019 at 16:36

3 Answers 3

12

I do not see a way to circumvent this but if you really have to use lower-case header names, then you can work around this by creating your own http.Header with lower-case keys. Example (on play):

import "fmt"
import "strings"
import "net/http"

// ...

req, _ := http.NewRequest("GET", "http://foo", nil) 
req.Header.Add("myheader", "myheadervalue")

lowerCaseHeader := make(http.Header)

for key, value := range req.Header {
    lowerCaseHeader[strings.ToLower(key)] = value
}

req.Header = lowerCaseHeader
Sign up to request clarification or add additional context in comments.

Comments

9

I ran into a similar problem and solved it a slightly different way that I thought might be helpful for others coming to this post in the future...

Since http.Header is just a map[string][]string under the hood, you can create an http.Header then assign it to the request's header. Because this does not use the Add nor the Set method, this will preserve casing.

Like so:

import "net/http"

// ...

headers := http.Header{
            "my-lowercase-header": []string{"myvalue1"},
            "Accept": []string{"text/plain", "text/html"},
        }

client := &http.Client{}

req, err := http.NewRequest("GET", "http://www.example.com", nil)
if err != nil {
    panic(err)
}

req.Header = headers

resp, err := client.Do(req)

Comments

4

There is another easy way to do it.

req.Header["myheader"] = []string{"myheadervalue"}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.