Я хочу возвращать ответ «слишком большое тело» всякий раз, когда тело запроса больше установленного. Однако, когда запрос имеет заголовок «Expect», соединение может быть сброшено, если тело запроса не прочитано до конца.
I read «Golang загрузка файла: закрыть соединение, если файл слишком большой"и добавлена функция проверки. Функция проверяет request.ContentLength и возвращает ответ об ошибке, если длина больше заданной.
if !checkExpect(request.Header) { // check if "Expect" header exists
// do nothing...( this block is to take C1 coverage )
} else {
return NewError("body is too large")
}
buf := bytes.NewBuffer([]byte{})
_, err := io.CopyN(buf, request.Body, *rsc.maxSize+1)
if err == nil {
return NewError("body is too large")
} else if err == io.EOF {
// do nothing...( this block is to take C1 coverage )
} else {
return NewError("failed to read")
}
Но, если длина меньше, чем реальный размер тела, тело чтения функции и соединение сбрасываются. Кроме того, если запрос имеет заголовок «Transfer-Encoding», request.ContentLength имеет значение -1.
Почему соединение сбрасывается, когда тело запроса не читается до конца? Если заголовок «Content-Length» скрыт или имеет отрицательное значение, как сохранить соединение?