Avatar billede sjh Nybegynder
30. marts 2007 - 22:24 Der er 19 kommentarer og
1 løsning

Chunked Transfer Coding

Jeg forsøger at lave en decoding af chunked, men kan ikke få det til at virke..

Jeg har set lidt på HTTP/1.1
http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.6 og
http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.6.1

og har fundet ud af at jeg skal bruge hexdec() fra php til at få lengte.. men kan ikke få det til at spille helt..
nogle af jer som kan hjælpe ?


Har fået det til at virke lidt med den her:

  if (preg_match('|\r\n\r\n(.*?)\r\n|', $buffer, $matches)) {
    $length = $matches[1];
    $header_pos = strpos($buffer, "\r\n\r\n") + (strlen($length) + 6);
    $buffer = substr($buffer, $header_pos, hexdec($length));
  }

men det virker jo kun hvis der kun er én chunk..
Avatar billede sjh Nybegynder
31. marts 2007 - 11:21 #1
Har fået lavet en som virker.. måske den kan optimeres lidt ??

<?php
  function Decode_Chunked_Data($ChunkedData)
  {
    $nEnd = strpos($ChunkedData, "\r\n", 0);
    $nChunkSize = trim(substr($ChunkedData, 0, $nEnd));
    $nOctetsToRead = hexdec($nChunkSize);
    $nStart = ($nEnd + 2);
    while($nOctetsToRead > 0)
    {
      $buffer .= substr($ChunkedData, $nStart, $nOctetsToRead);
      $nStart = ($nStart + $nOctetsToRead + 2);
      if (strlen($ChunkedData) > $nStart)
      {
        $nEnd = strpos($ChunkedData , "\r\n" , $nStart);
        $nChunkSize = trim(substr($ChunkedData, $nStart, $nEnd-$nStart));
        $nOctetsToRead = hexdec($nChunkSize);
        $nStart = ($nEnd + 2);
      } else {
        $nOctetsToRead = 0;
      }
    }
    return $buffer;
  }
?>
Avatar billede johan.o Nybegynder
01. april 2007 - 20:25 #2
preg_match() 'finder' kun nul eller et match, så stopper 'den'.

preg_match_all() fortsætter til den bitre ende og registrere alle forekomster.

Måske du kan bruge det i din originale kode.

Mvh. Johan
Avatar billede sjh Nybegynder
02. april 2007 - 04:24 #3
Når ja, ved godt hvad preg_match() og preg_match_all() gør, så det er ikke en fejl at jeg benytter mig af preg_match()  ;)
Avatar billede sjh Nybegynder
02. april 2007 - 04:27 #4
men det ser ikke ud til at det kan optimeres.. så jeg lukker i aften (20:00 02-04-2007)
Avatar billede johan.o Nybegynder
02. april 2007 - 09:31 #5
Tja, skal ikke kunne sige om det kan optimeres da jeg ikke er helt med på syntaksen i $ChunkedData, men hvis du siger det, er det i orden med mig :)

Mvh. Johan
Avatar billede sjh Nybegynder
02. april 2007 - 17:51 #6
Ja det kan se sådan ud.. <CRLF> er så retuen (\r\n) det nummer som står mellem
<CRLF>xx<CRLF> er lengten på den tekst som kommer efter.. ( men husk at lengten skal afkodes med hexdec() )

Fx:

19<CRLF>Dette er en tekst, 27<CRLF>her kommer en tekst mere..<CRLF>0<CRLF>


det bliver så til:

Dette er en tekst, her kommer en tekst mere..
Avatar billede sjh Nybegynder
02. april 2007 - 17:53 #7
eller sådan

<CHUNK SIZE><CRLF><DATA CHUNK><CRLF><CHUNK SIZE><CRLF><DATA CHUNK>...<0 CHUNK SIZE>
Avatar billede sjh Nybegynder
02. april 2007 - 17:55 #8
der mangler en <crlf> ved 27

19<CRLF>Dette er en tekst, <CRLF>27<CRLF>her kommer en tekst mere..<CRLF>0<CRLF>
Avatar billede johan.o Nybegynder
03. april 2007 - 00:33 #9
Hm, måske sådan her -->

