Отправка тела HTTP Put из ReadCloser никогда не заканчивается

цель

Я хочу отправить данные на мой сервер с более детального чтения. (В примере 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 ответ

Решение

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

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

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

Другие вопросы по тегам