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

📄 server.php

📁 PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。
💻 PHP
📖 第 1 页 / 共 3 页
字号:
        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 + -