summaryrefslogtreecommitdiffstats
path: root/3rdparty/simpletest/socket.php
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/simpletest/socket.php')
-rwxr-xr-x3rdparty/simpletest/socket.php312
1 files changed, 312 insertions, 0 deletions
diff --git a/3rdparty/simpletest/socket.php b/3rdparty/simpletest/socket.php
new file mode 100755
index 00000000000..06e8ca62d00
--- /dev/null
+++ b/3rdparty/simpletest/socket.php
@@ -0,0 +1,312 @@
+<?php
+/**
+ * base include file for SimpleTest
+ * @package SimpleTest
+ * @subpackage MockObjects
+ * @version $Id: socket.php 1953 2009-09-20 01:26:25Z jsweat $
+ */
+
+/**#@+
+ * 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 {
+ private $error = 'Constructor not chained';
+
+ /**
+ * Sets the error to empty.
+ * @access public
+ */
+ function __construct() {
+ $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('');
+ }
+}
+
+/**
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+class SimpleFileSocket extends SimpleStickyError {
+ private $handle;
+ private $is_open = false;
+ private $sent = '';
+ private $block_size;
+
+ /**
+ * Opens a socket for reading and writing.
+ * @param SimpleUrl $file Target URI to fetch.
+ * @param integer $block_size Size of chunk to read.
+ * @access public
+ */
+ function __construct($file, $block_size = 1024) {
+ parent::__construct();
+ if (! ($this->handle = $this->openFile($file, $error))) {
+ $file_string = $file->asString();
+ $this->setError("Cannot open [$file_string] with [$error]");
+ return;
+ }
+ $this->is_open = true;
+ $this->block_size = $block_size;
+ }
+
+ /**
+ * 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) {
+ 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() {
+ $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() {
+ if (!$this->is_open) return false;
+ $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 SimpleUrl $file SimpleUrl file target.
+ * @param string $error Recipient of error message.
+ * @param integer $timeout Maximum time to wait for connection.
+ * @access protected
+ */
+ protected function openFile($file, &$error) {
+ return @fopen($file->asString(), 'r');
+ }
+}
+
+/**
+ * Wrapper for TCP/IP socket.
+ * @package SimpleTest
+ * @subpackage WebTester
+ */
+class SimpleSocket extends SimpleStickyError {
+ private $handle;
+ private $is_open = false;
+ private $sent = '';
+ private $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 __construct($host, $port, $timeout, $block_size = 255) {
+ parent::__construct();
+ 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
+ */
+ 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 __construct($host, $port, $timeout) {
+ parent::__construct($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