|
|
|
| Как раскодировать transfer-coding "chunked"? | |
|
|
|
|
|
|
|
для: sms-send
(12.04.2007 в 22:54)
| | Считывать индикатор размера куска (самый первый - сразу после первого двойного перевода строки в HTTP-сообщении). Индикатор должен быть в шестнадцатиричном формате.
Далее считать столько байт, сколько указано в индикаторе. Повторить процедуру до конца файла (перевод строки с нулем). | |
|
|
|
|
|
|
|
для: Unkind
(12.04.2007 в 23:59)
| | >Далее считать столько байт, сколько указано в индикаторе.
Всмысле просто перевести в десятичную систему счисления? А сколько байт занимает индикатор? | |
|
|
|
|
|
|
|
для: sms-send
(13.04.2007 в 00:03)
| | >>Далее считать столько байт, сколько указано в индикаторе.
>Всмысле просто перевести в десятичную систему счисления?
В смысле - перевести из шестнадцатеричной. В двоичную.
>А сколько байт занимает индикатор?
Там все критичные данные - строковые. | |
|
|
|
|
|
|
|
для: sms-send
(13.04.2007 в 00:03)
| | Индикатор размера куска перевести в десятичный и считать, например с переменной, в которую вы сохранили ответ сервера, этот кусок.
Индикаторы размера - это как раз тот "мусор". Может быть сколько угодно символов - индикатор будет до ближайшего перевода строки. Но чаще всего 3 символа. | |
|
|
|
|
|
|
|
для: Unkind
(13.04.2007 в 00:27)
| | > это как раз тот "мусор"
Как раз пытаюсь от него избавиться :-) | |
|
|
|
|
|
|
|
для: Unkind
(12.04.2007 в 23:59)
| | Там всё несколько сложнее.
Приблизительно - так:
<?php
/*
Chunked Body = *chunk "0" CRLF footer CRLF
Chunk = chunk-size [ chunk-ext ] CRLF chunk-data CRLF
Hex-no-zero =
Chunk-size = hex-no-zero *HEX
Chunk-ext = *( ";" chunk-ext-name [ "=" chunk-ext-value ] )
Chunk-ext-name = token
Chunk-ext-val = token | quoted-string
Chunk-data = chunk-size(OCTET)
footer = *entity-header
*/
function parse_chunk_header($line)
{
$x = explode(';', $line);
return intval(hexdec($x[0]));
}
function load_chunked_body($sock)
{
$data = '';
while($length = parse_chunk_header(fread($sock, 2048)))
{
$length += 2;
while($length)
{
if(feof($sock))
return "error";
$line = fread($sock, $length);
$length -= strlen($line);
if(!$length)
$line = substr($line, 0, -2);
$data .= $line;
}
}
while(!feof($sock) && fread($sock, 2048) != '')
;
return $data;
}
?>
|
| |
|
|
|
|
|
|
|
для: Trianon
(13.04.2007 в 00:24)
| | А какой смысл в цикле:
while(!feof($sock) && fread($sock, 2048) != '')
;
Просто дочитать сокет до конца? | |
|
|
|
|
|
|
|
для: sms-send
(13.04.2007 в 12:44)
| | Дочитать сокет до конца ответа на запрос.
Там же может быть еще один ответ.
Возможно я несколько наврал в функциях.. Не исключено, что fgets будет работать более адекватно.
На самом деле , в этих строках могут быть заголовки. Но как я понимаю, тоже только транспортного уровня. | |
|
|
|