gggeek /
phpxmlrpc
| 1 | <?php |
||||
| 2 | require_once __DIR__ . "/_prepend.php"; |
||||
| 3 | |||||
| 4 | 1 | output('<html lang="en"> |
|||
| 5 | <head><title>phpxmlrpc - Proxy demo</title></head> |
||||
| 6 | <body> |
||||
| 7 | <h1>proxy demo</h1> |
||||
| 8 | <h2>Query server using a "proxy" object</h2> |
||||
| 9 | <h3>The code demonstrates usage for the terminally lazy. For a more complete proxy, look at the Wrapper class</h3> |
||||
| 10 | <p>You can see the source to this page here: <a href="proxy.php?showSource=1">proxy.php</a></p> |
||||
| 11 | '); |
||||
| 12 | |||||
| 13 | class XmlRpcProxy |
||||
| 14 | { |
||||
| 15 | protected $client; |
||||
| 16 | protected $prefix; |
||||
| 17 | protected $encoder; |
||||
| 18 | 1 | protected $encodingOptions = array(); |
|||
| 19 | |||||
| 20 | 1 | /** |
|||
| 21 | 1 | * We rely on injecting a fully-formed Client, so that all the necessary http/debugging options can be set into it |
|||
| 22 | 1 | * without the need for this class to reimplement support for that configuration. |
|||
| 23 | */ |
||||
| 24 | public function __construct(PhpXmlRpc\Client $client, $prefix = 'examples.', $encodingOptions = array()) |
||||
| 25 | { |
||||
| 26 | $this->client = $client; |
||||
| 27 | $this->prefix = $prefix; |
||||
| 28 | $this->encodingOptions = $encodingOptions; |
||||
| 29 | $this->encoder = new PhpXmlRpc\Encoder(); |
||||
| 30 | } |
||||
| 31 | |||||
| 32 | /** |
||||
| 33 | * Translates any php method call to an xml-rpc call. |
||||
| 34 | * Note that the server might expose methods which can not be called directly this way, because their name includes |
||||
| 35 | * characters which are not allowed in a php method. That's why we implement as well method `call` |
||||
| 36 | 1 | * |
|||
| 37 | * @author Toth Istvan |
||||
| 38 | 1 | * |
|||
| 39 | 1 | * @param string $name remote function name. Will be prefixed |
|||
| 40 | 1 | * @param array $arguments any php value will do. For xml-rpc base64 values, wrap them in a Value object |
|||
| 41 | 1 | * @return mixed |
|||
| 42 | * |
||||
| 43 | * @throws Exception |
||||
| 44 | */ |
||||
| 45 | 1 | public function __call($name, $arguments) |
|||
| 46 | { |
||||
| 47 | 1 | $args = array(); |
|||
| 48 | foreach ($arguments as $parameter) { |
||||
| 49 | 1 | $args[] = $this->encoder->encode($parameter, $this->encodingOptions); |
|||
| 50 | } |
||||
| 51 | |||||
| 52 | 1 | // just in case this was set to something else |
|||
| 53 | $originalReturnType = $this->client->getOption(\PhpXmlRpc\Client::OPT_RETURN_TYPE); |
||||
| 54 | $this->client->setOption(\PhpXmlRpc\Client::OPT_RETURN_TYPE, 'phpvals'); |
||||
| 55 | |||||
| 56 | $resp = $this->client->send(new PhpXmlRpc\Request($this->prefix.$name, $args)); |
||||
| 57 | |||||
| 58 | $this->client->setOption(\PhpXmlRpc\Client::OPT_RETURN_TYPE, $originalReturnType); |
||||
| 59 | |||||
| 60 | if ($resp->faultCode()) { |
||||
| 61 | throw new \Exception($resp->faultString(), $resp->faultCode()); |
||||
| 62 | } else { |
||||
| 63 | return $resp->value(); |
||||
| 64 | } |
||||
| 65 | } |
||||
| 66 | |||||
| 67 | /** |
||||
| 68 | * In case the remote method name has characters which are not valid as php method names, use this. |
||||
| 69 | * (note that, in theory this is unlikely, as php has a broader definition for identifiers than xml-rpc method names) |
||||
| 70 | * |
||||
| 71 | * @param string $name remote function name. Will be prefixed |
||||
| 72 | 1 | * @param array $arguments any php value will do. For xml-rpc base64 values, wrap them in a Value object |
|||
| 73 | 1 | * @return mixed |
|||
| 74 | 1 | * |
|||
| 75 | * @throws Exception |
||||
| 76 | 1 | */ |
|||
| 77 | public function call($name, $arguments) |
||||
| 78 | 1 | { |
|||
| 79 | return $this->__call($name, $arguments); |
||||
| 80 | 1 | } |
|||
| 81 | } |
||||
| 82 | |||||
| 83 | $proxy = new XmlRpcProxy(new PhpXmlRpc\Client(XMLRPCSERVER)); |
||||
| 84 | |||||
| 85 | $stateNo = rand(1, 51); |
||||
| 86 | // sadly, no IDE will be able to assist with autocompletion for this method, unless you manually add an equivalent phpdoc comment... |
||||
| 87 | $stateName = $proxy->getStateName($stateNo); |
||||
|
0 ignored issues
–
show
Bug
introduced
by
Loading history...
|
|||||
| 88 | |||||
| 89 | output("State $stateNo is ".htmlspecialchars($stateName)); |
||||
|
0 ignored issues
–
show
It seems like
$stateName can also be of type PhpXmlRpc\Value; however, parameter $string of htmlspecialchars() does only seem to accept string, maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||
| 90 | |||||
| 91 | output("</body></html>\n"); |
||||
| 92 |