svnno****@sourc*****
svnno****@sourc*****
2010年 6月 3日 (木) 16:18:22 JST
Revision: 106 http://sourceforge.jp/projects/frameworkspider/svn/view?view=rev&revision=106 Author: m_nakashima Date: 2010-06-03 16:18:21 +0900 (Thu, 03 Jun 2010) Log Message: ----------- 1) setタグクラスの修正をおこないました。第二引数全体が''で囲まれていた場合、文字列判断はPHPプログラム と同等の記述で動作するようになりました。 2) util_HttpRequestクラスを追加しました。JavaScriptのHTTPオブジェクトと同様の感覚で使えるHTTP 通信用クラスです。fsockopenがSSLに対応していればHTTPS通信も可能です。 これに伴い、util_GetHTTPResponseクラスは非推奨クラスとなります。次回アップデートから削除しますので ご利用中の方は気を付けてください。 Added Paths: ----------- current/spider/lib/util/HttpRequest.class.php -------------- next part -------------- Added: current/spider/lib/util/HttpRequest.class.php =================================================================== --- current/spider/lib/util/HttpRequest.class.php (rev 0) +++ current/spider/lib/util/HttpRequest.class.php 2010-06-03 07:18:21 UTC (rev 106) @@ -0,0 +1,205 @@ +<?php +/** + * ユーティリティ:HTTPリクエストを送信してレスポンスを取得するユーティリティオブジェクト + * + * @package util ユーティリティパッケージ + * @version 1.0.0 + * @copyright Copyright © 2008, Multimedia Digital Contents Systems.Co.,Ltd.<info****@md-sy*****> http://www.md-systems.net/ + * @author Multimedia Digital Contents Systems.Co.,Ltd. m.nakashima <m_nakas****@md-sy*****> + * @since PHP 4.3 + */ +class util_HttpRequest { + /** リクエスト対象URL */ + var $requestUrl; + /** リクエストプロトコル */ + var $requestProtocol = 'http'; + /** リクエストホスト名 */ + var $requestHostName; + /** リクエストポート番号 */ + var $requestPort = 80; + /** リクエストURI */ + var $requestUri = '/'; + /** リクエストメソッド */ + var $requestMethod = 'get'; + /** リクエストヘッダハッシュ */ + var $requestHeaders = array(); + + /** レスポンスステータスコード */ + var $statusCode = 0; + /** レスポンスステータスメッセージ */ + var $statusMessage = ''; + /** レスポンスプロトコル */ + var $responseProtocol = ""; + + /** エラー番号 */ + var $errorNumber; + /** エラーメッセージ */ + var $errorMessage; + + /** レスポンスヘッダハッシュ */ + var $responseHeaders = array(); + /** レスポンスボディ */ + var $responseBody = null; + + /** + * コンストラクタ + */ + function util_HttpRequest( $url = null, $method='get', $headerParms=array() ){ + $this->requestHeaders = array(); + $this->open( $url, $method, $headerParms ); + } + /** + * 指定URLへの接続を作成準備します + */ + function open( $url = null, $method='get', $headerParms=null ) { + // メソッドの設定 + if( 'post' == strtolower($method) ) { + $this->requestMethod = 'post'; + } else { + $this->requestMethod = 'get'; + } + // URLの設定 + $this->requestUrl = $url; + // リクエストヘッダの設定 + if( is_array($headerParms) ) { + $this->requestHeaders = array(); + foreach($headerParms as $key=>$val ) { + if( strlen($key)>0 && strlen($val) > 0 ) { + $this->requestHeaders[$key] = $val; + } + } + } + } + /** + * リクエストを送信して結果を取得します + */ + function send( $contents=null, $timeout=10 ) { + // URLの分割 + $urlElementArray = explode('/',$this->requestUrl ); + if( count($urlElementArray) == 0 ) { + $this->errorMessage = 'Target URL is invalid!'; + return false; + } + if( strtolower($urlElementArray[0]) != 'http:' + && strtolower($urlElementArray[0]) != 'https:' ) { + // httpまたはhttpsから始まらないならデフォルトでhttpを追加する + array_unshift($urlElementArray,''); + array_unshift($urlElementArray,'http:'); + } + $this->requestProtocol = str_replace(':','',trim(array_shift($urlElementArray))); + array_shift($urlElementArray); + $fqdn = array_shift($urlElementArray); + $this->requestUri = '/'.implode('/',$urlElementArray); + $this->requestHostName = $fqdn; + $this->requestPort = 80; + $connectTarget = $this->requestHostName; + // ホスト名整理 + if( strpos( $this->requestHostName, ':' ) !== false ) { + list( $this->requestHostName, $this->requestPort ) = explode(':',$this->requestHostName); + } else if( strtolower($this->requestProtocol) == 'https' ) { + $this->requestPort = 443; + $connectTarget = 'ssl://'.$this->requestHostName; + } + // ホスト存在確認 + $address = gethostbyname($this->requestHostName); + if( preg_match('/^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}/',$address) == 0 ) { + $this->errorMessage = 'Target Host is not found!'; + return false; + } + // リクエスト文字列作成 + $requestStrings = $this->_createRequestStrings( $contents ); + // ソケット通信 + if( $socket = @fsockopen( $connectTarget, $this->requestPort, $this->errorNumber, $this->errorMessage, $timeout ) ){ + if( @socket_set_timeout( $socket, $timeout ) ) { + // リクエスト送信 + fwrite( $socket, $requestStrings ); + // レスポンス文字列受信 + $responseText = ''; + while (!feof($socket)) { + $responseText .= fgets($socket, 128); + } + $this->_convertResponse( $responseText ); + } else { + $this->errorMessage = 'Can\'t set connection timeout!'; + return false; + } + @fclose($socket); + } else { + return false; + } + return true; + } + /** + * リクエスト用文字列を作成して取得します + */ + function _createRequestStrings( $contents ) { + $method = 'GET'; + $requestStrings = ''; + if( 'post' == $this->requestMethod ) { + $method = 'POST'; + } + $hostName = $this->requestHostName; + $uri = $this->requestUri; + $requestStrings = "{$method} {$uri} HTTP/1.1\r\n" + ."Accept: */*\r\n" + ."Host: {$hostName}\r\n"; + foreach( $this->requestHeaders as $key => $value ) { + if( strlen(trim($key)) > 0 && strlen(trim($value)) > 0 ) { + $requestStrings .= $key . ": " . $value . "\r\n"; + } + } + $requestStrings .= "Connection: close\r\n\r\n"; + if( strlen($contents) > 0 ) { + $requestStrings .= $contents."\r\n\r\n"; + } + return $requestStrings; + } + /** + * レスポンス文字列をヘッダとボディに分割します + */ + function _convertResponse( $responseText ) { + // レスポンスヘッダ文字列(最初のCRLFCRLFまで)を取得 + $globalHeaderStr = substr( $responseText, 0, strpos($responseText,"\r\n\r\n")); + $globalHeaders = explode("\r\n",$globalHeaderStr); + // レスポンスステータスを確認 + $responseStatus = array_shift($globalHeaders); + $responseStatusElms = explode(" ",$responseStatus); + $this->responseProtocol = array_shift($responseStatusElms); + $this->statusCode = array_shift($responseStatusElms); + $this->statusMessage = implode(' ',$responseStatusElms); + // ヘッダをハッシュに格納 + foreach($globalHeaders as $line){ + if( strlen($line) > 0 ) { + $headers = explode(":",$line); + if( count($headers) > 0 ) { + $key = array_shift($headers); + $val = implode(':',$headers); + $this->responseHeaders[trim($key)] = trim($val); + } + } + } + // ボディの解析 + if( $this->responseHeaders['Transfer-Encoding'] == 'chunked' ) { + $hexHeaderStr = bin2hex($globalHeaderStr."\r\n\r\n"); + $hexSeparator = bin2hex("\r\n"); + $bodyStartPos = strlen($hexHeaderStr); + $hexBodyStr = bin2hex($responseText); + $hexBodyStr = substr($hexBodyStr,$bodyStartPos); + $bodyChunkArray = explode($hexSeparator,$hexBodyStr); + // 0,2,4,..偶数はチャンクサイズなので削除してつなげ直す + $i = 0; + $hexBodyStr = ''; + foreach( $bodyChunkArray as $val ) { + if( $i%2 != 0 ) { $hexBodyStr .= $val; } + $i++; + } + $this->responseBody = pack("H*",$hexBodyStr); + } else { + $lines = explode("\r\n\r\n",$responseText); + $globalHeaderStr = array_shift($lines); + $responseBody = implode("\r\n\r\n",$lines); + $this->responseBody = $responseBody; + } + } +} +?> \ No newline at end of file