http.php

来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· PHP 代码 · 共 624 行 · 第 1/2 页

PHP
624
字号
<?php
/**
 *  base include file for SimpleTest
 *  @package    SimpleTest
 *  @subpackage WebTester
 *  @version    $Id: http.php 1722 2008-04-07 19:30:56Z lastcraft $
 */

/**#@+
 *  include other SimpleTest class files
 */
require_once(dirname(__FILE__) . '/socket.php');
require_once(dirname(__FILE__) . '/cookies.php');
require_once(dirname(__FILE__) . '/url.php');
/**#@-*/

/**
 *    Creates HTTP headers for the end point of
 *    a HTTP request.
 *    @package SimpleTest
 *    @subpackage WebTester
 */
class SimpleRoute {
    var $_url;
    
    /**
     *    Sets the target URL.
     *    @param SimpleUrl $url   URL as object.
     *    @access public
     */
    function SimpleRoute($url) {
        $this->_url = $url;
    }
    
    /**
     *    Resource name.
     *    @return SimpleUrl        Current url.
     *    @access protected
     */
    function getUrl() {
        return $this->_url;
    }
    
    /**
     *    Creates the first line which is the actual request.
     *    @param string $method   HTTP request method, usually GET.
     *    @return string          Request line content.
     *    @access protected
     */
    function _getRequestLine($method) {
        return $method . ' ' . $this->_url->getPath() .
                $this->_url->getEncodedRequest() . ' HTTP/1.0';
    }
    
    /**
     *    Creates the host part of the request.
     *    @return string          Host line content.
     *    @access protected
     */
    function _getHostLine() {
        $line = 'Host: ' . $this->_url->getHost();
        if ($this->_url->getPort()) {
            $line .= ':' . $this->_url->getPort();
        }
        return $line;
    }
    
    /**
     *    Opens a socket to the route.
     *    @param string $method      HTTP request method, usually GET.
     *    @param integer $timeout    Connection timeout.
     *    @return SimpleSocket       New socket.
     *    @access public
     */
    function &createConnection($method, $timeout) {
        $default_port = ('https' == $this->_url->getScheme()) ? 443 : 80;
        $socket = &$this->_createSocket(
                $this->_url->getScheme() ? $this->_url->getScheme() : 'http',
                $this->_url->getHost(),
                $this->_url->getPort() ? $this->_url->getPort() : $default_port,
                $timeout);
        if (! $socket->isError()) {
            $socket->write($this->_getRequestLine($method) . "\r\n");
            $socket->write($this->_getHostLine() . "\r\n");
            $socket->write("Connection: close\r\n");
        }
        return $socket;
    }
    
    /**
     *    Factory for socket.
     *    @param string $scheme                   Protocol to use.
     *    @param string $host                     Hostname to connect to.
     *    @param integer $port                    Remote port.
     *    @param integer $timeout                 Connection timeout.
     *    @return SimpleSocket/SimpleSecureSocket New socket.
     *    @access protected
     */
    function &_createSocket($scheme, $host, $port, $timeout) {
        if (in_array($scheme, array('https'))) {
            $socket = &new SimpleSecureSocket($host, $port, $timeout);
        } else {
            $socket = &new SimpleSocket($host, $port, $timeout);
        }
        return $socket;
    }
}

/**
 *    Creates HTTP headers for the end point of
 *    a HTTP request via a proxy server.
 *    @package SimpleTest
 *    @subpackage WebTester
 */
class SimpleProxyRoute extends SimpleRoute {
    var $_proxy;
    var $_username;
    var $_password;
    
    /**
     *    Stashes the proxy address.
     *    @param SimpleUrl $url     URL as object.
     *    @param string $proxy      Proxy URL.
     *    @param string $username   Username for autentication.
     *    @param string $password   Password for autentication.
     *    @access public
     */
    function SimpleProxyRoute($url, $proxy, $username = false, $password = false) {
        $this->SimpleRoute($url);
        $this->_proxy = $proxy;
        $this->_username = $username;
        $this->_password = $password;
    }
    
    /**
     *    Creates the first line which is the actual request.
     *    @param string $method   HTTP request method, usually GET.
     *    @param SimpleUrl $url   URL as object.
     *    @return string          Request line content.
     *    @access protected
     */
    function _getRequestLine($method) {
        $url = $this->getUrl();
        $scheme = $url->getScheme() ? $url->getScheme() : 'http';
        $port = $url->getPort() ? ':' . $url->getPort() : '';
        return $method . ' ' . $scheme . '://' . $url->getHost() . $port .
                $url->getPath() . $url->getEncodedRequest() . ' HTTP/1.0';
    }
    
