http.php.svn-base

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

SVN-BASE
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 + -
显示快捷键?