[Frameworkspider-svn] spider-commit [106] 1) setタグクラスの修正をおこないました。第二引数全体が '' で囲まれていた場合、文字列判断はPHPプログラム

Back to archive index

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 &copy; 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



Frameworkspider-svn メーリングリストの案内
Back to archive index