    /**
     *    Creates the host part of the request.
     *    @param SimpleUrl $url   URL as object.
     *    @return string          Host line content.
     *    @access protected
     */
    function _getHostLine() {
        $host = 'Host: ' . $this->_proxy->getHost();
        $port = $this->_proxy->getPort() ? $this->_proxy->getPort() : 8080;
        return "$host:$port";
    }
    
    /**
     *    Opens a socket to the route.
     *    @param string $method       HTTP request method, usually GET.
     *    @param integer $timeout     Connection timeout.
     *    @return SimpleSocket        New socket.
     *    @access public
     */
    function &createConnection($method, $timeout) {
        $socket = &$this->_createSocket(
                $this->_proxy->getScheme() ? $this->_proxy->getScheme() : 'http',
                $this->_proxy->getHost(),
                $this->_proxy->getPort() ? $this->_proxy->getPort() : 8080,
                $timeout);
        if ($socket->isError()) {
            return $socket;
        }
        $socket->write($this->_getRequestLine($method) . "\r\n");
        $socket->write($this->_getHostLine() . "\r\n");
        if ($this->_username && $this->_password) {
            $socket->write('Proxy-Authorization: Basic ' .
                    base64_encode($this->_username . ':' . $this->_password) .
                    "\r\n");
        }
        $socket->write("Connection: close\r\n");
        return $socket;
    }
}

/**
 *    HTTP request for a web page. Factory for
 *    HttpResponse object.
 *    @package SimpleTest
 *    @subpackage WebTester
 */
class SimpleHttpRequest {
    var $_route;
    var $_encoding;
    var $_headers;
    var $_cookies;
    
    /**
     *    Builds the socket request from the different pieces.
     *    These include proxy information, URL, cookies, headers,
     *    request method and choice of encoding.
     *    @param SimpleRoute $route              Request route.
     *    @param SimpleFormEncoding $encoding    Content to send with
     *                                           request.
     *    @access public
     */
    function SimpleHttpRequest(&$route, $encoding) {
        $this->_route = &$route;
        $this->_encoding = $encoding;
        $this->_headers = array();
        $this->_cookies = array();
    }
    
    /**
     *    Dispatches the content to the route's socket.
     *    @param integer $timeout      Connection timeout.
     *    @return SimpleHttpResponse   A response which may only have
     *                                 an error, but hopefully has a
     *                                 complete web page.
     *    @access public
     */
    function &fetch($timeout) {
        $socket = &$this->_route->createConnection($this->_encoding->getMethod(), $timeout);
        if (! $socket->isError()) {
            $this->_dispatchRequest($socket, $this->_encoding);
        }
        $response = &$this->_createResponse($socket);
        return $response;
    }
    
    /**
     *    Sends the headers.
     *    @param SimpleSocket $socket           Open socket.
     *    @param string $method                 HTTP request method,
     *                                          usually GET.
     *    @param SimpleFormEncoding $encoding   Content to send with request.
     *    @access private
     */
    function _dispatchRequest(&$socket, $encoding) {
        foreach ($this->_headers as $header_line) {
            $socket->write($header_line . "\r\n");
        }
        if (count($this->_cookies) > 0) {
            $socket->write("Cookie: " . implode(";", $this->_cookies) . "\r\n");
        }
        $encoding->writeHeadersTo($socket);
        $socket->write("\r\n");
        $encoding->writeTo($socket);
    }
    
    /**
     *    Adds a header line to the request.
     *    @param string $header_line    Text of full header line.
     *    @access public
     */
    function addHeaderLine($header_line) {
        $this->_headers[] = $header_line;
    }
    
    /**
     *    Reads all the relevant cookies from the
     *    cookie jar.
     *    @param SimpleCookieJar $jar     Jar to read
     *    @param SimpleUrl $url           Url to use for scope.
     *    @access public
     */
    function readCookiesFromJar($jar, $url) {
        $this->_cookies = $jar->selectAsPairs($url);
    }
    
    /**
     *    Wraps the socket in a response parser.
     *    @param SimpleSocket $socket   Responding socket.
     *    @return SimpleHttpResponse    Parsed response object.
     *    @access protected
     */
    function &_createResponse(&$socket) {
        $response = &new SimpleHttpResponse(
                $socket,
                $this->_route->getUrl(),
                $this->_encoding);
        return $response;
    }
}

/**
 *    Collection of header lines in the response.
 *    @package SimpleTest
 *    @subpackage WebTester
 */
class SimpleHttpHeaders {
    var $_raw_headers;
    var $_response_code;
    var $_http_version;
    var $_mime_type;
    var $_location;
    var $_cookies;
    var $_authentication;
    var $_realm;
    
    /**
     *    Parses the incoming header block.
     *    @param string $headers     Header block.
     *    @access public
     */
    function SimpleHttpHeaders($headers) {
        $this->_raw_headers = $headers;
        $this->_response_code = false;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?