Mat*_*man 0 google-app-engine http go
在Google App Engine上向Go网络应用提交POST时,我收到500错误.在GAE日志中,错误是:
http: invalid Read on closed Body
Web应用程序中的处理程序从*http.Request.Body阅读器流出,并逐步写入http.ResponseWriter.
Body在完全阅读之前,读者意外关闭.为什么会这样?
按照设计,Go中的HTTP/1.x服务器在*http.Request.Body第一次刷新之后关闭http.ResponseWriter.有关说明,请参阅此GitHub问题.
同时阅读和写作在理论上是好的 - 从标准的角度来看它没有明确规定 - 但Go并没有处理它.如果代码在Body被完全消耗之前开始写入Response,那么Body很可能会意外关闭.
为避免这种情况,您可以:
写入一个bytes.Buffer而不是直接进入http.ResponseWriter.在确定完全读取Body之后,您可以一次性将缓冲区写入响应中,例如使用bytes.Buffer.WriteTo或者io.Copy.这是一个例子.
或者,您可以在任何写入之前使用ioutil.ReadAll来读取整个主体.
(在上述两种情况下,可能存在比您想要的更多的内存压力,因为传入或传出的字节都是在内存中而不是流式传输的,但似乎不可避免.)
(此行为不适用于App Engine.)