📄 server.php
字号:
if (!isset($this->headers['Content-Type'])) {
$this->headers['Content-Type'] = 'text/xml; charset=' .
$this->response_encoding;
}
$this->headers['Content-Length'] = strlen($response);
foreach ($this->headers as $k => $v) {
header("$k: $v");
$hdrs .= "$k: $v\r\n";
}
$this->response = $hdrs . "\r\n" . $response;
print $response;
}
function &callMethod($methodname, &$args)
{
if ($this->callHandler) {
$ret = @call_user_func_array($this->callHandler, array($methodname, $args));
return $ret;
}
set_error_handler(array($this, '_errorHandler'));
if ($args) {
/* Call method with parameters. */
if (isset($this->soapobject) && is_object($this->soapobject)) {
$ret = @call_user_func_array(array(&$this->soapobject, $methodname), $args);
} else {
$ret = @call_user_func_array($methodname, $args);
}
} else {
/* Call method withour parameters. */
if (is_object($this->soapobject)) {
$ret = @call_user_func(array(&$this->soapobject, $methodname));
} else {
$ret = @call_user_func($methodname);
}
}
restore_error_handler();
return $ret;
}
/**
* Creates SOAP_Value objects with return values from method.
* Uses method signature to determine type.
*
* @param mixed $method_response The result(s).
* @param array|string $type The type(s) of the return value(s).
* @param string $return_name The name of the return value.
* @param string $namespace The namespace of the return value.
*
* @return array List of SOAP_Value objects.
*/
function buildResult(&$method_response, &$return_type,
$return_name = 'return', $namespace = '')
{
if (is_a($method_response, 'SOAP_Value')) {
$return_val = array($method_response);
} else {
if (is_array($return_type) && is_array($method_response)) {
$i = 0;
foreach ($return_type as $key => $type) {
if (is_numeric($key)) {
$key = 'item';
}
if (is_a($method_response[$i], 'SOAP_Value')) {
$return_val[] =& $method_response[$i++];
} else {
$qn =& new QName($key, $namespace);
$return_val[] =& new SOAP_Value($qn->fqn(), $type, $method_response[$i++]);
}
}
} else {
if (is_array($return_type)) {
$keys = array_keys($return_type);
if (!is_numeric($keys[0])) {
$return_name = $keys[0];
}
$values = array_values($return_type);
$return_type = $values[0];
}
$qn =& new QName($return_name, $namespace);
$return_val = array(new SOAP_Value($qn->fqn(), $return_type, $method_response));
}
}
return $return_val;
}
function parseRequest($data = '', $attachments = null)
{
/* Parse response, get SOAP_Parser object. */
$parser =& new SOAP_Parser($data, $this->xml_encoding, $attachments);
/* If fault occurred during message parsing. */
if ($parser->fault) {
$this->fault = $parser->fault;
return null;
}
/* Handle message headers. */
$request_headers = $parser->getHeaders();
$header_results = array();
if ($request_headers) {
if (!is_a($request_headers, 'SOAP_Value')) {
$this->_raiseSoapFault('Parser did not return SOAP_Value object: ' . $request_headers, '', '', 'Server');
return null;
}
if ($request_headers->value) {
/* Handle headers now. */
foreach ($request_headers->value as $header_val) {
$f_exists = $this->validateMethod($header_val->name, $header_val->namespace);
/* TODO: this does not take into account message routing
* yet. */
$myactor = !$header_val->actor ||
$header_val->actor == 'http://schemas.xmlsoap.org/soap/actor/next' ||
$header_val->actor == $this->endpoint;
if (!$f_exists && $header_val->mustunderstand && $myactor) {
$this->_raiseSoapFault('I don\'t understand header ' . $header_val->name, '', '', 'MustUnderstand');
return null;
}
/* We only handle the header if it's for us. */
$isok = $f_exists && $myactor;
if ($isok) {
/* Call our header now! */
$header_method = $header_val->name;
$header_data = array($this->_decode($header_val));
/* If there are parameters to pass. */
$hr =& $this->callMethod($header_method, $header_data);
if (PEAR::isError($hr)) {
$this->_raiseSoapDefault($hr);
return null;
}
$results = $this->buildResult($hr, $this->return_type, $header_method, $header_val->namespace);
$header_results[] = $results[0];
}
}
}
}
/* Handle the method call. */
/* Evaluate message, getting back a SOAP_Value object. */
$this->call_methodname = $this->methodname = $parser->root_struct_name[0];
/* Figure out the method namespace. */
$this->method_namespace = $parser->message[$parser->root_struct[0]]['namespace'];
if ($this->_wsdl) {
$this->_setSchemaVersion($this->_wsdl->xsd);
$dataHandler = $this->_wsdl->getDataHandler($this->methodname, $this->method_namespace);
if ($dataHandler)
$this->call_methodname = $this->methodname = $dataHandler;
$this->_portName = $this->_wsdl->getPortName($this->methodname);
if (PEAR::isError($this->_portName)) {
$this->_raiseSoapFault($this->_portName);
return null;
}
$opData = $this->_wsdl->getOperationData($this->_portName, $this->methodname);
if (PEAR::isError($opData)) {
$this->_raiseSoapFault($opData);
return null;
}
$this->__options['style'] = $opData['style'];
$this->__options['use'] = $opData['output']['use'];
$this->__options['parameters'] = $opData['parameters'];
}
/* Does method exist? */
if (!$this->methodname ||
!$this->validateMethod($this->methodname, $this->method_namespace)) {
$this->_raiseSoapFault('method "' . $this->method_namespace . $this->methodname . '" not defined in service', '', '', 'Server');
return null;
}
if (!$request_val = $parser->getResponse()) {
return null;
}
if (!is_a($request_val, 'SOAP_Value')) {
$this->_raiseSoapFault('Parser did not return SOAP_Value object: ' . $request_val, '', '', 'Server');
return null;
}
/* Verify that SOAP_Value objects in request match the methods
* signature. */
if (!$this->verifyMethod($request_val)) {
/* verifyMethod() creates the fault. */
return null;
}
/* Need to set special error detection inside the value class to
* differentiate between no params passed, and an error decoding. */
$request_data = $this->__decodeRequest($request_val);
if (PEAR::isError($request_data)) {
$this->_raiseSoapFault($request_data);
return null;
}
$method_response =& $this->callMethod($this->call_methodname, $request_data);
if (PEAR::isError($method_response)) {
$this->_raiseSoapFault($method_response);
return null;
}
if ($this->__options['parameters'] ||
!$method_response ||
$this->__options['style']=='rpc') {
/* Get the method result. */
if (is_null($method_response)) {
$return_val = null;
} else {
$return_val = $this->buildResult($method_response, $this->return_type);
}
$qn =& new QName($this->methodname . 'Response', $this->method_namespace);
$methodValue =& new SOAP_Value($qn->fqn(), 'Struct', $return_val);
} else {
$methodValue =& $method_response;
}
return $this->_makeEnvelope($methodValue, $header_results, $this->response_encoding);
}
function &__decodeRequest($request, $shift = false)
{
if (!$request) {
$decoded = null;
return $decoded;
}
/* Check for valid response. */
if (PEAR::isError($request)) {
$fault = &$this->_raiseSoapFault($request);
return $fault;
} else if (!is_a($request, 'SOAP_Value')) {
$fault = &$this->_raiseSoapFault('Invalid data in server::__decodeRequest');
return $fault;
}
/* Decode to native php datatype. */
$requestArray = $this->_decode($request);
/* Fault? */
if (PEAR::isError($requestArray)) {
$fault = &$this->_raiseSoapFault($requestArray);
return $fault;
}
if (is_object($requestArray) &&
get_class($requestArray) == 'stdClass') {
$requestArray = get_object_vars($requestArray);
} elseif ($this->__options['style'] == 'document') {
$requestArray = array($requestArray);
}
if (is_array($requestArray)) {
if (isset($requestArray['faultcode']) ||
isset($requestArray['SOAP-ENV:faultcode'])) {
$faultcode = $faultstring = $faultdetail = $faultactor = '';
foreach ($requestArray as $k => $v) {
if (stristr($k, 'faultcode')) {
$faultcode = $v;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -