Рассчитать длину контента POST

Как рассчитать длину контента, например:

POST /Upload/ HTTP/1.1
Host: test.lan
User-Agent: Shockwave Flash
Connection: Keep-Alive
Cache-Control: no-cache
Accept: text/*
Content-Length: ?????
Content-Type: multipart/form-data; boundary=----------------------------4d2179e6b3c0

------------------------------4d2179e6b3c0
Content-Disposition: form-data; name="Filename"

phpinfo.php
------------------------------4d2179e6b3c0
Content-Disposition: form-data; name="ASPSESSID"

6e223eb1c7561e9c599f03cc04e9444b
------------------------------4d2179e6b3c0
Content-Disposition: form-data; name="Filedata"; filename="phpinfo.php"
Content-Type: application/octet-stream

<? phpinfo(); ?>
------------------------------4d2179e6b3c0
Content-Disposition: form-data; name="Upload"

Submit Query
------------------------------4d2179e6b3c0--

Ответ 1

Значение Content-Length должно быть рассчитано путем суммирования всех данных после окончания заголовков сообщений. В случае вашего примера это все после этой точки (с CRLF символами, включенными для чтения):

...
Content-Length: ?????\r\n
Content-Type: multipart/form-data; boundary=--------------------4d2179e6b3c0\r\n
\r\n

Все, начиная с первой пустой строки (\r\n), включая ваши разделители границ, должно учитываться в общей длине. На практике это обычно означает, что после генерации полного тела объекта сообщения вам нужно будет табулить значение заголовка Content-Length. После того как вы получите полный текст сообщения, вы можете добавить его в заголовки для создания полного HTTP-сообщения.

В соответствии с спецификацией HTTP вам не требуется специфицировать заголовок Content-Length. Из RFC 2616 14.13:

Приложения СЛЕДУЕТ использовать это поле, чтобы указать длину передачи тела сообщения, если это не запрещено правилами в разделе 4.4.

Однако это довольно стандартное требование для большинства серверов, которые обычно отправляют ответ об ошибке, если Content-Length отсутствует или неправильно указан.