do {
$nEnd = strpos($ChunkedData, "\r\n", 0);
$nChunkSize = trim(substr($ChunkedData, 0, $nEnd));
$nOctetsToRead = hexdec($nChunkSize);
$nStart = ($nEnd + 2);
$buffer .= substr($ChunkedData, $nStart, $nOctetsToRead);
$nStart = ($nStart + $nOctetsToRead + 2);
} while (strlen($ChunkedData) > $nStart);

Mvh. Johan
Avatar billede johan.o Nybegynder
03. april 2007 - 00:41 #10
Kan et chunk segment se sådan her ud ?

<10> <\r\n> <abcd\r\nabcd> <\r\n>

altså kan der optræde linieskift inde i et 'chunk' ?

Ved længden '0' hvilken syntaks bruges da ?

<0> <\r\n> <\r\n>

eller

<0> <\r\n> ?

Mvh. Johan
Avatar billede johan.o Nybegynder
03. april 2007 - 00:44 #11
Sad og rodede med noget alá dette, men da jeg ikke er 100% på detaljerne i syntaksen virker det sandsynligvis ikke :)

preg_match_all("/[0-9A-F]+\r\n(.+)\r\n/", $chunks, $matches);

for($i=0; $i<count($matches[1]); $i++) {
echo "<pre>".$i." --> ".$matches[1][$i]."</pre>"; }

Mvh. Johan
Avatar billede sjh Nybegynder
03. april 2007 - 04:36 #12
Jeps der skal godt optræde linieskift inde i et "chunk" og derfor er jeg sikker på at "/[0-9A-F]+\r\n(.+)\r\n/" ikke virker.. det chunk data er kan jo være alm. html/js/css/zip/exe osv...
Avatar billede sjh Nybegynder
03. april 2007 - 05:09 #13
hmm ved at rette lidt små fejl i den kode du viser "03/04-2007 00:33:54" så tror jeg faktis den virker..


do
{
  $nEnd = strpos($ChunkedData, "\r\n", $nStart);
  $nChunkSize = trim(substr($ChunkedData, $nStart, $nEnd-$nStart));
  $nOctetsToRead = hexdec($nChunkSize);
  $nStart = ($nEnd + 2);
  $buffer .= substr($ChunkedData, $nStart, $nOctetsToRead);
  $nStart = ($nStart + $nOctetsToRead + 2);
}
while (strlen($ChunkedData) > $nStart && $nOctetsToRead > 0);
Avatar billede johan.o Nybegynder
03. april 2007 - 10:17 #14
Kan ikke lige 'læse' mig frem til hvorfor du behøver $nOctetsToRead>0 i while ?

Mvh. Johan
Avatar billede sjh Nybegynder
03. april 2007 - 10:23 #15
Ja nu var det ikke kun det som var så meget en fejl..

Din :
  $nEnd = strpos($ChunkedData, "\r\n", 0);
  $nChunkSize = trim(substr($ChunkedData, 0, $nEnd));

Min :
  $nEnd = strpos($ChunkedData, "\r\n", $nStart);
  $nChunkSize = trim(substr($ChunkedData, $nStart, $nEnd-$nStart));

Det køre jo i loop og så fik den ikke opdateret der hvor du har 0 ("\r\n", 0); og , 0, $nEnd));)

og så skal den stoppe hvis $nOctetsToRead er 0 (null) da det er slut på hele $ChunkedData
Avatar billede johan.o Nybegynder
03. april 2007 - 10:28 #16
Ja ja, jeg er udemærket godt klar over hvilke små fejl der var, men dem har du jo selv taget dig af.

Så skal jeg nok lade være at blande mig mere.

Mvh. Johan
Avatar billede sjh Nybegynder
03. april 2007 - 10:32 #17
ha ha.. :D

smid et svar din løsning var jo lidt bedre en min..
Avatar billede johan.o Nybegynder
03. april 2007 - 10:37 #18
Kommer her og velbekomme.

Mvh. Johan
Avatar billede sjh Nybegynder
03. april 2007 - 10:42 #19
Ja tak for hjælpen.. håber også du fik lidt ud af det.. :D
Avatar billede johan.o Nybegynder
03. april 2007 - 10:50 #20
Tjo, jeg har aldrig haft brug for noget i forbindelse med chunked data, men hvis det skulle blive aktuelt er jeg da ikke på helt bar bund nu :)

Takker for points.

Mvh. Johan
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester