Заголовок 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
,