nusoap.php.bak
来自「php源码 php源码参考」· BAK 代码 · 共 2,142 行 · 第 1/5 页
BAK
2,142 行
* * @param string $wsdl path or URL to a WSDL file * @access public */ function soap_server($wsdl=false){ // turn on debugging? global $debug; if(isset($debug)){ $this->debug_flag = 1; } // wsdl if($wsdl){ $this->wsdl = new wsdl($wsdl); $this->externalWSDLURL = $wsdl; if($err = $this->wsdl->getError()){ die('WSDL ERROR: '.$err); } } } /** * processes request and returns response * * @param string $data usually is the value of $HTTP_RAW_POST_DATA * @access public */ function service($data){ // print wsdl global $QUERY_STRING; if(isset($_SERVER['QUERY_STRING'])){ $qs = $_SERVER['QUERY_STRING']; } elseif(isset($GLOBALS['QUERY_STRING'])){ $qs = $GLOBALS['QUERY_STRING']; } elseif(isset($QUERY_STRING) && $QUERY_STRING != ''){ $qs = $QUERY_STRING; } // gen wsdl if(isset($qs) && ereg('wsdl', $qs) ){ if($this->externalWSDLURL){ header('Location: '.$this->externalWSDLURL); exit(); } else { header("Content-Type: text/xml\r\n"); print $this->wsdl->serialize(); exit(); } } // print web interface if($data == '' && $this->wsdl){ print $this->webDescription(); } else { // $response is the serialized response message $response = $this->parse_request($data); $this->debug('server sending...'); $payload = $response; // add debug data if in debug mode if(isset($this->debug_flag) && $this->debug_flag == 1){ $payload .= "<!--\n".str_replace('--','- -',$this->debug_str)."\n-->"; } // print headers if($this->fault){ $header[] = "Status: 500 Internal Server Error\r\n"; } else { $header[] = "Status: 200 OK\r\n"; } $header[] = "Server: $this->title Server v$this->version\r\n"; $header[] = "Connection: Close\r\n"; $header[] = "Content-Type: text/xml; charset=$this->charset_encoding\r\n"; $header[] = "Content-Length: ".strlen($payload)."\r\n\r\n"; reset($header); foreach($header as $hdr){ header($hdr); } $this->response = join("\r\n",$header).$payload; print $payload; } } /** * parses request and posts response * * @param string $data XML string * @return string XML response msg * @access private */ function parse_request($data='') { $this->debug('entering parseRequest() on '.date('H:i Y-m-d')); $dump = ''; // get headers if(function_exists('getallheaders')){ $this->headers = getallheaders(); foreach($this->headers as $k=>$v){ $dump .= "$k: $v\r\n"; $this->debug("$k: $v"); } // get SOAPAction header if(isset($this->headers['SOAPAction'])){ $this->SOAPAction = str_replace('"','',$this->headers['SOAPAction']); } // get the character encoding of the incoming request if(strpos($this->headers['Content-Type'],'=')){ $enc = str_replace('"','',substr(strstr($this->headers["Content-Type"],'='),1)); if(eregi('^(ISO-8859-1|US-ASCII|UTF-8)$',$enc)){ $this->xml_encoding = $enc; } else { $this->xml_encoding = 'us-ascii'; } } $this->debug('got encoding: '.$this->charset_encoding); } elseif(is_array($_SERVER)){ $this->headers['User-Agent'] = $_SERVER['HTTP_USER_AGENT']; $this->SOAPAction = isset($_SERVER['SOAPAction']) ? $_SERVER['SOAPAction'] : ''; } $this->request = $dump."\r\n\r\n".$data; // parse response, get soap parser obj $parser = new soap_parser($data,$this->charset_encoding); // if fault occurred during message parsing if($err = $parser->getError()){ // parser debug $this->debug("parser debug: \n".$parser->debug_str); $this->result = 'fault: error in msg parsing: '.$err; $this->fault('Server',"error in msg parsing:\n".$err); // return soapresp return $this->fault->serialize(); // else successfully parsed request into soapval object } else { // get/set methodname $this->methodname = $parser->root_struct_name; $this->debug('method name: '.$this->methodname); // does method exist? if(!function_exists($this->methodname)){ // "method not found" fault here $this->debug("method '$this->methodname' not found!"); $this->debug("parser debug: \n".$parser->debug_str); $this->result = 'fault: method not found'; $this->fault('Server',"method '$this->methodname' not defined in service '$this->service'"); return $this->fault->serialize(); } if($this->wsdl){ if(!$this->opData = $this->wsdl->getOperationData($this->methodname)){ //if( $this->fault('Server',"Operation '$this->methodname' is not defined in the WSDL for this service"); return $this->fault->serialize(); } } $this->debug("method '$this->methodname' exists"); // evaluate message, getting back parameters $this->debug('calling parser->get_response()'); $request_data = $parser->get_response(); // parser debug $this->debug("parser debug: \n".$parser->debug_str); // verify that request parameters match the method's signature if($this->verify_method($this->methodname,$request_data)){ // if there are parameters to pass $this->debug('params var dump '.$this->varDump($request_data)); if($request_data){ $this->debug("calling '$this->methodname' with params"); if (! function_exists('call_user_func_array')) { $this->debug('calling method using eval()'); $funcCall = $this->methodname.'('; foreach($request_data as $param) { $funcCall .= "\"$param\","; } $funcCall = substr($funcCall, 0, -1).')'; $this->debug('function call:<br>'.$funcCall); @eval("\$method_response = $funcCall;"); } else { $this->debug('calling method using call_user_func_array()'); $method_response = call_user_func_array("$this->methodname",$request_data); } $this->debug('response var dump'.$this->varDump($method_response)); } else { // call method w/ no parameters $this->debug("calling $this->methodname w/ no params"); $m = $this->methodname; $method_response = @$m(); } $this->debug("done calling method: $this->methodname, received $method_response of type".gettype($method_response)); // if we got nothing back. this might be ok (echoVoid) if(isset($method_response) && $method_response != '' || is_bool($method_response)) { // if fault if(get_class($method_response) == 'soap_fault'){ $this->debug('got a fault object from method'); $this->fault = $method_response; return $method_response->serialize(); // if return val is soapval object } elseif(get_class($method_response) == 'soapval'){ $this->debug('got a soapval object from method'); $return_val = $method_response->serialize(); // returned other } else { $this->debug('got a(n) '.gettype($method_response).' from method'); $this->debug('serializing return value'); if($this->wsdl){ if(sizeof($this->opData['output']['parts']) > 1){ $opParams = $method_response; } else { $opParams = array($method_response); } $return_val = $this->wsdl->serializeRPCParameters($this->methodname,'output',$opParams); } else { $return_val = $this->serialize_val($method_response); } } $this->debug('return val:'.$this->varDump($return_val)); } else { $return_val = ''; $this->debug('got no response from method'); } $this->debug('serializing response'); $payload = '<'.$this->methodname."Response>".$return_val.'</'.$this->methodname."Response>"; $this->result = 'successful'; if($this->wsdl){ //if($this->debug_flag){ $this->debug("WSDL debug data:\n".$this->wsdl->debug_str); // } // Added: In case we use a WSDL, return a serialized env. WITH the usedNamespaces. return $this->serializeEnvelope($payload,$this->responseHeaders,$this->wsdl->usedNamespaces); } else { return $this->serializeEnvelope($payload,$this->responseHeaders); } } else { // debug $this->debug('ERROR: request not verified against method signature'); $this->result = 'fault: request failed validation against method signature'; // return fault $this->fault('Server',"Operation '$this->methodname' not defined in service."); return $this->fault->serialize(); } } } /** * takes the value that was created by parsing the request * and compares to the method's signature, if available. * * @param mixed * @return boolean * @access private */ function verify_method($operation,$request){ if(isset($this->wsdl) && is_object($this->wsdl)){ if($this->wsdl->getOperationData($operation)){ return true; } } elseif(isset($this->operations[$operation])){ return true; } return false; } /** * add a method to the dispatch map * * @param string $methodname * @param string $in array of input values * @param string $out array of output values * @access public */ function add_to_map($methodname,$in,$out){ $this->operations[$methodname] = array('name' => $methodname,'in' => $in,'out' => $out); } /** * register a service with the server * * @param string $methodname * @param string $in assoc array of input values: key = param name, value = param type * @param string $out assoc array of output values: key = param name, value = param type * @param string $namespace * @param string $soapaction * @param string $style (rpc|literal) * @access public */ function register($name,$in=false,$out=false,$namespace=false,$soapaction=false,$style=false,$use=false){ if(false == $in) { } if(false == $out) { } if(false == $namespace) { } if(false == $soapaction) { global $SERVER_NAME, $SCRIPT_NAME; $soapaction = "http://$SERVER_NAME$SCRIPT_NAME"; } if(false == $style) { $style = "rpc"; } if(false == $use) { $use = "encoded"; } $this->operations[$name] = array( 'name' => $name, 'in' => $in, 'out' => $out, 'namespace' => $namespace, 'soapaction' => $soapaction, 'style' => $style); if($this->wsdl){ $this->wsdl->addOperation($name,$in,$out,$namespace,$soapaction,$style,$use); } return true; } /** * create a fault. this also acts as a flag to the server that a fault has occured. * * @param string faultcode * @param string faultactor * @param string faultstring * @param string faultdetail * @access public */ function fault($faultcode,$faultactor,$faultstring='',$faultdetail=''){ $this->fault = new soap_fault($faultcode,$faultactor,$faultstring,$faultdetail); } /** * prints html description of services * * @access private */ function webDescription(){ $b = ' <html><head><title>NuSOAP: '.$this->wsdl->serviceName.'</title> <style type="text/css"> body { font-family: arial; color: #000000; background-color: #ffffff; margin: 0px 0px 0px 0px; } p { font-family: arial; color: #000000; margin-top: 0px; margin-bottom: 12px; } pre { background-color: silver; padding: 5px; font-family: Courier New; font-size: x-small; color: #000000;} ul { margin-top: 10px; margin-left: 20px; } li { list-style-type: none; margin-top: 10px; color: #000000; } .content{ margin-left: 0px; padding-bottom: 2em; } .nav { padding-top: 10px; padding-bottom: 10px; padding-left: 15px; font-size: .70em; margin-top: 10px; margin-left: 0px; color: #000000; background-color: #ccccff; width: 20%; margin-left: 20px; margin-top: 20px; } .title { font-family: arial; font-size: 26px; color: #ffffff; background-color: #999999; width: 105%; margin-left: 0px; padding-top: 10px; padding-bottom: 10px; padding-left: 15px;} .hidden { position: absolute; visibility: hidden; z-index: 200; left: 250px; top: 100px; font-family: arial; overflow: hidden; width: 600; padding: 20px; font-size: 10px; background-color: #999999; layer-background-color:#FFFFFF; } a,a:active { color: charcoal; font-weight: bold; } a:visited { color: #666666; font-weight: bold; } a:hover { color: cc3300; font-weight: bold; } </style> <script language="JavaScript" type="text/javascript"> <!-- // POP-UP CAPTIONS... function lib_bwcheck(){ //Browsercheck (needed) this.ver=navigator.appVersion this.agent=navigator.userAgent this.dom=document.getElementById?1:0 this.opera5=this.agent.indexOf("Opera 5")>-1 this.ie5=(this.ver.indexOf("MSIE 5")>-1 && this.dom && !this.opera5)?1:0; this.ie6=(this.ver.indexOf("MSIE 6")>-1 && this.dom && !this.opera5)?1:0; this.ie4=(document.all && !this.dom && !this.opera5)?1:0; this.ie=this.ie4||this.ie5||this.ie6 this.mac=this.agent.indexOf("Mac")>-1 this.ns6=(this.dom && parseInt(this.ver) >= 5) ?1:0; this.ns4=(document.layers && !this.dom)?1:0; this.bw=(this.ie6 || this.ie5 || this.ie4 || this.ns4 || this.ns6 || this.opera5) return this } var bw = new lib_bwcheck() //Makes crossbrowser object. function makeObj(obj){ this.evnt=bw.dom? document.getElementById(obj):bw.ie4?document.all[obj]:bw.ns4?document.layers[obj]:0; if(!this.evnt) return false this.css=bw.dom||bw.ie4?this.evnt.style:bw.ns4?this.evnt:0; this.wref=bw.dom||bw.ie4?this.evnt:bw.ns4?this.css.document:0; this.writeIt=b_writeIt; return this } // A unit of measure that will be added when setting the position of a layer. //var px = bw.ns4||window.opera?"":"px"; function b_writeIt(text){ if (bw.ns4){this.wref.write(text);this.wref.close()} else this.wref.innerHTML = text } //Shows the messages var oDesc; function popup(divid){ if(oDesc = new makeObj(divid)){ oDesc.css.visibility = "visible" } } function popout(){ // Hides message if(oDesc) oDesc.css.visibility = "hidden" } //--> </script> </head> <body> <div class=content> <br><br> <div class=title>'.$this->wsdl->serviceName.'</div> <div class=nav> <p>View the <a href="'.$GLOBALS['PHP_SELF'].'?wsdl">WSDL</a> for the service. Click on an operation name to view it's details.</p> <ul>'; foreach($this->wsdl->getOperations() as $op => $data){ $b .= "<li><a href='#' onclick=\"popup('$op')\">$op</a></li>"; // create hidden div $b .= "<div id='$op' class='hidden'> <a href='#' onclick='popout()'><font color='#ffffff'>Close</font></a><br><br>"; foreach($data as $donnie => $marie){ if($donnie == 'input' || $donnie == 'output'){ $b .= "<font color='white'>".ucfirst($donnie).':</font><br>'; foreach($marie as $captain => $tenille){ if($captain == 'parts'){ $b .= " $captain:<br>"; if(is_array($tenille)){ foreach($tenille as $joanie => $chachi){ $b .= " $joanie: $chachi<br>"; } }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?