Target
Я хочу отправить данные на мой сервер с помощью устройства чтения. (В примере NopCloser
, позже это будет стандартный вывод exec.Command
)
Проблема
Запрос никогда не заканчивается. Даже если я вручную закрою cmdOut, программа никогда не заканчивается. Конкретный: он никогда не достигает линии «Запрос выполнен» и там никогда не вызывает wg.Done()
Gotchas
Все данные правильно отправляются на сервер (даже при использовании 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")