読者です 読者をやめる 読者になる 読者になる

HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

HTTPリクエストに対するレスポンスにごみデータ?

爆弾コード PHP

HTTPリクエスト/レスポンスを処理する、とあるライブラリを使っていたところ、妙なデータが返ってくることに気づいた。
おおよそ以下のような感じ。

201f
<?xml version='1.0' encoding='UTF-8'?>
<root>
<row>abcdefghijklmnopqrstuvwxyz<row>
<row>abcdefghijklmnopqrstuvwxyz<row>
<row>abcdefghijklmnopqrstuvwxyz<row>
<row>abcdefghijklmnopqrstuvwxyz<row>
<row>abcdefghijklmnopqrstuvwxyz<row>
(以下略)

呼び出し元では、クソみたいなXML解析処理をしていたので実害はなかったっぽいが、しばらく「先頭の"201f"は何だろう?」と悩んでいた。
そのライブラリは、例えば以下のような感じでレスポンスボディを取得する。

$body = HttpClient::get('http://localhost/samples/php/2012-0214/large.php');

そこで、そのライブラリの中の、データを受け取っている部分を見てみたら以下のような感じだった。

$response = '';
while (($buf = fgets($fp, 4096))) {
	$response .= $buf;
}
fclose($fp);

$idx = strpos($response, "\r\n\r\n");
return substr($response, $idx + 4);

なんかいやな予感しかしないが、このコードをちょっと改変して、以下のようにしてみる。

	$response = '';
	while (($buf = fgets($fp, 4096))) {
		$response .= $buf;
	}
	fclose($fp);

	$idx = strpos($response, "\r\n\r\n");
$header = substr($response, 0, $idx);
printf("%s\n", $header);
	return substr($response, $idx + 4);

再実行してみたら、一瞬で納得した。

HTTP/1.1 200 OK
Date: Tue, 14 Feb 2012 17:50:10 GMT
Server: Apache/2.2.16 (Win32) mod_ssl/2.2.16 OpenSSL/0.9.8o PHP/5.3.3 DAV/2
X-Powered-By: PHP/5.3.3
Transfer-Encoding: chunked
Content-Type: text/xml

「チャンクサイズ」だった‥


教訓:ちゃんと書けもしないのに、基本ライブラリを使えば済むような処理を自前実装するのはやめましょう。周りの人が困るだけです(斬)。撲滅:お金をもらっているサンデープログラマー