RF C 3875 определяет CONTENT_LENGTH следующим образом:
Переменная CONTENT_LENGTH содержит размер тела сообщения, прикрепленного к запросу, если он есть, в десятичное число октетов. Если данные не прикреплены, тогда NULL (или не установлен).
CONTENT_LENGTH = "" | 1*digit
Сервер ДОЛЖЕН установить эту метапеременную тогда и только тогда, когда запрос сопровождается сущностью тела сообщения. Значение CONTENT_LENGTH должно отражать длину тела сообщения после того, как сервер удалил любые кодировки передачи или кодировки контента.
Я не уверен, какой это размер.
Это размер данных, которые клиенты хотят отправить, что означает значение заголовка HTTP-запроса «Content-Length»?
Или это размер данных, которые HTTP-сервер прочитал из запроса перед данные отправляются в CGI?
Я спрашиваю, потому что я не уверен, кто отвечает за проверку того, что объем данных, которые клиент хочет отправить, соответствует количеству фактически поступивших данных. Является ли HTTP-сервер ответственным за проверку того, что размер соответствует значению в заголовке запроса, или CGI отвечает за подсчет байтов, поступающих на STDIN? И если да, то как CGI получает значение заголовка запроса?
Прямо сейчас я делаю это в моем CGI:
cat > $TMP/upload.csv
size=$(stat -c %s "$TMP/upload.csv")
if [ "$CONTENT_LENGTH" != "$size" ]; then
echo "Size missmatch"
return -1
fi
Но правильно ли это делать?