diff options
Diffstat (limited to 'vendors/simpletest/socket.php')
| -rw-r--r-- | vendors/simpletest/socket.php | 216 | 
1 files changed, 216 insertions, 0 deletions
| diff --git a/vendors/simpletest/socket.php b/vendors/simpletest/socket.php new file mode 100644 index 000000000..3ad5a9ff4 --- /dev/null +++ b/vendors/simpletest/socket.php @@ -0,0 +1,216 @@ +<?php +/** + *  base include file for SimpleTest + *  @package    SimpleTest + *  @subpackage MockObjects + *  @version    $Id: socket.php 1723 2008-04-08 00:34:10Z lastcraft $ + */ + +/**#@+ + * include SimpleTest files + */ +require_once(dirname(__FILE__) . '/compatibility.php'); +/**#@-*/ + +/** + *    Stashes an error for later. Useful for constructors + *    until PHP gets exceptions. + *    @package SimpleTest + *    @subpackage WebTester + */ +class SimpleStickyError { +    var $_error = 'Constructor not chained'; + +    /** +     *    Sets the error to empty. +     *    @access public +     */ +    function SimpleStickyError() { +        $this->_clearError(); +    } + +    /** +     *    Test for an outstanding error. +     *    @return boolean           True if there is an error. +     *    @access public +     */ +    function isError() { +        return ($this->_error != ''); +    } + +    /** +     *    Accessor for an outstanding error. +     *    @return string     Empty string if no error otherwise +     *                       the error message. +     *    @access public +     */ +    function getError() { +        return $this->_error; +    } + +    /** +     *    Sets the internal error. +     *    @param string       Error message to stash. +     *    @access protected +     */ +    function _setError($error) { +        $this->_error = $error; +    } + +    /** +     *    Resets the error state to no error. +     *    @access protected +     */ +    function _clearError() { +        $this->_setError(''); +    } +} + +/** + *    Wrapper for TCP/IP socket. + *    @package SimpleTest + *    @subpackage WebTester + */ +class SimpleSocket extends SimpleStickyError { +    var $_handle; +    var $_is_open = false; +    var $_sent = ''; +    var $lock_size; + +    /** +     *    Opens a socket for reading and writing. +     *    @param string $host          Hostname to send request to. +     *    @param integer $port         Port on remote machine to open. +     *    @param integer $timeout      Connection timeout in seconds. +     *    @param integer $block_size   Size of chunk to read. +     *    @access public +     */ +    function SimpleSocket($host, $port, $timeout, $block_size = 255) { +        $this->SimpleStickyError(); +        if (! ($this->_handle = $this->_openSocket($host, $port, $error_number, $error, $timeout))) { +            $this->_setError("Cannot open [$host:$port] with [$error] within [$timeout] seconds"); +            return; +        } +        $this->_is_open = true; +        $this->_block_size = $block_size; +        SimpleTestCompatibility::setTimeout($this->_handle, $timeout); +    } + +    /** +     *    Writes some data to the socket and saves alocal copy. +     *    @param string $message       String to send to socket. +     *    @return boolean              True if successful. +     *    @access public +     */ +    function write($message) { +        if ($this->isError() || ! $this->isOpen()) { +            return false; +        } +        $count = fwrite($this->_handle, $message); +        if (! $count) { +            if ($count === false) { +                $this->_setError('Cannot write to socket'); +                $this->close(); +            } +            return false; +        } +        fflush($this->_handle); +        $this->_sent .= $message; +        return true; +    } + +    /** +     *    Reads data from the socket. The error suppresion +     *    is a workaround for PHP4 always throwing a warning +     *    with a secure socket. +     *    @return integer/boolean           Incoming bytes. False +     *                                     on error. +     *    @access public +     */ +    function read() { +        if ($this->isError() || ! $this->isOpen()) { +            return false; +        } +        $raw = @fread($this->_handle, $this->_block_size); +        if ($raw === false) { +            $this->_setError('Cannot read from socket'); +            $this->close(); +        } +        return $raw; +    } + +    /** +     *    Accessor for socket open state. +     *    @return boolean           True if open. +     *    @access public +     */ +    function isOpen() { +        return $this->_is_open; +    } + +    /** +     *    Closes the socket preventing further reads. +     *    Cannot be reopened once closed. +     *    @return boolean           True if successful. +     *    @access public +     */ +    function close() { +        $this->_is_open = false; +        return fclose($this->_handle); +    } + +    /** +     *    Accessor for content so far. +     *    @return string        Bytes sent only. +     *    @access public +     */ +    function getSent() { +        return $this->_sent; +    } + +    /** +     *    Actually opens the low level socket. +     *    @param string $host          Host to connect to. +     *    @param integer $port         Port on host. +     *    @param integer $error_number Recipient of error code. +     *    @param string $error         Recipoent of error message. +     *    @param integer $timeout      Maximum time to wait for connection. +     *    @access protected +     */ +    function _openSocket($host, $port, &$error_number, &$error, $timeout) { +        return @fsockopen($host, $port, $error_number, $error, $timeout); +    } +} + +/** + *    Wrapper for TCP/IP socket over TLS. + *    @package SimpleTest + *    @subpackage WebTester + */ +class SimpleSecureSocket extends SimpleSocket { + +    /** +     *    Opens a secure socket for reading and writing. +     *    @param string $host      Hostname to send request to. +     *    @param integer $port     Port on remote machine to open. +     *    @param integer $timeout  Connection timeout in seconds. +     *    @access public +     */ +    function SimpleSecureSocket($host, $port, $timeout) { +        $this->SimpleSocket($host, $port, $timeout); +    } + +    /** +     *    Actually opens the low level socket. +     *    @param string $host          Host to connect to. +     *    @param integer $port         Port on host. +     *    @param integer $error_number Recipient of error code. +     *    @param string $error         Recipient of error message. +     *    @param integer $timeout      Maximum time to wait for connection. +     *    @access protected +     */ +    function _openSocket($host, $port, &$error_number, &$error, $timeout) { +        return parent::_openSocket("tls://$host", $port, $error_number, $error, $timeout); +    } +} +?>
\ No newline at end of file | 
