diff options
Diffstat (limited to 'test_tools/simpletest/socket.php')
-rw-r--r-- | test_tools/simpletest/socket.php | 216 |
1 files changed, 216 insertions, 0 deletions
diff --git a/test_tools/simpletest/socket.php b/test_tools/simpletest/socket.php new file mode 100644 index 00000000..4c3c592d --- /dev/null +++ b/test_tools/simpletest/socket.php @@ -0,0 +1,216 @@ +<?php + /** + * base include file for SimpleTest + * @package SimpleTest + * @subpackage MockObjects + * @version $Id: socket.php,v 1.23 2004/09/30 16:46:31 lastcraft Exp $ + */ + + /**#@+ + * include SimpleTest files + */ + require_once(dirname(__FILE__) . '/options.php'); + /**#@-*/ + + /** + * Stashes an error for later. Useful for constructors + * until PHP gets exceptions. + * @package SimpleTest + * @subpackage WebTester + */ + class SimpleStickyError { + protected $_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 { + protected $_handle; + protected $_is_open; + protected $_sent; + + /** + * 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. + * @access public + */ + function SimpleSocket($host, $port, $timeout) { + $this->SimpleStickyError(); + $this->_is_open = false; + $this->_sent = ''; + 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; + 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. + * @param integer $block_size Size of chunk to read. + * @return integer Incoming bytes. False + * on error. + * @access public + */ + function read($block_size = 255) { + if ($this->isError() || ! $this->isOpen()) { + return false; + } + $raw = @fread($this->_handle, $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 |