Content-Length header not set in Golang http client request using PUT method
I am using Golang 1.4.2 (built from source) and when I try to make an HTTP PUT request via http.Client.Do () the Content-Length header is missing from the request. All my other headers have been sent ... Am I doing something wrong? When I make the same request via CURL, the content length header is sent. My requests go to the etcd server, which sets all my keys to empty values. Although somewhat novel, it's hardly helpful. :)
http://play.golang.org/p/pIoB--bXUT
package main
import (
"bytes"
"fmt"
"net/http"
"net/http/httputil"
"net/url"
"strconv"
)
func main() {
put := url.Values{}
put.Set("value", "WHOAH here is my stuff")
put.Add("ttl","")
encode := put.Encode()
req, _ := http.NewRequest("PUT", "http://localhost:2379/v2/keys/somekey", bytes.NewBufferString(encode))
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
req.Header.Add("Content-Length", strconv.Itoa(len(encode)))
req.Header.Add("X-Content-Length", strconv.Itoa(len(encode)))
dump, _ := httputil.DumpRequest(req, true)
fmt.Println(string(dump))
}
gives
PUT /v2/keys/somekey HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
X-Content-Length: 33
ttl=&value=WHOAH+here+is+my+stuff
source to share
I was wrong about Content-Length not being sent, I just didn't see it when using httputil.DumpRequest.
The solution here was to use httputil.DumpRequestOut which renders the Content-Length header correctly (and others). This means that something else is happening to my program which causes etcd to set to empty values. If I figure it out, I'll update this solution as well.
source to share
If you say that the header is Content-Length
not set (in fact, it is set automatically, it just does not appear when you reset it), it works as designed because the following headers are excluded in httputil.DumpRequest()
, even if you set them explicitly:
-
Host
-
Content-Length
-
Transfer-Encoding
-
Trailer
see line 317 go/src/net/http/httputil/dump.go
.
If you submit a request and then drop it, you will see the header Content-Length
sent along with User-Agent
and Accept-Encoding
.
source to share