Неверное чтение на закрытом теле в Google App Engine - PullRequest
0 голосов
/ 02 ноября 2018

При отправке POST в веб-приложение Go в Google App Engine появляется ошибка 500. В логах GAE ошибка:

http: invalid Read on closed Body

Обработчик в веб-приложении передается от читателя *http.Request.Body и записывает пошагово в http.ResponseWriter.

Считыватель Body неожиданно закрывается перед тем, как полностью его прочитать. Почему это случилось?

1 Ответ

0 голосов
/ 02 ноября 2018

Сервер HTTP / 1.x в Go по замыслу закрывает *http.Request.Body после первого сброса http.ResponseWriter. См. этот выпуск GitHub для объяснения.

Одновременно чтение и запись хороши в теории - они не определены с точки зрения стандартов - но Go не справляется с этим. Если код начинает писать в ответ до того, как тело будет полностью израсходовано, есть большая вероятность, что тело будет неожиданно закрыто.

Чтобы избежать этого, вы можете:

  • Пишите в bytes.Buffer вместо непосредственно в http.ResponseWriter. Убедившись, что тело полностью прочитано, вы можете сразу же записать буфер в ответ, например, используя bytes.Buffer.WriteTo или, возможно, io.Copy . Вот пример .

  • Или, вы можете использовать ioutil.ReadAll , чтобы прочитать все тело перед любыми записями.

(В обоих вышеперечисленных случаях может быть немного больше давления памяти, чем вы хотите, поскольку входящие или исходящие байты собираются в памяти вместо потоковой передачи, но это кажется неизбежным.)

(Это не относится к App Engine.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...