PHP: количество байтов в строке, необработанный HTTP - PullRequest
1 голос
/ 23 января 2012

Я пытаюсь получить число байтов в строке PHP.Кажется, я столкнулся с проблемой, пытаясь отправить необработанные HTTP-запросы (PROPFIND, REPORT) и получить правильную длину содержимого.С какого момента, следуя заголовкам, я начинаю считать контент?И в какой момент я остановлюсь?

Ответы [ 2 ]

4 голосов
/ 23 января 2012

Вы подсчитываете весь контент, начиная с двух разрывов строки, которые разделяют заголовок:

$contentlength_bytes = strlen(strstr($http, "\r\n\r\n")) - 4;

Если вы делаете это таким образом, я думаю, у вас могут возникнуть проблемы с кодировкой..

Когда ваш контент содержит многобайтовые символы, использование strlen() для возврата длины его байта может работать некорректно, так как многобайтовые символы могут интерпретироваться как один байт при определенных конфигурациях системы (см. Правку ниже - и комментарии к этой части).

Это даст вам правильную длину байта любой строки содержимого, которую вы подаете в любой конфигурации системы:

$contentlength_bytes = mb_strlen(strstr($http, "\r\n\r\n"), 'latin1') - 4;

Редактировать:
Как указал Джонв комментариях это не всегда необходимо, так как strlen() в большинстве случаев будет возвращать правильный счетчик строки.

Я только что добавил этот метод измерения, как в многобайтовых системах, и при определенных обстоятельствах (например, mbstring.func_overload установлен на 2) strlen() небезопасно использовать против двоичных строк.

Вышеуказанный метод является единственным известным (для меня) способом полностью бинарного безопасного вычисления длины в байтах данной строки.И я уже несколько раз спотыкался об этом ...

3 голосов
/ 23 января 2012

Если у вас весь запрос в переменной, скажем $request, то:

list($headers,$body) = explode("\r\n\r\n",$request,2);

По сути, два CRLF отмечают конец заголовков, а содержимое начинается после этого.

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