phpbar.de logo

Mailinglisten-Archive

[php] Verhalten von flush() beim Ausfuehren via Telnet

[php] Verhalten von flush() beim Ausfuehren via Telnet

Kai Meder php-ml at kai.meder.info
Don Jul 31 18:34:24 CEST 2003


> Rufe ich das Script aber über Telnet (Windows 2000 -> cmd.exe ->
telnet
> mein.host.at 80 -> GET /script.php HTTP/1.1 -> Host:mein.host.at -> 2x
> CRLF) auf, bekomme ich bei jedem flush anscheinend eine Art
Return-Code
> inklusive zusätzlicher Linebreaks ausgegeben:

> <telnet-output>
>    irgendwas, das lang genug ist um flushen zu können.<br />
>
>    ef
>    noch irgendwas, das lang genug ist um flushen zu können.<br />
>
>    7a
>    und letztendlich noch was, das lang genug ist um flushen zu
können.<br />
>
>    14
> </telnet-output>

über das gleiche problem bin ich gestern auch gestolpert ...
das nennt sich chunked transfer-coding

siehe RFC 2616  3.6 Transfer Codings

die zeichen, die du siehst sind teile vom chunk-header, die die
chunk-size der chunk-data in hex angeben ....
wiederlich ! ;)

/* RFC2616 - 3.6.1 - chunk structure

   Chunked-Body = *chunk
        last-chunk
        trailer
        CRLF

   chunk   = chunk-size [ chunk-extension ] CRLF
        chunk-data CRLF
   chunk-size  = 1*HEX
   last-chunk  = 1*("0") [ chunk-extension ] CRLF

   chunk-extension = *( ";" chunk-ext-name [ "=" chunk-ext-val ] )
   chunk-ext-name = token
   chunk-ext-val = token | quoted-string
   chunk-data  = chunk-size(OCTET)
   trailer   = *(entity-header CRLF)
  */

  $chunks = '';

  while (true)
   {
   // fetching first CRLF-position which delimits the chunk-header
   if (!($crlf_pos = strpos($data , $crlf)))
    break;

   // get chunk-header
   $chunk_header = substr($data , 0 , $crlf_pos);

   // fetching chunk-size from chunk-header
   if (!preg_match('°([0-9a-f]+)°i' , $chunk_header , $matches))
    break;

   // chunk-size is hex ...
   $chunk_size = hexdec($matches[1]);

   // if chunk-size is zero, we reached the last (empty) chunk
   if ($chunk_size == 0)
    break;

   // new data begins after the chunk-header which ends with a CRLF !
   $data = substr($data , $crlf_pos + 2);

   // sanity check
   if (strlen($data) == 0)
    break;

   // adding chunk-data with specified chunk-size to chunks
   $chunks .= substr($data , 0 , $chunk_size);

   // new data begins after the chunk-data which ends with a CRLF !
   $data = substr($data , $chunk_size + 2);
   }

  $data = $chunks;



php::bar PHP Wiki   -   Listenarchive