egreene
egreene

Reputation: 377

Add unaltered lowercase headers to golang http request

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

Upvotes: 4

Views: 8531

Answers (3)

Sreenidhi Sreesha
Sreenidhi Sreesha

Reputation: 811

There is another easy way to do it.

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

Upvotes: 4

rclod
rclod

Reputation: 131

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)

Upvotes: 9

nemo
nemo

Reputation: 57609

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

Upvotes: 12

Related Questions