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

      

+3


source to share


2 answers


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.

+5


source


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

.

+3


source







All Articles