从 ReadCloser 发送 HTTP Put 主体永远不会结束
Sending HTTP Put body from ReadCloser never ends
目标
我想将数据从阅读器发送到我的服务器。 (在例子中 a NopCloser
,稍后它将是一个 exec.Command
的 Stdout)
问题
请求永无止境。即使我手动关闭 cmdOut,程序也永远不会结束。具体:它永远不会到达 "Request Done" 行并且永远不会调用 wg.Done()
陷阱
所有数据都正确发送到服务器(即使使用 exec.Command
Stdout)。但是 http.DefaultClient.Do
似乎在 ReadCloser
为空(并在主例程中关闭)后仍在监听
代码
cmdOut := ioutil.NopCloser(bytes.NewBuffer([]byte("Hallo DU")))
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
// localhost:1234 is a netcat server: "nc -l -p 1234"
req, _ := http.NewRequest("PUT", "http://localhost:1234", cmdOut)
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Println(err)
return
}
// Never reaches this line
log.Println("Request Done")
}()
cmdOut.Close()
log.Println("Wait for go routine")
wg.Wait()
log.Println("DONE")
问题不在于发送请求,而在于接收响应。
您正在向 netcat 发送您的请求,netcat 只会丢弃该请求,而不会执行任何其他操作。这让 HTTP 客户端库等待 HTTP 响应,但它永远不会到来。
解决方案是与实际的 HTTP 服务器通信。
目标
我想将数据从阅读器发送到我的服务器。 (在例子中 a NopCloser
,稍后它将是一个 exec.Command
的 Stdout)
问题
请求永无止境。即使我手动关闭 cmdOut,程序也永远不会结束。具体:它永远不会到达 "Request Done" 行并且永远不会调用 wg.Done()
陷阱
所有数据都正确发送到服务器(即使使用 exec.Command
Stdout)。但是 http.DefaultClient.Do
似乎在 ReadCloser
为空(并在主例程中关闭)后仍在监听
代码
cmdOut := ioutil.NopCloser(bytes.NewBuffer([]byte("Hallo DU")))
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
// localhost:1234 is a netcat server: "nc -l -p 1234"
req, _ := http.NewRequest("PUT", "http://localhost:1234", cmdOut)
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Println(err)
return
}
// Never reaches this line
log.Println("Request Done")
}()
cmdOut.Close()
log.Println("Wait for go routine")
wg.Wait()
log.Println("DONE")
问题不在于发送请求,而在于接收响应。
您正在向 netcat 发送您的请求,netcat 只会丢弃该请求,而不会执行任何其他操作。这让 HTTP 客户端库等待 HTTP 响应,但它永远不会到来。
解决方案是与实际的 HTTP 服务器通信。