Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: transfer-coding "chunked"
 
 автор: sms-send   (12.04.2007 в 22:54)   письмо автору
 
 

Как раскодировать transfer-coding "chunked"?

   
 
 автор: Unkind   (12.04.2007 в 23:59)   письмо автору
 
   для: sms-send   (12.04.2007 в 22:54)
 

Считывать индикатор размера куска (самый первый - сразу после первого двойного перевода строки в HTTP-сообщении). Индикатор должен быть в шестнадцатиричном формате.
Далее считать столько байт, сколько указано в индикаторе. Повторить процедуру до конца файла (перевод строки с нулем).

   
 
 автор: sms-send   (13.04.2007 в 00:03)   письмо автору
 
   для: Unkind   (12.04.2007 в 23:59)
 

>Далее считать столько байт, сколько указано в индикаторе.
Всмысле просто перевести в десятичную систему счисления? А сколько байт занимает индикатор?

   
 
 автор: Trianon   (13.04.2007 в 00:27)   письмо автору
 
   для: sms-send   (13.04.2007 в 00:03)
 

>>Далее считать столько байт, сколько указано в индикаторе.
>Всмысле просто перевести в десятичную систему счисления?

В смысле - перевести из шестнадцатеричной. В двоичную.

>А сколько байт занимает индикатор?

Там все критичные данные - строковые.

   
 
 автор: Unkind   (13.04.2007 в 00:27)   письмо автору
 
   для: sms-send   (13.04.2007 в 00:03)
 

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

Индикаторы размера - это как раз тот "мусор". Может быть сколько угодно символов - индикатор будет до ближайшего перевода строки. Но чаще всего 3 символа.

   
 
 автор: sms-send   (13.04.2007 в 00:32)   письмо автору
 
   для: Unkind   (13.04.2007 в 00:27)
 

> это как раз тот "мусор"
Как раз пытаюсь от него избавиться :-)

   
 
 автор: Trianon   (13.04.2007 в 00:24)   письмо автору
 
   для: 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($sock2048)))
  {
    
$length += 2;
    while(
$length)
    {
        if(
feof($sock))
            return 
"error";
        
$line fread($sock$length);
        
$length -= strlen($line);
        if(!
$length)
            
$line substr($line0, -2);
        
$data .= $line;
    }
  }
  while(!
feof($sock) && fread($sock2048) != '')
      ;
  return 
$data;
}
?>

   
 
 автор: sms-send   (13.04.2007 в 12:44)   письмо автору
 
   для: Trianon   (13.04.2007 в 00:24)
 

А какой смысл в цикле:
while(!feof($sock) && fread($sock, 2048) != '')
;
Просто дочитать сокет до конца?

   
 
 автор: Trianon   (13.04.2007 в 12:56)   письмо автору
 
   для: sms-send   (13.04.2007 в 12:44)
 

Дочитать сокет до конца ответа на запрос.
Там же может быть еще один ответ.
Возможно я несколько наврал в функциях.. Не исключено, что fgets будет работать более адекватно.

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

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования