Отправка тела HTTP Put из ReadCloser никогда не заканчивается - PullRequest
0 голосов
/ 04 апреля 2019

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

1 Ответ

1 голос
/ 04 апреля 2019

Проблема не в отправке вашего запроса, а в получении ответа.

Вы отправляете запрос в netcat, который просто отбрасывает запрос и больше ничего не делает.Это оставляет клиентскую библиотеку HTTP в ожидании ответа HTTP, который никогда не приходит.

Решение состоит в том, чтобы общаться с реальным сервером HTTP.

...