123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314 |
- <?php
- /**********************************************************\
- | |
- | hprose |
- | |
- | Official WebSite: http://www.hprose.com/ |
- | http://www.hprose.net/ |
- | http://www.hprose.org/ |
- | |
- \**********************************************************/
- /**********************************************************\
- * *
- * HproseHttpClient.php *
- * *
- * hprose http client library for php5. *
- * *
- * LastModified: Nov 12, 2013 *
- * Author: Ma Bingyao <andot@hprfc.com> *
- * *
- \**********************************************************/
- require_once('HproseCommon.php');
- require_once('HproseIO.php');
- require_once('HproseClient.php');
- abstract class HproseBaseHttpClient extends HproseClient {
- protected $host;
- protected $path;
- protected $secure;
- protected $proxy;
- protected $header;
- protected $timeout;
- protected $keepAlive;
- protected $keepAliveTimeout;
- protected static $cookieManager = array();
- static function hproseKeepCookieInSession() {
- $_SESSION['HPROSE_COOKIE_MANAGER'] = self::$cookieManager;
- }
- public static function keepSession() {
- if (array_key_exists('HPROSE_COOKIE_MANAGER', $_SESSION)) {
- self::$cookieManager = $_SESSION['HPROSE_COOKIE_MANAGER'];
- }
- register_shutdown_function(array('HproseBaseHttpClient', 'hproseKeepCookieInSession'));
- }
- protected function setCookie($headers) {
- foreach ($headers as $header) {
- @list($name, $value) = explode(':', $header, 2);
- if (strtolower($name) == 'set-cookie' ||
- strtolower($name) == 'set-cookie2') {
- $cookies = explode(';', trim($value));
- $cookie = array();
- list($name, $value) = explode('=', trim($cookies[0]), 2);
- $cookie['name'] = $name;
- $cookie['value'] = $value;
- for ($i = 1; $i < count($cookies); $i++) {
- list($name, $value) = explode('=', trim($cookies[$i]), 2);
- $cookie[strtoupper($name)] = $value;
- }
- // Tomcat can return SetCookie2 with path wrapped in "
- if (array_key_exists('PATH', $cookie)) {
- $cookie['PATH'] = trim($cookie['PATH'], '"');
- }
- else {
- $cookie['PATH'] = '/';
- }
- if (array_key_exists('EXPIRES', $cookie)) {
- $cookie['EXPIRES'] = strtotime($cookie['EXPIRES']);
- }
- if (array_key_exists('DOMAIN', $cookie)) {
- $cookie['DOMAIN'] = strtolower($cookie['DOMAIN']);
- }
- else {
- $cookie['DOMAIN'] = $this->host;
- }
- $cookie['SECURE'] = array_key_exists('SECURE', $cookie);
- if (!array_key_exists($cookie['DOMAIN'], self::$cookieManager)) {
- self::$cookieManager[$cookie['DOMAIN']] = array();
- }
- self::$cookieManager[$cookie['DOMAIN']][$cookie['name']] = $cookie;
- }
- }
- }
- protected abstract function formatCookie($cookies);
- protected function getCookie() {
- $cookies = array();
- foreach (self::$cookieManager as $domain => $cookieList) {
- if (strpos($this->host, $domain) !== false) {
- $names = array();
- foreach ($cookieList as $cookie) {
- if (array_key_exists('EXPIRES', $cookie) && (time() > $cookie['EXPIRES'])) {
- $names[] = $cookie['name'];
- }
- elseif (strpos($this->path, $cookie['PATH']) === 0) {
- if ((($this->secure && $cookie['SECURE']) ||
- !$cookie['SECURE']) && !is_null($cookie['value'])) {
- $cookies[] = $cookie['name'] . '=' . $cookie['value'];
- }
- }
- }
- foreach ($names as $name) {
- unset(self::$cookieManager[$domain][$name]);
- }
- }
- }
- return $this->formatCookie($cookies);
- }
- public function __construct($url = '') {
- parent::__construct($url);
- $this->header = array('Content-type' => 'application/hprose');
- }
- public function useService($url = '', $namespace = '') {
- $serviceProxy = parent::useService($url, $namespace);
- if ($url) {
- $url = parse_url($url);
- $this->secure = (strtolower($url['scheme']) == 'https');
- $this->host = strtolower($url['host']);
- $this->path = $url['path'];
- $this->timeout = 30000;
- $this->keepAlive = false;
- $this->keepAliveTimeout = 300;
- }
- return $serviceProxy;
- }
- public function setHeader($name, $value) {
- $lname = strtolower($name);
- if ($lname != 'content-type' &&
- $lname != 'content-length' &&
- $lname != 'host') {
- if ($value) {
- $this->header[$name] = $value;
- }
- else {
- unset($this->header[$name]);
- }
- }
- }
- public function setProxy($proxy = NULL) {
- $this->proxy = $proxy;
- }
- public function setTimeout($timeout) {
- $this->timeout = $timeout;
- }
- public function getTimeout() {
- return $this->timeout;
- }
- public function setKeepAlive($keepAlive = true) {
- $this->keepAlive = $keepAlive;
- }
- public function getKeepAlive() {
- return $this->keeepAlive;
- }
- public function setKeepAliveTimeout($timeout) {
- $this->keepAliveTimeout = $timeout;
- }
- public function getKeepAliveTimeout() {
- return $this->keepAliveTimeout;
- }
- }
- if (class_exists('SaeFetchurl')) {
- class HproseHttpClient extends HproseBaseHttpClient {
- protected function formatCookie($cookies) {
- if (count($cookies) > 0) {
- return implode('; ', $cookies);
- }
- return '';
- }
- protected function send($request) {
- $f = new SaeFetchurl();
- $cookie = $this->getCookie();
- if ($cookie != '') {
- $f->setHeader("Cookie", $cookie);
- }
- if ($this->keepAlive) {
- $f->setHeader("Connection", "keep-alive");
- $f->setHeader("Keep-Alive", $this->keepAliveTimeout);
- }
- else {
- $f->setHeader("Connection", "close");
- }
- foreach ($this->header as $name => $value) {
- $f->setHeader($name, $value);
- }
- $f->setMethod("post");
- $f->setPostData($request);
- $f->setConnectTimeout($this->timeout);
- $f->setSendTimeout($this->timeout);
- $f->setReadTimeout($this->timeout);
- $response = $f->fetch($this->url);
- if ($f->errno()) {
- throw new HproseException($f->errno() . ": " . $f->errmsg());
- }
- $http_response_header = $f->responseHeaders(false);
- $this->setCookie($http_response_header);
- return $response;
- }
- }
- }
- elseif (function_exists('curl_init')) {
- class HproseHttpClient extends HproseBaseHttpClient {
- private $curl;
- protected function formatCookie($cookies) {
- if (count($cookies) > 0) {
- return "Cookie: " . implode('; ', $cookies);
- }
- return '';
- }
- public function __construct($url = '') {
- parent::__construct($url);
- $this->curl = curl_init();
- }
- protected function send($request) {
- curl_setopt($this->curl, CURLOPT_URL, $this->url);
- curl_setopt($this->curl, CURLOPT_HEADER, TRUE);
- curl_setopt($this->curl, CURLOPT_SSL_VERIFYPEER, FALSE);
- curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, TRUE);
- curl_setopt($this->curl, CURLOPT_POST, TRUE);
- curl_setopt($this->curl, CURLOPT_POSTFIELDS, $request);
- $headers_array = array($this->getCookie(),
- "Content-Length: " . strlen($request));
- if ($this->keepAlive) {
- $headers_array[] = "Connection: keep-alive";
- $headers_array[] = "Keep-Alive: " . $this->keepAliveTimeout;
- }
- else {
- $headers_array[] = "Connection: close";
- }
- foreach ($this->header as $name => $value) {
- $headers_array[] = $name . ": " . $value;
- }
- curl_setopt($this->curl, CURLOPT_HTTPHEADER, $headers_array);
- if ($this->proxy) {
- curl_setopt($this->curl, CURLOPT_PROXY, $this->proxy);
- }
- if (defined(CURLOPT_TIMEOUT_MS)) {
- curl_setopt($this->curl, CURLOPT_TIMEOUT_MS, $this->timeout);
- }
- else {
- curl_setopt($this->curl, CURLOPT_TIMEOUT, $this->timeout / 1000);
- }
- $response = curl_exec($this->curl);
- $errno = curl_errno($this->curl);
- if ($errno) {
- throw new HproseException($errno . ": " . curl_error($this->curl));
- }
- do {
- list($response_headers, $response) = explode("\r\n\r\n", $response, 2);
- $http_response_header = explode("\r\n", $response_headers);
- $http_response_firstline = array_shift($http_response_header);
- if (preg_match('@^HTTP/[0-9]\.[0-9]\s([0-9]{3})\s(.*)@',
- $http_response_firstline, $matches)) {
- $response_code = $matches[1];
- $response_status = trim($matches[2]);
- }
- else {
- $response_code = "500";
- $response_status = "Unknown Error.";
- }
- } while (substr($response_code, 0, 1) == "1");
- if ($response_code != '200') {
- throw new HproseException($response_code . ": " . $response_status);
- }
- $this->setCookie($http_response_header);
- return $response;
- }
- public function __destruct() {
- curl_close($this->curl);
- }
- }
- }
- else {
- class HproseHttpClient extends HproseBaseHttpClient {
- protected function formatCookie($cookies) {
- if (count($cookies) > 0) {
- return "Cookie: " . implode('; ', $cookies) . "\r\n";
- }
- return '';
- }
- public function __errorHandler($errno, $errstr, $errfile, $errline) {
- throw new Exception($errstr, $errno);
- }
- protected function send($request) {
- $opts = array (
- 'http' => array (
- 'method' => 'POST',
- 'header'=> $this->getCookie() .
- "Content-Length: " . strlen($request) . "\r\n" .
- ($this->keepAlive ?
- "Connection: keep-alive\r\n" .
- "Keep-Alive: " . $this->keepAliveTimeout . "\r\n" :
- "Connection: close\r\n"),
- 'content' => $request,
- 'timeout' => $this->timeout / 1000.0,
- ),
- );
- foreach ($this->header as $name => $value) {
- $opts['http']['header'] .= "$name: $value\r\n";
- }
- if ($this->proxy) {
- $opts['http']['proxy'] = $this->proxy;
- $opts['http']['request_fulluri'] = true;
- }
- $context = stream_context_create($opts);
- set_error_handler(array(&$this, '__errorHandler'));
- $response = file_get_contents($this->url, false, $context);
- restore_error_handler();
- $this->setCookie($http_response_header);
- return $response;
- }
- }
- }
- ?>
|