⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 server.php

📁 PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。
💻 PHP
📖 第 1 页 / 共 3 页
字号:
<?php
/**
 * This file contains the code for the 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     Dietrich Ayala <dietrich@ganx4.com> Original Author
 * @author     Shane Caraveo <Shane@Caraveo.com>   Port to PEAR and more
 * @author     Chuck Hagenbuch <chuck@horde.org>   Maintenance
 * @author     Jan Schneider <jan@horde.org>       Maintenance
 * @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/Base.php';
require_once 'SOAP/Fault.php';
require_once 'SOAP/Parser.php';
require_once 'SOAP/Value.php';
require_once 'SOAP/WSDL.php';

/**
 * SOAP Server Class
 *
 * Originaly based on SOAPx4 by Dietrich Ayala
 * http://dietrich.ganx4.com/soapx4
 *
 * @access   public
 * @package  SOAP
 * @author   Shane Caraveo <shane@php.net> Conversion to PEAR and updates
 * @author   Dietrich Ayala <dietrich@ganx4.com> Original Author
 */
class SOAP_Server extends SOAP_Base
{
    /**
     *
     * @var array
     */
    var $dispatch_map = array(); // create empty dispatch map
    var $dispatch_objects = array();
    var $soapobject = null;
    var $call_methodname = null;
    var $callHandler = null;
    var $callValidation = true;

    /**
     * A list of headers that are going to be sent back to the client.
     *
     * @var array
     */
    var $headers = array();

    /**
     *
     * @var string
     */
    var $request = '';

    /**
     *
     * @var string  XML-Encoding
     */
    var $xml_encoding = SOAP_DEFAULT_ENCODING;
    var $response_encoding = 'UTF-8';

    var $result = 'successful'; // for logging interop results to db

    var $endpoint = ''; // the uri to ME!

    var $service = ''; //soapaction header
    var $method_namespace = null;
    var $__options = array('use' => 'encoded',
                           'style' => 'rpc',
                           'parameters' => 0,
                           'http_status_success' => '200 OK',
                           'http_status_fault' => '500 SOAP Fault');

    function SOAP_Server($options = null)
    {
        ini_set('track_errors', 1);
        parent::SOAP_Base('Server');

        if (is_array($options)) {
            if (isset($options['use'])) {
                $this->__options['use'] = $options['use'];
            }
            if (isset($options['style'])) {
                $this->__options['style'] = $options['style'];
            }
            if (isset($options['parameters'])) {
                $this->__options['parameters'] = $options['parameters'];
            }
        }
        // assume we encode with section 5
        $this->_section5 = true;
        if ($this->__options['use']=='literal') {
            $this->_section5 = false;
        }
    }

    /**
     * Error handler for errors that happen in proxied methods.
     *
     * To always return a valid SOAP response even on errors that don't happen
     * in this code, the errors are catched, transformed to a SOAP fault and
     * immediately sent to the client.
     *
     * @see http://www.php.net/set_error_handler
     */
    function _errorHandler($errno, $errmsg, $filename, $linenum, $vars)
    {
        /* The error handler should ignore '0' errors, eg. hidden by @ - see
         * the set_error_handler manual page. (thanks to Alan Knowles). */
        if (!$errno || $errno == E_NOTICE ||
            (defined('E_STRICT') && $errno == constant('E_STRICT'))) {
            return;
        }

        $this->fault =& new SOAP_Fault($errmsg, 'Server', 'PHP', "Errno: $errno\nFilename: $filename\nLineno: $linenum\n");

        $this->_sendResponse();
        exit;
    }

    function _getContentEncoding($content_type)
    {
        /* Get the character encoding of the incoming request treat incoming
         * data as UTF-8 if no encoding set. */
        $this->xml_encoding = 'UTF-8';
        if (strpos($content_type, '=')) {
            $enc = strtoupper(str_replace('"', '', substr(strstr($content_type, '='), 1)));
            if (!in_array($enc, $this->_encodings)) {
                return false;
            }
            $this->xml_encoding = $enc;
        }

        return true;
    }


