我在Go中编写了一个Web应用程序。我有一个http.Handler做一些东西并写一个回复。
func (h *MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
// do some stuff
}
到目前为止,我在POST和GET请求之间没有做任何不同的事情,这在通常情况下都没问题。
但是POST有一个Request.Body
。
该POST数据会怎样?去缓冲吗?我的处理程序是立即调用的,还是等到POST完全收到?
为了提供一些背景信息,我特别关注slow loris攻击。
我知道go的连接开销非常低,但是发布大量数据呢?如果我发布9Mb的数据,然后一次换勺1个字节,怎么办呢?它是否在内存中缓冲了9Mb?如果我做了10,000个这样的请求,那可能是90Gb的缓冲POST数据。我的服务器非常不喜欢。
答案 0 :(得分:1)
涉及一些缓冲,但是立即调用处理程序,由你来阅读请求.Body。
对于慢速客户端的资源消耗以及特别是slowloris等攻击,最简单的解决方案是在服务器上设置ReadTimeout。