Spaces:
Sleeping
Sleeping
| /** | |
| * This file contains the code for a TCP transport layer. | |
| * | |
| * PHP versions 4 and 5 | |
| * | |
| * LICENSE: This source file is subject to version 2.02 of the PHP license, | |
| * that is bundled with this package in the file LICENSE, and is available at | |
| * through the world-wide-web at http://www.php.net/license/2_02.txt. If you | |
| * did not receive a copy of the PHP license and are unable to obtain it | |
| * through the world-wide-web, please send a note to license@php.net so we can | |
| * mail you a copy immediately. | |
| * | |
| * @category Web Services | |
| * @package SOAP | |
| * @author Shane Hanna <iordy_at_iordy_dot_com> | |
| * @author Jan Schneider <jan@horde.org> | |
| * @copyright 2003-2006 The PHP Group | |
| * @license http://www.php.net/license/2_02.txt PHP License 2.02 | |
| * @link http://pear.php.net/package/SOAP | |
| */ | |
| require_once 'SOAP/Transport.php'; | |
| /** | |
| * TCP transport for SOAP. | |
| * | |
| * @todo use Net_Socket; implement some security scheme; implement support | |
| * for attachments | |
| * @access public | |
| * @package SOAP | |
| * @author Shane Hanna <iordy_at_iordy_dot_com> | |
| * @author Jan Schneider <jan@horde.org> | |
| */ | |
| class SOAP_Transport_TCP extends SOAP_Transport | |
| { | |
| /** | |
| * Socket. | |
| */ | |
| var $socket = null; | |
| /** | |
| * Constructor. | |
| * | |
| * @param string $url HTTP url to SOAP endpoint. | |
| * | |
| * @access public | |
| */ | |
| function SOAP_Transport_TCP($url, $encoding = SOAP_DEFAULT_ENCODING) | |
| { | |
| parent::SOAP_Base_Object('TCP'); | |
| $this->urlparts = @parse_url($url); | |
| $this->url = $url; | |
| $this->encoding = $encoding; | |
| } | |
| function _socket_ping() | |
| { | |
| // XXX how do we restart after socket_shutdown? | |
| //if (!$this->socket) { | |
| // Create socket resource. | |
| $this->socket = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP); | |
| if ($this->socket < 0) { | |
| return 0; | |
| } | |
| // Connect. | |
| $result = socket_connect($this->socket, $this->urlparts['host'], | |
| $this->urlparts['port']); | |
| if ($result < 0) { | |
| return 0; | |
| } | |
| //} | |
| return 1; | |
| } | |
| /** | |
| * Sends and receives SOAP data. | |
| * | |
| * @access public | |
| * | |
| * @param string Outgoing SOAP data. | |
| * @param array Options. | |
| * | |
| * @return string|SOAP_Fault | |
| */ | |
| function send($msg, $options = array()) | |
| { | |
| $this->fault = null; | |
| $this->incoming_payload = ''; | |
| $this->outgoing_payload = $msg; | |
| if (!$this->_validateUrl()) { | |
| return $this->fault; | |
| } | |
| // Check for TCP scheme. | |
| if (strcasecmp($this->urlparts['scheme'], 'TCP') == 0) { | |
| // Check connection. | |
| if (!$this->_socket_ping()) { | |
| return $this->_raiseSoapFault('Error connecting to ' . $this->url . '; reason: ' . socket_strerror(socket_last_error($this->socket))); | |
| } | |
| // Write to the socket. | |
| if (!@socket_write($this->socket, $this->outgoing_payload, | |
| strlen($this->outgoing_payload))) { | |
| return $this->_raiseSoapFault('Error sending data to ' . $this->url . '; reason: ' . socket_strerror(socket_last_error($this->socket))); | |
| } | |
| // Shutdown writing. | |
| if(!socket_shutdown($this->socket, 1)) { | |
| return $this->_raiseSoapFault('Cannot change socket mode to read.'); | |
| } | |
| // Read everything we can. | |
| while ($buf = @socket_read($this->socket, 1024, PHP_BINARY_READ)) { | |
| $this->incoming_payload .= $buf; | |
| } | |
| // Return payload or die. | |
| if ($this->incoming_payload) { | |
| return $this->incoming_payload; | |
| } | |
| return $this->_raiseSoapFault('Error reveiving data from ' . $this->url); | |
| } | |
| return $this->_raiseSoapFault('Invalid url scheme ' . $this->url); | |
| } | |
| /** | |
| * Validates the url data passed to the constructor. | |
| * | |
| * @return boolean | |
| * @access private | |
| */ | |
| function _validateUrl() | |
| { | |
| if (!is_array($this->urlparts) ) { | |
| $this->_raiseSoapFault("Unable to parse URL $this->url"); | |
| return false; | |
| } | |
| if (!isset($this->urlparts['host'])) { | |
| $this->_raiseSoapFault("No host in URL $this->url"); | |
| return false; | |
| } | |
| if (!isset($this->urlparts['path']) || !$this->urlparts['path']) { | |
| $this->urlparts['path'] = '/'; | |
| } | |
| return true; | |
| } | |
| } | |