WIP fix bugs after introduction of namespaces, found trying to run the testsuite
[plcapi.git] / demo / server / server.php
1 <?php
2 /**
3  * Demo server for xmlrpc library.
4  *
5  * Implements a lot of webservices, including a suite of services used for
6  * interoperability testing (validator1 methods), and some whose only purpose
7  * is to be used for unit-testing the library.
8  *
9  * Please do not copy this file verbatim into your production server.
10  *
11  **/
12
13 // give user a chance to see the source for this server instead of running the services
14 if ($_SERVER['REQUEST_METHOD'] != 'POST' && isset($_GET['showSource']))
15 {
16     highlight_file(__FILE__);
17     die();
18 }
19
20     include("xmlrpc.inc");
21     include("xmlrpcs.inc");
22     include("xmlrpc_wrappers.inc");
23
24     /**
25     * Used to test usage of object methods in dispatch maps and in wrapper code
26     */
27     class xmlrpc_server_methods_container
28     {
29         /**
30         * Method used to test logging of php warnings generated by user functions.
31         */
32         function phpwarninggenerator($m)
33         {
34             $a = $b; // this triggers a warning in E_ALL mode, since $b is undefined
35             return new xmlrpcresp(new xmlrpcval(1, 'boolean'));
36         }
37
38         /**
39          * Method used to testcatching of exceptions in the server.
40          */
41         function exceptiongenerator($m)
42         {
43             throw new Exception("it's just a test", 1);
44         }
45
46         /**
47         * a PHP version of the state-number server. Send me an integer and i'll sell you a state
48         * @param integer $s
49         * @return string
50         */
51         static function findstate($s)
52         {
53             return inner_findstate($s);
54         }
55     }
56
57
58     // a PHP version
59     // of the state-number server
60     // send me an integer and i'll sell you a state
61
62     $stateNames = array(
63         "Alabama", "Alaska", "Arizona", "Arkansas", "California",
64         "Colorado", "Columbia", "Connecticut", "Delaware", "Florida",
65         "Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas",
66         "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts", "Michigan",
67         "Minnesota", "Mississippi", "Missouri", "Montana", "Nebraska", "Nevada",
68         "New Hampshire", "New Jersey", "New Mexico", "New York", "North Carolina",
69         "North Dakota", "Ohio", "Oklahoma", "Oregon", "Pennsylvania", "Rhode Island",
70         "South Carolina", "South Dakota", "Tennessee", "Texas", "Utah", "Vermont",
71         "Virginia", "Washington", "West Virginia", "Wisconsin", "Wyoming"
72     );
73
74     $findstate_sig=array(array($xmlrpcString, $xmlrpcInt));
75     $findstate_doc='When passed an integer between 1 and 51 returns the
76 name of a US state, where the integer is the index of that state name
77 in an alphabetic order.';
78
79
80     function findstate($m)
81     {
82         global $xmlrpcerruser, $stateNames;
83         $err="";
84         // get the first param
85         $sno=$m->getParam(0);
86
87         // param must be there and of the correct type: server object does the
88         // validation for us
89
90         // extract the value of the state number
91         $snv=$sno->scalarval();
92         // look it up in our array (zero-based)
93         if (isset($stateNames[$snv-1]))
94         {
95             $sname=$stateNames[$snv-1];
96         }
97         else
98         {
99             // not, there so complain
100             $err="I don't have a state for the index '" . $snv . "'";
101         }
102
103         // if we generated an error, create an error return response
104         if ($err)
105         {
106             return new xmlrpcresp(0, $xmlrpcerruser, $err);
107         }
108         else
109         {
110             // otherwise, we create the right response
111             // with the state name
112             return new xmlrpcresp(new xmlrpcval($sname));
113         }
114     }
115
116     /**
117     * Inner code of the state-number server.
118     * Used to test auto-registration of PHP funcions as xmlrpc methods.
119     * @param integer $stateno the state number
120     * @return string the name of the state (or error descrption)
121     */
122     function inner_findstate($stateno)
123     {
124         global $stateNames;
125         if (isset($stateNames[$stateno-1]))
126         {
127             return $stateNames[$stateno-1];
128         }
129         else
130         {
131             // not, there so complain
132             return "I don't have a state for the index '" . $stateno . "'";
133         }
134     }
135     $findstate2_sig = wrap_php_function('inner_findstate');
136
137     $findstate3_sig = wrap_php_function(array('xmlrpc_server_methods_container', 'findstate'));
138
139     $findstate5_sig = wrap_php_function('xmlrpc_server_methods_container::findstate');
140
141     $obj = new xmlrpc_server_methods_container();
142     $findstate4_sig = wrap_php_function(array($obj, 'findstate'));
143
144     $addtwo_sig=array(array($xmlrpcInt, $xmlrpcInt, $xmlrpcInt));
145     $addtwo_doc='Add two integers together and return the result';
146     function addtwo($m)
147     {
148         $s=$m->getParam(0);
149         $t=$m->getParam(1);
150         return new xmlrpcresp(new xmlrpcval($s->scalarval()+$t->scalarval(),"int"));
151     }
152
153     $addtwodouble_sig=array(array($xmlrpcDouble, $xmlrpcDouble, $xmlrpcDouble));
154     $addtwodouble_doc='Add two doubles together and return the result';
155     function addtwodouble($m)
156     {
157         $s=$m->getParam(0);
158         $t=$m->getParam(1);
159         return new xmlrpcresp(new xmlrpcval($s->scalarval()+$t->scalarval(),"double"));
160     }
161
162     $stringecho_sig=array(array($xmlrpcString, $xmlrpcString));
163     $stringecho_doc='Accepts a string parameter, returns the string.';
164     function stringecho($m)
165     {
166         // just sends back a string
167         $s=$m->getParam(0);
168         $v = $s->scalarval();
169         return new xmlrpcresp(new xmlrpcval($s->scalarval()));
170     }
171
172     $echoback_sig=array(array($xmlrpcString, $xmlrpcString));
173     $echoback_doc='Accepts a string parameter, returns the entire incoming payload';
174     function echoback($m)
175     {
176         // just sends back a string with what i got
177         // sent to me, just escaped, that's all
178         //
179         // $m is an incoming message
180         $s="I got the following message:\n" . $m->serialize();
181         return new xmlrpcresp(new xmlrpcval($s));
182     }
183
184     $echosixtyfour_sig=array(array($xmlrpcString, $xmlrpcBase64));
185     $echosixtyfour_doc='Accepts a base64 parameter and returns it decoded as a string';
186     function echosixtyfour($m)
187     {
188         // accepts an encoded value, but sends it back
189         // as a normal string. this is to test base64 encoding
190         // is working as expected
191         $incoming=$m->getParam(0);
192         return new xmlrpcresp(new xmlrpcval($incoming->scalarval(), "string"));
193     }
194
195     $bitflipper_sig=array(array($xmlrpcArray, $xmlrpcArray));
196     $bitflipper_doc='Accepts an array of booleans, and returns them inverted';
197     function bitflipper($m)
198     {
199         global $xmlrpcArray;
200
201         $v=$m->getParam(0);
202         $sz=$v->arraysize();
203         $rv=new xmlrpcval(array(), $xmlrpcArray);
204
205         for($j=0; $j<$sz; $j++)
206         {
207             $b=$v->arraymem($j);
208             if ($b->scalarval())
209             {
210                 $rv->addScalar(false, "boolean");
211             }
212             else
213             {
214                 $rv->addScalar(true, "boolean");
215             }
216         }
217
218         return new xmlrpcresp($rv);
219     }
220
221     // Sorting demo
222     //
223     // send me an array of structs thus:
224     //
225     // Dave 35
226     // Edd  45
227     // Fred 23
228     // Barney 37
229     //
230     // and I'll return it to you in sorted order
231
232     function agesorter_compare($a, $b)
233     {
234         global $agesorter_arr;
235
236         // don't even ask me _why_ these come padded with
237         // hyphens, I couldn't tell you :p
238         $a=str_replace("-", "", $a);
239         $b=str_replace("-", "", $b);
240
241         if ($agesorter_arr[$a]==$agesorter[$b])
242         {
243             return 0;
244         }
245         return ($agesorter_arr[$a] > $agesorter_arr[$b]) ? -1 : 1;
246     }
247
248     $agesorter_sig=array(array($xmlrpcArray, $xmlrpcArray));
249     $agesorter_doc='Send this method an array of [string, int] structs, eg:
250 <pre>
251  Dave   35
252  Edd    45
253  Fred   23
254  Barney 37
255 </pre>
256 And the array will be returned with the entries sorted by their numbers.
257 ';
258     function agesorter($m)
259     {
260         global $agesorter_arr, $xmlrpcerruser, $s;
261
262         xmlrpc_debugmsg("Entering 'agesorter'");
263         // get the parameter
264         $sno=$m->getParam(0);
265         // error string for [if|when] things go wrong
266         $err="";
267         // create the output value
268         $v=new xmlrpcval();
269         $agar=array();
270
271         if (isset($sno) && $sno->kindOf()=="array")
272         {
273             $max=$sno->arraysize();
274             // TODO: create debug method to print can work once more
275             // print "<!-- found $max array elements -->\n";
276             for($i=0; $i<$max; $i++)
277             {
278                 $rec=$sno->arraymem($i);
279                 if ($rec->kindOf()!="struct")
280                 {
281                     $err="Found non-struct in array at element $i";
282                     break;
283                 }
284                 // extract name and age from struct
285                 $n=$rec->structmem("name");
286                 $a=$rec->structmem("age");
287                 // $n and $a are xmlrpcvals,
288                 // so get the scalarval from them
289                 $agar[$n->scalarval()]=$a->scalarval();
290             }
291
292             $agesorter_arr=$agar;
293             // hack, must make global as uksort() won't
294             // allow us to pass any other auxilliary information
295             uksort($agesorter_arr, agesorter_compare);
296             $outAr=array();
297             while (list( $key, $val ) = each( $agesorter_arr ) )
298             {
299                 // recreate each struct element
300                 $outAr[]=new xmlrpcval(array("name" =>
301                 new xmlrpcval($key),
302                 "age" =>
303                 new xmlrpcval($val, "int")), "struct");
304             }
305             // add this array to the output value
306             $v->addArray($outAr);
307         }
308         else
309         {
310             $err="Must be one parameter, an array of structs";
311         }
312
313         if ($err)
314         {
315             return new xmlrpcresp(0, $xmlrpcerruser, $err);
316         }
317         else
318         {
319             return new xmlrpcresp($v);
320         }
321     }
322
323     // signature and instructions, place these in the dispatch
324     // map
325     $mail_send_sig=array(array(
326         $xmlrpcBoolean, $xmlrpcString, $xmlrpcString,
327         $xmlrpcString, $xmlrpcString, $xmlrpcString,
328         $xmlrpcString, $xmlrpcString
329     ));
330
331     $mail_send_doc='mail.send(recipient, subject, text, sender, cc, bcc, mimetype)<br/>
332 recipient, cc, and bcc are strings, comma-separated lists of email addresses, as described above.<br/>
333 subject is a string, the subject of the message.<br/>
334 sender is a string, it\'s the email address of the person sending the message. This string can not be
335 a comma-separated list, it must contain a single email address only.<br/>
336 text is a string, it contains the body of the message.<br/>
337 mimetype, a string, is a standard MIME type, for example, text/plain.
338 ';
339     // WARNING; this functionality depends on the sendmail -t option
340     // it may not work with Windows machines properly; particularly
341     // the Bcc option. Sneak on your friends at your own risk!
342     function mail_send($m)
343     {
344         global $xmlrpcerruser, $xmlrpcBoolean;
345         $err="";
346
347         $mTo=$m->getParam(0);
348         $mSub=$m->getParam(1);
349         $mBody=$m->getParam(2);
350         $mFrom=$m->getParam(3);
351         $mCc=$m->getParam(4);
352         $mBcc=$m->getParam(5);
353         $mMime=$m->getParam(6);
354
355         if ($mTo->scalarval()=="")
356         {
357             $err="Error, no 'To' field specified";
358         }
359
360         if ($mFrom->scalarval()=="")
361         {
362             $err="Error, no 'From' field specified";
363         }
364
365         $msghdr="From: " . $mFrom->scalarval() . "\n";
366         $msghdr.="To: ". $mTo->scalarval() . "\n";
367
368         if ($mCc->scalarval()!="")
369         {
370             $msghdr.="Cc: " . $mCc->scalarval(). "\n";
371         }
372         if ($mBcc->scalarval()!="")
373         {
374             $msghdr.="Bcc: " . $mBcc->scalarval(). "\n";
375         }
376         if ($mMime->scalarval()!="")
377         {
378             $msghdr.="Content-type: " . $mMime->scalarval() . "\n";
379         }
380         $msghdr.="X-Mailer: XML-RPC for PHP mailer 1.0";
381
382         if ($err=="")
383         {
384             if (!mail("",
385                 $mSub->scalarval(),
386                 $mBody->scalarval(),
387                 $msghdr))
388             {
389                 $err="Error, could not send the mail.";
390             }
391         }
392
393         if ($err)
394         {
395             return new xmlrpcresp(0, $xmlrpcerruser, $err);
396         }
397         else
398         {
399             return new xmlrpcresp(new xmlrpcval("true", $xmlrpcBoolean));
400         }
401     }
402
403     $getallheaders_sig=array(array($xmlrpcStruct));
404     $getallheaders_doc='Returns a struct containing all the HTTP headers received with the request. Provides limited functionality with IIS';
405     function getallheaders_xmlrpc($m)
406     {
407         global $xmlrpcerruser;
408         if (function_exists('getallheaders'))
409         {
410             return new xmlrpcresp(php_xmlrpc_encode(getallheaders()));
411         }
412         else
413         {
414             $headers = array();
415             // IIS: poor man's version of getallheaders
416             foreach ($_SERVER as $key => $val)
417                 if (strpos($key, 'HTTP_') === 0)
418                 {
419                     $key = ucfirst(str_replace('_', '-', strtolower(substr($key, 5))));
420                     $headers[$key] = $val;
421                 }
422             return new xmlrpcresp(php_xmlrpc_encode($headers));
423         }
424     }
425
426     $setcookies_sig=array(array($xmlrpcInt, $xmlrpcStruct));
427     $setcookies_doc='Sends to client a response containing a single \'1\' digit, and sets to it http cookies as received in the request (array of structs describing a cookie)';
428     function setcookies($m)
429     {
430         $m = $m->getParam(0);
431         while(list($name,$value) = $m->structeach())
432         {
433             $cookiedesc = php_xmlrpc_decode($value);
434             setcookie($name, @$cookiedesc['value'], @$cookiedesc['expires'], @$cookiedesc['path'], @$cookiedesc['domain'], @$cookiedesc['secure']);
435         }
436         return new xmlrpcresp(new xmlrpcval(1, 'int'));
437     }
438
439     $getcookies_sig=array(array($xmlrpcStruct));
440     $getcookies_doc='Sends to client a response containing all http cookies as received in the request (as struct)';
441     function getcookies($m)
442     {
443         return new xmlrpcresp(php_xmlrpc_encode($_COOKIE));
444     }
445
446     $v1_arrayOfStructs_sig=array(array($xmlrpcInt, $xmlrpcArray));
447     $v1_arrayOfStructs_doc='This handler takes a single parameter, an array of structs, each of which contains at least three elements named moe, larry and curly, all <i4>s. Your handler must add all the struct elements named curly and return the result.';
448     function v1_arrayOfStructs($m)
449     {
450         $sno=$m->getParam(0);
451         $numcurly=0;
452         for($i=0; $i<$sno->arraysize(); $i++)
453         {
454             $str=$sno->arraymem($i);
455             $str->structreset();
456             while(list($key,$val)=$str->structeach())
457             {
458                 if ($key=="curly")
459                 {
460                     $numcurly+=$val->scalarval();
461                 }
462             }
463         }
464         return new xmlrpcresp(new xmlrpcval($numcurly, "int"));
465     }
466
467     $v1_easyStruct_sig=array(array($xmlrpcInt, $xmlrpcStruct));
468     $v1_easyStruct_doc='This handler takes a single parameter, a struct, containing at least three elements named moe, larry and curly, all &lt;i4&gt;s. Your handler must add the three numbers and return the result.';
469     function v1_easyStruct($m)
470     {
471         $sno=$m->getParam(0);
472         $moe=$sno->structmem("moe");
473         $larry=$sno->structmem("larry");
474         $curly=$sno->structmem("curly");
475         $num=$moe->scalarval() + $larry->scalarval() + $curly->scalarval();
476         return new xmlrpcresp(new xmlrpcval($num, "int"));
477     }
478
479     $v1_echoStruct_sig=array(array($xmlrpcStruct, $xmlrpcStruct));
480     $v1_echoStruct_doc='This handler takes a single parameter, a struct. Your handler must return the struct.';
481     function v1_echoStruct($m)
482     {
483         $sno=$m->getParam(0);
484         return new xmlrpcresp($sno);
485     }
486
487     $v1_manyTypes_sig=array(array(
488         $xmlrpcArray, $xmlrpcInt, $xmlrpcBoolean,
489         $xmlrpcString, $xmlrpcDouble, $xmlrpcDateTime,
490         $xmlrpcBase64
491     ));
492     $v1_manyTypes_doc='This handler takes six parameters, and returns an array containing all the parameters.';
493     function v1_manyTypes($m)
494     {
495         return new xmlrpcresp(new xmlrpcval(array(
496             $m->getParam(0),
497             $m->getParam(1),
498             $m->getParam(2),
499             $m->getParam(3),
500             $m->getParam(4),
501             $m->getParam(5)),
502             "array"
503         ));
504     }
505
506     $v1_moderateSizeArrayCheck_sig=array(array($xmlrpcString, $xmlrpcArray));
507     $v1_moderateSizeArrayCheck_doc='This handler takes a single parameter, which is an array containing between 100 and 200 elements. Each of the items is a string, your handler must return a string containing the concatenated text of the first and last elements.';
508     function v1_moderateSizeArrayCheck($m)
509     {
510         $ar=$m->getParam(0);
511         $sz=$ar->arraysize();
512         $first=$ar->arraymem(0);
513         $last=$ar->arraymem($sz-1);
514         return new xmlrpcresp(new xmlrpcval($first->scalarval() .
515         $last->scalarval(), "string"));
516     }
517
518     $v1_simpleStructReturn_sig=array(array($xmlrpcStruct, $xmlrpcInt));
519     $v1_simpleStructReturn_doc='This handler takes one parameter, and returns a struct containing three elements, times10, times100 and times1000, the result of multiplying the number by 10, 100 and 1000.';
520     function v1_simpleStructReturn($m)
521     {
522         $sno=$m->getParam(0);
523         $v=$sno->scalarval();
524         return new xmlrpcresp(new xmlrpcval(array(
525             "times10"   => new xmlrpcval($v*10, "int"),
526             "times100"  => new xmlrpcval($v*100, "int"),
527             "times1000" => new xmlrpcval($v*1000, "int")),
528             "struct"
529         ));
530     }
531
532     $v1_nestedStruct_sig=array(array($xmlrpcInt, $xmlrpcStruct));
533     $v1_nestedStruct_doc='This handler takes a single parameter, a struct, that models a daily calendar. At the top level, there is one struct for each year. Each year is broken down into months, and months into days. Most of the days are empty in the struct you receive, but the entry for April 1, 2000 contains a least three elements named moe, larry and curly, all &lt;i4&gt;s. Your handler must add the three numbers and return the result.';
534     function v1_nestedStruct($m)
535     {
536         $sno=$m->getParam(0);
537
538         $twoK=$sno->structmem("2000");
539         $april=$twoK->structmem("04");
540         $fools=$april->structmem("01");
541         $curly=$fools->structmem("curly");
542         $larry=$fools->structmem("larry");
543         $moe=$fools->structmem("moe");
544         return new xmlrpcresp(new xmlrpcval($curly->scalarval() + $larry->scalarval() + $moe->scalarval(), "int"));
545     }
546
547     $v1_countTheEntities_sig=array(array($xmlrpcStruct, $xmlrpcString));
548     $v1_countTheEntities_doc='This handler takes a single parameter, a string, that contains any number of predefined entities, namely &lt;, &gt;, &amp; \' and ".<BR>Your handler must return a struct that contains five fields, all numbers: ctLeftAngleBrackets, ctRightAngleBrackets, ctAmpersands, ctApostrophes, ctQuotes.';
549     function v1_countTheEntities($m)
550     {
551         $sno=$m->getParam(0);
552         $str=$sno->scalarval();
553         $gt=0; $lt=0; $ap=0; $qu=0; $amp=0;
554         for($i=0; $i<strlen($str); $i++)
555         {
556             $c=substr($str, $i, 1);
557             switch($c)
558             {
559                 case ">":
560                     $gt++;
561                     break;
562                 case "<":
563                     $lt++;
564                     break;
565                 case "\"":
566                     $qu++;
567                     break;
568                 case "'":
569                     $ap++;
570                     break;
571                 case "&":
572                     $amp++;
573                     break;
574                 default:
575                     break;
576             }
577         }
578         return new xmlrpcresp(new xmlrpcval(array(
579             "ctLeftAngleBrackets"  => new xmlrpcval($lt, "int"),
580             "ctRightAngleBrackets" => new xmlrpcval($gt, "int"),
581             "ctAmpersands"         => new xmlrpcval($amp, "int"),
582             "ctApostrophes"        => new xmlrpcval($ap, "int"),
583             "ctQuotes"             => new xmlrpcval($qu, "int")),
584             "struct"
585         ));
586     }
587
588     // trivial interop tests
589     // http://www.xmlrpc.com/stories/storyReader$1636
590
591     $i_echoString_sig=array(array($xmlrpcString, $xmlrpcString));
592     $i_echoString_doc="Echoes string.";
593
594     $i_echoStringArray_sig=array(array($xmlrpcArray, $xmlrpcArray));
595     $i_echoStringArray_doc="Echoes string array.";
596
597     $i_echoInteger_sig=array(array($xmlrpcInt, $xmlrpcInt));
598     $i_echoInteger_doc="Echoes integer.";
599
600     $i_echoIntegerArray_sig=array(array($xmlrpcArray, $xmlrpcArray));
601     $i_echoIntegerArray_doc="Echoes integer array.";
602
603     $i_echoFloat_sig=array(array($xmlrpcDouble, $xmlrpcDouble));
604     $i_echoFloat_doc="Echoes float.";
605
606     $i_echoFloatArray_sig=array(array($xmlrpcArray, $xmlrpcArray));
607     $i_echoFloatArray_doc="Echoes float array.";
608
609     $i_echoStruct_sig=array(array($xmlrpcStruct, $xmlrpcStruct));
610     $i_echoStruct_doc="Echoes struct.";
611
612     $i_echoStructArray_sig=array(array($xmlrpcArray, $xmlrpcArray));
613     $i_echoStructArray_doc="Echoes struct array.";
614
615     $i_echoValue_doc="Echoes any value back.";
616     $i_echoValue_sig=array(array($xmlrpcValue, $xmlrpcValue));
617
618     $i_echoBase64_sig=array(array($xmlrpcBase64, $xmlrpcBase64));
619     $i_echoBase64_doc="Echoes base64.";
620
621     $i_echoDate_sig=array(array($xmlrpcDateTime, $xmlrpcDateTime));
622     $i_echoDate_doc="Echoes dateTime.";
623
624     function i_echoParam($m)
625     {
626         $s=$m->getParam(0);
627         return new xmlrpcresp($s);
628     }
629
630     function i_echoString($m) { return i_echoParam($m); }
631     function i_echoInteger($m) { return i_echoParam($m); }
632     function i_echoFloat($m) { return i_echoParam($m); }
633     function i_echoStruct($m) { return i_echoParam($m); }
634     function i_echoStringArray($m) { return i_echoParam($m); }
635     function i_echoIntegerArray($m) { return i_echoParam($m); }
636     function i_echoFloatArray($m) { return i_echoParam($m); }
637     function i_echoStructArray($m) { return i_echoParam($m); }
638     function i_echoValue($m) { return i_echoParam($m); }
639     function i_echoBase64($m) { return i_echoParam($m); }
640     function i_echoDate($m) { return i_echoParam($m); }
641
642     $i_whichToolkit_sig=array(array($xmlrpcStruct));
643     $i_whichToolkit_doc="Returns a struct containing the following strings: toolkitDocsUrl, toolkitName, toolkitVersion, toolkitOperatingSystem.";
644
645     function i_whichToolkit($m)
646     {
647         global $xmlrpcName, $xmlrpcVersion,$SERVER_SOFTWARE;
648         $ret=array(
649             "toolkitDocsUrl" => "http://phpxmlrpc.sourceforge.net/",
650             "toolkitName" => $xmlrpcName,
651             "toolkitVersion" => $xmlrpcVersion,
652             "toolkitOperatingSystem" => isset ($SERVER_SOFTWARE) ? $SERVER_SOFTWARE : $_SERVER['SERVER_SOFTWARE']
653         );
654         return new xmlrpcresp ( php_xmlrpc_encode($ret));
655     }
656
657     $o=new xmlrpc_server_methods_container;
658     $a=array(
659         "examples.getStateName" => array(
660             "function" => "findstate",
661             "signature" => $findstate_sig,
662             "docstring" => $findstate_doc
663         ),
664         "examples.sortByAge" => array(
665             "function" => "agesorter",
666             "signature" => $agesorter_sig,
667             "docstring" => $agesorter_doc
668         ),
669         "examples.addtwo" => array(
670             "function" => "addtwo",
671             "signature" => $addtwo_sig,
672             "docstring" => $addtwo_doc
673         ),
674         "examples.addtwodouble" => array(
675             "function" => "addtwodouble",
676             "signature" => $addtwodouble_sig,
677             "docstring" => $addtwodouble_doc
678         ),
679         "examples.stringecho" => array(
680             "function" => "stringecho",
681             "signature" => $stringecho_sig,
682             "docstring" => $stringecho_doc
683         ),
684         "examples.echo" => array(
685             "function" => "echoback",
686             "signature" => $echoback_sig,
687             "docstring" => $echoback_doc
688         ),
689         "examples.decode64" => array(
690             "function" => "echosixtyfour",
691             "signature" => $echosixtyfour_sig,
692             "docstring" => $echosixtyfour_doc
693         ),
694         "examples.invertBooleans" => array(
695             "function" => "bitflipper",
696             "signature" => $bitflipper_sig,
697             "docstring" => $bitflipper_doc
698         ),
699         "examples.generatePHPWarning" => array(
700             "function" => array($o, "phpwarninggenerator")
701             //'function' => 'xmlrpc_server_methods_container::phpwarninggenerator'
702         ),
703         "examples.raiseException" => array(
704             "function" => array($o, "exceptiongenerator")
705         ),
706         "examples.getallheaders" => array(
707             "function" => 'getallheaders_xmlrpc',
708             "signature" => $getallheaders_sig,
709             "docstring" => $getallheaders_doc
710         ),
711         "examples.setcookies" => array(
712             "function" => 'setcookies',
713             "signature" => $setcookies_sig,
714             "docstring" => $setcookies_doc
715         ),
716         "examples.getcookies" => array(
717             "function" => 'getcookies',
718             "signature" => $getcookies_sig,
719             "docstring" => $getcookies_doc
720         ),
721         "mail.send" => array(
722             "function" => "mail_send",
723             "signature" => $mail_send_sig,
724             "docstring" => $mail_send_doc
725         ),
726         "validator1.arrayOfStructsTest" => array(
727             "function" => "v1_arrayOfStructs",
728             "signature" => $v1_arrayOfStructs_sig,
729             "docstring" => $v1_arrayOfStructs_doc
730         ),
731         "validator1.easyStructTest" => array(
732             "function" => "v1_easyStruct",
733             "signature" => $v1_easyStruct_sig,
734             "docstring" => $v1_easyStruct_doc
735         ),
736         "validator1.echoStructTest" => array(
737             "function" => "v1_echoStruct",
738             "signature" => $v1_echoStruct_sig,
739             "docstring" => $v1_echoStruct_doc
740         ),
741         "validator1.manyTypesTest" => array(
742             "function" => "v1_manyTypes",
743             "signature" => $v1_manyTypes_sig,
744             "docstring" => $v1_manyTypes_doc
745         ),
746         "validator1.moderateSizeArrayCheck" => array(
747             "function" => "v1_moderateSizeArrayCheck",
748             "signature" => $v1_moderateSizeArrayCheck_sig,
749             "docstring" => $v1_moderateSizeArrayCheck_doc
750         ),
751         "validator1.simpleStructReturnTest" => array(
752             "function" => "v1_simpleStructReturn",
753             "signature" => $v1_simpleStructReturn_sig,
754             "docstring" => $v1_simpleStructReturn_doc
755         ),
756         "validator1.nestedStructTest" => array(
757             "function" => "v1_nestedStruct",
758             "signature" => $v1_nestedStruct_sig,
759             "docstring" => $v1_nestedStruct_doc
760         ),
761         "validator1.countTheEntities" => array(
762             "function" => "v1_countTheEntities",
763             "signature" => $v1_countTheEntities_sig,
764             "docstring" => $v1_countTheEntities_doc
765         ),
766         "interopEchoTests.echoString" => array(
767             "function" => "i_echoString",
768             "signature" => $i_echoString_sig,
769             "docstring" => $i_echoString_doc
770         ),
771         "interopEchoTests.echoStringArray" => array(
772             "function" => "i_echoStringArray",
773             "signature" => $i_echoStringArray_sig,
774             "docstring" => $i_echoStringArray_doc
775         ),
776         "interopEchoTests.echoInteger" => array(
777             "function" => "i_echoInteger",
778             "signature" => $i_echoInteger_sig,
779             "docstring" => $i_echoInteger_doc
780         ),
781         "interopEchoTests.echoIntegerArray" => array(
782             "function" => "i_echoIntegerArray",
783             "signature" => $i_echoIntegerArray_sig,
784             "docstring" => $i_echoIntegerArray_doc
785         ),
786         "interopEchoTests.echoFloat" => array(
787             "function" => "i_echoFloat",
788             "signature" => $i_echoFloat_sig,
789             "docstring" => $i_echoFloat_doc
790         ),
791         "interopEchoTests.echoFloatArray" => array(
792             "function" => "i_echoFloatArray",
793             "signature" => $i_echoFloatArray_sig,
794             "docstring" => $i_echoFloatArray_doc
795         ),
796         "interopEchoTests.echoStruct" => array(
797             "function" => "i_echoStruct",
798             "signature" => $i_echoStruct_sig,
799             "docstring" => $i_echoStruct_doc
800         ),
801         "interopEchoTests.echoStructArray" => array(
802             "function" => "i_echoStructArray",
803             "signature" => $i_echoStructArray_sig,
804             "docstring" => $i_echoStructArray_doc
805         ),
806         "interopEchoTests.echoValue" => array(
807             "function" => "i_echoValue",
808             "signature" => $i_echoValue_sig,
809             "docstring" => $i_echoValue_doc
810         ),
811         "interopEchoTests.echoBase64" => array(
812             "function" => "i_echoBase64",
813             "signature" => $i_echoBase64_sig,
814             "docstring" => $i_echoBase64_doc
815         ),
816         "interopEchoTests.echoDate" => array(
817             "function" => "i_echoDate",
818             "signature" => $i_echoDate_sig,
819             "docstring" => $i_echoDate_doc
820         ),
821         "interopEchoTests.whichToolkit" => array(
822             "function" => "i_whichToolkit",
823             "signature" => $i_whichToolkit_sig,
824             "docstring" => $i_whichToolkit_doc
825         )
826     );
827
828     if ($findstate2_sig)
829         $a['examples.php.getStateName'] = $findstate2_sig;
830
831     if ($findstate3_sig)
832         $a['examples.php2.getStateName'] = $findstate3_sig;
833
834     if ($findstate4_sig)
835         $a['examples.php3.getStateName'] = $findstate4_sig;
836
837     if ($findstate5_sig)
838         $a['examples.php4.getStateName'] = $findstate5_sig;
839
840     $s=new xmlrpc_server($a, false);
841     $s->setdebug(3);
842     $s->compress_response = true;
843
844     // out-of-band information: let the client manipulate the server operations.
845     // we do this to help the testsuite script: do not reproduce in production!
846     if (isset($_GET['RESPONSE_ENCODING']))
847         $s->response_charset_encoding = $_GET['RESPONSE_ENCODING'];
848     if (isset($_GET['EXCEPTION_HANDLING']))
849         $s->exception_handling = $_GET['EXCEPTION_HANDLING'];
850     $s->service();
851     // that should do all we need!