2010-11-24 6 views
0

ソケットからPOSTリクエストを実行するためにPHPを使用しています。php fread()関数は、各行の長さをプレフィックスにすることがあるのはなぜですか?

// open a socket connection on port 80 
$fp = fsockopen($host, 80); 

// send the request headers: 
fwrite($fp, "POST $path HTTP/1.1\r\n"); 
fwrite($fp, "Host: $host\r\n"); 
fwrite($fp, "Referer: $referer\r\n"); 
fwrite($fp, "Content-type: application/x-www-form-urlencoded\r\n"); 
fwrite($fp, "Content-length: ". strlen($data) ."\r\n"); 
fwrite($fp, "Connection: close\r\n\r\n"); 
fwrite($fp, $data); 

$result = ''; 
while(!feof($fp)) { 
    // receive the results of the request 
    $result .= fread($fp, 5000); 
} 

ただし、応答の各行の先頭には、その長さが16進数で表示されているようです。なぜそれが起こっているのですか?私が投稿する例えば

、テストcgiスクリプト、その環境を返します。

BASH=/bin/bash 
BASHOPTS=cmdhist:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath 
BASH_ALIASES=() 
BASH_ARGC=() 
BASH_ARGV=() 

しかし、私のPHP関数はこれで終わる:

f 
BASH=/bin/bash 

69 
BASHOPTS=cmdhist:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath 

10 
BASH_ALIASES=() 

答えて

3

あなたはHTTP/1.0を使用する必要があります、なぜなら1.1サーバーは通常、Transfer-Encoding:chunked(=は16進数の接頭部である)で応答します。

identityコンテンツエンコーディングを要求する要求を送信しようとする可能性がありますが、転送フォーマットとしてすべてのHTTP/1.1クライアントからチャンクが必要なので、それは不安定かもしれません。

1

各行ではなく、その前に長さが付いています。 marioが提案したように、サーバーはをチャンクされたというデータを送信します。すべてのチャンクは、チャンクの長さ、データ、二重改行(=>空行)で始まります。チャンク自体には、任意の有効な(httpの意味で)データを含めることができます。つまり、複数の行を含めることもできます。

これはあなた自身で使用できます。チャンク転送を受け取った場合、abadrary int(ここでは5000)ではなく、fread()にチャンクの長さをパラメータとして渡すことができます。だからあなたはすぐにチャンク全体を受け取るでしょう。

関連する問題