Заголовок Content-Length не установлен в запросе HTTP-клиента Golang с использованием метода PUT

Я использую Golang 1.4.2 (созданный из исходного кода), и когда я пытаюсь сделать HTTP-запрос PUT через http.Client.Do(), в запросе отсутствует заголовок Content-Length. Все остальные мои заголовки отправлены... Я что-то не так делаю? Когда я делаю тот же запрос через CURL, отправляется заголовок длины содержимого. Мои запросы отправляются на сервер etcd, который устанавливает все мои ключи в пустые значения. Хотя это несколько ново, но вряд ли это полезно.:)

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))
}

доходность

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

2 ответа

Решение

Я ошибся в том, что Content-Length не был отправлен, я просто не видел его при использовании httputil.DumpRequest.

Решением здесь было использование httputil.DumpRequestOut, который правильно показывает заголовок Content-Length (и другие). Это означает, что с моей программой происходит что-то еще, что заставляет etcd устанавливать пустые значения. Если я это выясню, я обновлю и это решение.

Если вы говорите, заголовок Content-Length не установлен (на самом деле он устанавливается автоматически, просто не отображается при выгрузке), он работает как задумано, потому что следующие заголовки исключены в httputil.DumpRequest() даже вы устанавливаете их явно:

  • Host
  • Content-Length
  • Transfer-Encoding
  • Trailer

см. строку 317 go/src/net/http/httputil/dump.go,

Если вы отправите запрос, а не сбросите его, вы увидите заголовок Content-Length отправлено вместе с User-Agent а также Accept-Encoding,

Другие вопросы по тегам