Что такое CONTENT_LENGTH для CGI? - PullRequest
0 голосов
/ 21 января 2020

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

Но правильно ли это делать?

1 Ответ

1 голос
/ 21 января 2020

HTTP Content-Length уже обсуждался здесь Что такое поле «Content-Length» в заголовке HTTP? определяет длину части тела только для области действия протокола HTTP.

Если ваше тело передается в двоичном виде, the Content-Length совпадает с длиной данных в запросе HTTP.

Когда ваше тело кодируется 7-битным ASCII, обычно Content-Length выше, чем фактические данные.

Подводя итог: необходимо вычислить Content-Length перед передачей тела запроса HTTP.

В вашем случае вы не можете сравнивать Content-Length с длиной файла. Это отключенные значения.

Ваш файл может быть передан с несколькими HTTP запросами и ответами с частичным содержанием, и каждый HTTP запрос и ответы получат свои Content-Length.

Если ваше намерение сделать проверку целостности; затем используйте HTTPS для проверки целостности передачи или используйте контрольные суммы или другие протоколы, такие как rsync со встроенной проверкой целостности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...