Как правильно настроить заголовок Content-Length при создании необработанного HTTP-запроса POST multipart / form-data с помощью cURL PHP?

У меня есть только вопрос о том, как мне нужно установить заголовок Content-Length с помощью curl в PHP для выполнения HTTP-запросов multipart / form-data POST.

Например, у меня есть PHP-скрипт, который заставляет POST выгружать изображение на сервер, содержимое тела HTTP-запроса будет выглядеть следующим образом:

------Boundary123
Content-Disposition: form-data; name="files[]"; filename="image.png"Content-Type: image/png

... contents of image.png
------Boundary123--

Я делаю что-то вроде этого:

 $bodiEntity = "--".$boundary."\r\n".
'Content-Disposition: form-data; name="files[]"; filename="'.$fileName.'"'."\r\n".
'Content-Type: img/png'."\r\n\r\n".
file_get_contents($fileName)."\r\n". // binary contents of file
"--".$boundary."--\r\n";

Но тогда какое значение я должен установить для заголовка Content-Length? Я знаю, это число байтов тела сущности, но как мне обработать «\ r \ n»?
Я имею в виду, если я делаю strlen("\r\n") Я получаю 2 в качестве возвращаемого значения, но я предполагаю, что это должно быть 1 (имеется в виду) один байт при работе с multipart / form-data, я прав?

Так что я должен просто использовать strlen() для строк, таких как граничная строка, Content-Disposition, Content-Type и счетчик «\ r \ n» как один символ и использовать filesize() получить размер файла файла в байтах, а затем суммировать все значения, чтобы получить окончательное значение для заголовка Content-Length? Или я должен считать «\ r \ n» как 2 символа, как это делает PHP?

Спасибо за внимание!

1

Решение

Считайте «\ r \ n» как два байта. Длина пары CRLF составляет два байта. Все тело в том числе

 - the boundary prefix ("--"),
- boundary,
- the content bytes,
- the interim boundaries and their prefixes,
- the final boundary prefix,
- boundary and boundary post fix,

все должно быть учтено в содержании длины.

Что касается содержания-длины. Начиная с HTTP 1.1, для каждой части файла не определена длина содержимого.

Тем не менее, заголовок Content-length должен быть определен в начале запроса.
Вы можете прочитать RFC 7230 Раздел 3.3.2. Он был написан одним из основных авторов стандартов веб и HTTP Рой Томас Филдинг.

Но существует множество других способов, которыми файл может быть отправлен как запрос, он не обязательно должен быть ограничен в составном запросе на основе границ. Другой механизм самого метода POST — запрос необработанного типа контента. Содержимое передается сразу после того, как заголовки заканчиваются в запросе, после чего следует пустая строка (читается как «\ r \ n»).

Другие механизмы включают запросы PUT, которые также могут работать аналогичным образом. У обоих из них есть различия, которые технически разделяют их друг от друга, хотя я не думаю, что вдаваясь в эти детали, есть какой-то интерес к этому вопросу, поэтому я просто пропущу его.

0

Другие решения

Других решений пока нет …