从ReadCloser发送HTTP Put正文永无止境

时间:2019-04-04 08:22:33

标签: http go go-http

目标

我想从阅读器发送数据到我的服务器。 (在示例NopCloser中,稍后将是exec.Command的标准输出)

问题

请求永无止境。即使我手动关闭了cmdOut,程序也永远不会结束。具体:它永远不会到达“请求完成”行,并且永远不会调用wg.Done()

陷阱

所有数据已正确发送到服务器(即使使用exec.Command标准输出)。但是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")

1 个答案:

答案 0 :(得分:1)

问题不是发送您的请求-而是收到响应。

您正在将您的请求发送到netcat,它只会丢弃该请求,而不会执行其他任何操作。这使HTTP客户端库等待HTTP响应,但永远不会出现。

解决方案是与实际的HTTP服务器对话。