Сервер HTTP / 1.x в Go по замыслу закрывает *http.Request.Body
после первого сброса http.ResponseWriter
. См. этот выпуск GitHub для объяснения.
Одновременно чтение и запись хороши в теории - они не определены с точки зрения стандартов - но Go не справляется с этим. Если код начинает писать в ответ до того, как тело будет полностью израсходовано, есть большая вероятность, что тело будет неожиданно закрыто.
Чтобы избежать этого, вы можете:
Пишите в bytes.Buffer
вместо непосредственно в http.ResponseWriter
. Убедившись, что тело полностью прочитано, вы можете сразу же записать буфер в ответ, например, используя bytes.Buffer.WriteTo или, возможно, io.Copy . Вот пример .
Или, вы можете использовать ioutil.ReadAll , чтобы прочитать все тело перед любыми записями.
(В обоих вышеперечисленных случаях может быть немного больше давления памяти, чем вы хотите, поскольку входящие или исходящие байты собираются в памяти вместо потоковой передачи, но это кажется неизбежным.)
(Это не относится к App Engine.)