第9回 HTTP_Request クラス - HTTPリクエスト支援ライブラリ (2) - PEAR講座

PHPセキュリティ

くまっち先生のPEAR講座

Lecutures on PHP

第9回 HTTP_Request クラス - HTTPリクエスト支援ライブラリ (2) (その3)

 このエントリーをはてなブックマークに追加

レスポンスデータを取り扱う (1)

リクエストが無事成功した場合は、リクエスト先からはレスポンスが返ってきます。このレスポンスされたデータも正しく取り扱う必要があります。
HTTP_Requestでは、レスポンスデータについての処理を行うための専用クラスを別途準備し、そのクラス内にて受信したデータを分析、抽出する仕組みになっています。sendRequestメソッド内でHTTP_Responseという専用クラスを生成し、レスポンスデータに対しての処理を実施します。リスト4がそれら処理を行っているコードの抜粋です。

    リスト4レスポンスデータ処理用クラスを準備する

    $this
->_response = &new HTTP_Response($this->_sock$this->_listeners);
    
$err $this->_response->process(
           
$this->_saveBody && $saveBody,
           
HTTP_REQUEST_METHOD_HEAD != $this->_method
           
);

接続情報の$this->_sockを引数として渡しつつHTTP_Responseクラスオブジェクトを作成し、その後processメソッドを実行しています。このprocessメソッドにより、レスポンスデータの分析、抽出処理を実施することとなります。

レスポンスデータとは、第4回(*2)、第5回講座(*3)で取り上げたHTTP_Downloadによるダウンロード機能で紹介したとおり、レスポンスヘッダ情報とデータのセットで送信されてきます。ヘッダ内には、サーバ・クライアント間の通信に必要となる情報であったり、送信されてくるデータに関する情報などが含まれています。processメソッドでは、これらヘッダ情報を取得、分析する処理から始まります。リスト5はそのコードの抜粋になります。

    リスト5レスポンスヘッダの抽出

    
do {
        
$line $this->_sock->readLine();
        if (
sscanf($line'HTTP/%s %s'$http_version$returncode) != 2) {
            return 
PEAR::raiseError('Malformed response.');
        } else {
            
$this->_protocol 'HTTP/' $http_version;
            
$this->_code     intval($returncode);
        }
        while (
'' !== ($header $this->_sock->readLine())) {
            
$this->_processHeader($header);
        }
    } while (
100 == $this->_code);

くまっち先生

$this->_sockはHTTP_Responseクラスのクラスプロパティですが、このクラスを生成する際に引数として与えられた接続情報、すなわちHTTP_Requestで作成されたNet_Socketと全く同じものです。
do~whileによる反復処理を行っていますが、ここでは最初に行っているNet_Socket($this->_sock)のreadLineメソッドでヘッダ情報を取得しそこで示されているステータスコードが100ならばループするという処理の流れになっており、これはHTTPステータスコードにおける100「リクエストを受け入れ処理を続けている」という仕様によるものをロジック化したコードになっています。

普段ブラウザでステータスコードを確認しながらWebサイトを閲覧することはさほどありませんが、正直なところステータスコードの100に出くわすというものもかなり珍しいケースでしょう。それでもHTTP通信を行うプログラムとして、やはりHTTPの仕様をきちんと盛り込んでコードにする必要はあります。

HTTPデータにおけるヘッダとボディは、一切のデータを含まない一行、すなわち改行のみの行を境に区別する仕組みとなっているため、readLineメソッドで得たデータがブランクになるまでがヘッダ情報ということになります。do~while内で行われているwhile反復処理がそれにあたります。


----
*2) http://www.phppro.jp/school/pear/vol4/1
*3) http://www.phppro.jp/school/pear/vol5/1

  



Pick Up Q&A

Q
動的なURLを静的に見せる方法
 このエントリーをはてなブックマークに追加 
A
普通に考えて、mod_rewrite でしょうね。 http://www.nishishi.com/blog/2006/01/mod_rewrite_url.html...

>>続きを読む

GETのままでは検索エンジンのロボットが拾ってくれなかったためにSEO対策として有効だと言われていますね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)