    /**
     * Parses request and posts response.
     */
    function service($data, $endpoint = '', $test = false)
    {
        $response = null;
        $attachments = array();
        $useEncoding = 'DIME';

        /* Figure out our endpoint. */
        $this->endpoint = $endpoint;
        if (!$test && !$this->endpoint) {
            /* We'll try to build our endpoint. */
            $this->endpoint = 'http://' . $_SERVER['SERVER_NAME'];
            if ($_SERVER['SERVER_PORT']) {
                $this->endpoint .= ':' . $_SERVER['SERVER_PORT'];
            }
            $this->endpoint .= $_SERVER['SCRIPT_NAME'];
        }

        /* Get the character encoding of the incoming request treat incoming
         * data as UTF-8 if no encoding set. */
        if (isset($_SERVER['CONTENT_TYPE'])) {
            if (strcasecmp($_SERVER['CONTENT_TYPE'], 'application/dime') == 0) {
                $this->_decodeDIMEMessage($data, $headers, $attachments);
                $useEncoding = 'DIME';
            } elseif (stristr($_SERVER['CONTENT_TYPE'], 'multipart/related')) {
                /* This is a mime message, let's decode it. */
                $data = 'Content-Type: ' .
                    stripslashes($_SERVER['CONTENT_TYPE']) .
                    "\r\n\r\n" . $data;
                $this->_decodeMimeMessage($data, $headers, $attachments);
                $useEncoding = 'Mime';
            }
            if (!isset($headers['content-type'])) {
                $headers['content-type'] = stripslashes($_SERVER['CONTENT_TYPE']);
            }
            if (!$this->fault &&
                !$this->_getContentEncoding($headers['content-type'])) {
                $this->xml_encoding = SOAP_DEFAULT_ENCODING;
                /* Found encoding we don't understand; return a fault. */
                $this->_raiseSoapFault('Unsupported encoding, use one of ISO-8859-1, US-ASCII, UTF-8', '', '', 'Server');
            }
        }

        /* If this is not a POST with Content-Type text/xml, try to return a
         * WSDL file. */
        if (!$this->fault && !$test &&
            ($_SERVER['REQUEST_METHOD'] != 'POST' ||
             strncmp($headers['content-type'], 'text/xml', 8) != 0)) {
            /* This is not possibly a valid SOAP request, try to return a WSDL
             * file. */
            $this->_raiseSoapFault('Invalid SOAP request, must be POST with content-type: text/xml, got: ' . (isset($headers['content-type']) ? $headers['content-type'] : 'Nothing!'), '', '', 'Server');
        }

        if (!$this->fault) {
            /* $response is a SOAP_Msg object. */
            $soap_msg = $this->parseRequest($data, $attachments);

            /* Handle Mime or DIME encoding. */
            /* TODO: DIME decoding should move to the transport, do it here
             * for now and for ease of getting it done. */
            if (count($this->__attachments)) {
                if ($useEncoding == 'Mime') {
                    $soap_msg = $this->_makeMimeMessage($soap_msg);
                } else {
                    // default is dime
                    $soap_msg = $this->_makeDIMEMessage($soap_msg);
                    $this->headers['Content-Type'] = 'application/dime';
                }
                if (PEAR::isError($soap_msg)) {
                    return $this->_raiseSoapFault($soap_msg);
                }
            }

            if (is_array($soap_msg)) {
                $response = $soap_msg['body'];
                if (count($soap_msg['headers'])) {
                    $this->headers = $soap_msg['headers'];
                }
            } else {
                $response = $soap_msg;
            }
        }

        $this->_sendResponse($response);
    }

    /**
     * Sends the final HTTP response to the client, including the HTTP header
     * and the HTTP body.
     *
     * If an error happened, it returns a SOAP fault instead of the response
     * body.
     *
     * @param string $response  The response body.
     */
    function _sendResponse($response = '')
    {
        /* Make distinction between the different SAPIs, running PHP as CGI or
         * as a module. */
        if (stristr(php_sapi_name(), 'cgi') === 0) {
            $hdrs_type = 'Status:';
        } else {
            $hdrs_type = 'HTTP/1.1';
        }

        if ($this->fault) {
            $hdrs = $hdrs_type . ' ' . $this->__options['http_status_fault'] . "\r\n";
            $response = $this->fault->message();
        } else {
            $hdrs = $hdrs_type . ' ' . $this->__options['http_status_success'] . "\r\n";
        }
        header($hdrs);

        $this->headers['Server'] = SOAP_LIBRARY_NAME;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -