2014-12-12 1 views
1

Я пишу веб-приложение в Go. У меня есть http.Handler, который делает некоторые вещи и пишет ответ.Является ли http.Request.Body забуференным в голанге?

func (h *MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { 
    // do some stuff 
} 

До сих пор я не делаю ничего другого между POST и GET-запросами, что хорошо в обычном случае.

Но POST имеют Request.Body.

Что происходит с данными POST? Оставляет ли он буфер? Вызывается ли мой обработчик немедленно или он ждет, пока POST будет полностью получен?


Чтобы обеспечить некоторый контекст, я специально обеспокоенный с slow loris атакой.

Я знаю, что у go есть очень низкие накладные расходы, но как насчет POSTing больших объемов данных? Если я получаю POST 9Mb данных, а затем загружаю 1 байт за один раз, как это происходит? Он запомнил память 9Mb? Если я сделаю 10 000 таких запросов, это может быть 90 ГБ буферизованных данных POST. Моему серверу это не понравится.

ответ

1

Существует некоторая буферизация, но обработчик вызывается немедленно, и вам решать прочитать запрос.Body.

Что касается потребления ресурсов от медленных клиентов и, в частности, атак, таких как slowloris, самым простым решением является установка ReadTimeout на вашем сервере.

+0

Так что, если я ничего не делаю с запросом.Body (как мой наивный обработчик) и начнет писать ответ, то удаляет эти request.Body байты? Я думал, что весь запрос нужно прочитать, прежде чем вы сможете начать писать на TCP-соединение. – chowey

+0

Нет, клиент будет заблокирован при заполнении буферов, а обратное давление TCP перестанет их отправлять. Сервер go с радостью напишет ответ для вас немедленно, но большинство клиентов не читают одновременно и не будут видеть его, пока они пытаются отправить. Если вы ожидаете тела, вы должны прочитать его, если хотите, чтобы клиенты получили ответ. – JimB

+0

Спасибо, я думаю, что помогает. Итак, без ReadTimeout, все как раз какие-то тупики? Клиент ожидает получения сервера, и сервер ожидает получения клиента? А на сервере есть несколько kB в буфере где-то? – chowey

Смежные вопросы