Reputation: 377
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
Reputation: 811
There is another easy way to do it.
req.Header["myheader"] = []string{"myheadervalue"}
Upvotes: 4
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
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