Я пишу веб-приложение в 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. Моему серверу это не понравится.
Так что, если я ничего не делаю с запросом.Body (как мой наивный обработчик) и начнет писать ответ, то удаляет эти request.Body байты? Я думал, что весь запрос нужно прочитать, прежде чем вы сможете начать писать на TCP-соединение. – chowey
Нет, клиент будет заблокирован при заполнении буферов, а обратное давление TCP перестанет их отправлять. Сервер go с радостью напишет ответ для вас немедленно, но большинство клиентов не читают одновременно и не будут видеть его, пока они пытаются отправить. Если вы ожидаете тела, вы должны прочитать его, если хотите, чтобы клиенты получили ответ. – JimB
Спасибо, я думаю, что помогает. Итак, без ReadTimeout, все как раз какие-то тупики? Клиент ожидает получения сервера, и сервер ожидает получения клиента? А на сервере есть несколько kB в буфере где-то? – chowey