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

HHeLiBeXの日記 正道編

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

POSTデータを送ったときのレスポンスを読む

PHP

PHPでPOSTデータを送る方法はいくつかあるらしい。

が、制限が厳しい環境だと、どうしてもfsockopenでがんばるしかない。

で、末尾に「実験用」と書いてあるので、まぁこれ自体はいいのだが、これと同レベルのものが本番(何)で動いていたりとかマジありえないんですけどー‥とか言っても始まらないので、せめてこのくらい実装しようよという点の一つとして、レスポンスが「Transfer-Encoding: chunked」の場合の処理を書いてみた。
上記2番目のサイトにあるコードの中で直すとしたら以下の箇所。

<?php
/* 応答データ受信 */
$response = "";
while (!feof($fp)) {
    $response .= fgets($fp, 4096);
}

これを、以下のようにする。

<?php
$response = "";
// ヘッダの読み込み
while ( !feof( $fp ) ) {
    $tmp = fgets($fp, 4096);
    $response .= $tmp;
    if ($tmp == "\r\n") {
        break;
    }
}
$isChunked = (preg_match("/\r\nTransfer-Encoding: chunked\r\n/", $response) === 1);
// ボディの読み込み
while ( !feof( $fp ) ) {
    $tmp = '';
    if ($isChunked) {
        $strSize = fgets($fp, 4096);
        $strSize = trim($strSize);
        $len = intval($strSize, 16);
        if ($len > 0) {
            $tmp = '';
            while (strlen($tmp) < $len) {
                $tmp .= fread($fp, $len - strlen($tmp));
            }
            // 指定された長さ分読み込んだ後に改行コードがあるので、読んで破棄する。
            $ss = fgets($fp);
        }
    } else {
        $tmp = fgets($fp, 4096);
    }
    $response .= $tmp;
}

まぁ、ヘッダの判定はだいぶいい加減だが(ぉ