107 lines
3.5 KiB
PHP
107 lines
3.5 KiB
PHP
|
|
<?php
|
||
|
|
/**
|
||
|
|
* This file contains the code for the TCP SOAP server.
|
||
|
|
*
|
||
|
|
* 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 Caraveo <Shane@Caraveo.com> Port to PEAR and more
|
||
|
|
* @copyright 2003-2005 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/Server.php';
|
||
|
|
|
||
|
|
/**
|
||
|
|
* SOAP Server Class that implements a TCP SOAP Server.
|
||
|
|
* http://www.pocketsoap.com/specs/smtpbinding/
|
||
|
|
*
|
||
|
|
* This class overrides the default HTTP server, providing the ability to
|
||
|
|
* accept socket connections and execute SOAP calls.
|
||
|
|
*
|
||
|
|
* TODO:
|
||
|
|
* use Net_Socket
|
||
|
|
* implement some security scheme
|
||
|
|
* implement support for attachments
|
||
|
|
*
|
||
|
|
* @access public
|
||
|
|
* @package SOAP
|
||
|
|
* @author Shane Caraveo <shane@php.net>
|
||
|
|
*/
|
||
|
|
class SOAP_Server_TCP extends SOAP_Server {
|
||
|
|
|
||
|
|
var $headers = array();
|
||
|
|
var $localaddr;
|
||
|
|
var $port;
|
||
|
|
var $listen;
|
||
|
|
var $reuse;
|
||
|
|
|
||
|
|
function SOAP_Server_TCP($localaddr = '127.0.0.1', $port = 10000,
|
||
|
|
$listen = 5, $reuse = true)
|
||
|
|
{
|
||
|
|
parent::SOAP_Server();
|
||
|
|
$this->localaddr = $localaddr;
|
||
|
|
$this->port = $port;
|
||
|
|
$this->listen = $listen;
|
||
|
|
$this->reuse = $reuse;
|
||
|
|
}
|
||
|
|
|
||
|
|
function run()
|
||
|
|
{
|
||
|
|
if (($sock = socket_create(AF_INET, SOCK_STREAM, 0)) < 0) {
|
||
|
|
return $this->_raiseSoapFault('socket_create() failed. Reason: ' . socket_strerror($sock));
|
||
|
|
}
|
||
|
|
if ($this->reuse &&
|
||
|
|
!@socket_setopt($sock, SOL_SOCKET, SO_REUSEADDR, 1)) {
|
||
|
|
return $this->_raiseSoapFault('socket_setopt() failed. Reason: ' . socket_strerror(socket_last_error($sock)));
|
||
|
|
}
|
||
|
|
if (($ret = socket_bind($sock, $this->localaddr, $this->port)) < 0) {
|
||
|
|
return $this->_raiseSoapFault('socket_bind() failed. Reason: ' . socket_strerror($ret));
|
||
|
|
}
|
||
|
|
if (($ret = socket_listen($sock, $this->listen)) < 0) {
|
||
|
|
return $this->_raiseSoapFault('socket_listen() failed. Reason: ' . socket_strerror($ret));
|
||
|
|
}
|
||
|
|
|
||
|
|
while (true) {
|
||
|
|
$data = null;
|
||
|
|
if (($msgsock = socket_accept($sock)) < 0) {
|
||
|
|
$this->_raiseSoapFault('socket_accept() failed. Reason: ' . socket_strerror($msgsock));
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
while ($buf = socket_read($msgsock, 8192)) {
|
||
|
|
if (!$buf = trim($buf)) {
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
$data .= $buf;
|
||
|
|
}
|
||
|
|
|
||
|
|
if ($data) {
|
||
|
|
$response = $this->service($data);
|
||
|
|
/* Write to the socket. */
|
||
|
|
if (!socket_write($msgsock, $response, strlen($response))) {
|
||
|
|
return $this->_raiseSoapFault('Error sending response data reason ' . socket_strerror());
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
socket_close ($msgsock);
|
||
|
|
}
|
||
|
|
|
||
|
|
socket_close ($sock);
|
||
|
|
}
|
||
|
|
|
||
|
|
function service(&$data)
|
||
|
|
{
|
||
|
|
/* TODO: we need to handle attachments somehow. */
|
||
|
|
return $this->parseRequest($data, $attachments);
|
||
|
|
}
|
||
|
|
}
|