make it possible to retrieve from Response error http codes; introduce custom excepti...
[plcapi.git] / lib / xmlrpc.inc
1 <?php
2 // by Edd Dumbill (C) 1999-2002
3 // <edd@usefulinc.com>
4
5 // Copyright (c) 1999,2000,2002 Edd Dumbill.
6 // All rights reserved.
7 //
8 // Redistribution and use in source and binary forms, with or without
9 // modification, are permitted provided that the following conditions
10 // are met:
11 //
12 //    * Redistributions of source code must retain the above copyright
13 //      notice, this list of conditions and the following disclaimer.
14 //
15 //    * Redistributions in binary form must reproduce the above
16 //      copyright notice, this list of conditions and the following
17 //      disclaimer in the documentation and/or other materials provided
18 //      with the distribution.
19 //
20 //    * Neither the name of the "XML-RPC for PHP" nor the names of its
21 //      contributors may be used to endorse or promote products derived
22 //      from this software without specific prior written permission.
23 //
24 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
27 // FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
28 // REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
29 // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
30 // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
31 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32 // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
33 // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
35 // OF THE POSSIBILITY OF SUCH DAMAGE.
36
37 /******************************************************************************
38  *
39  * *** DEPRECATED ***
40  *
41  * This file is only used to insure backwards compatibility
42  * with the API of the library <= rev. 3
43  *
44  * If it is included, the library will work without any further autoloading.
45  *
46  * NB: including this file will also alter the library configuration setting the
47  * expected charset encoding used by the app to ISO-8859-1. Please see the
48  * file api_changes_v4.md for how to change this if required.
49  *****************************************************************************/
50
51 include_once(__DIR__.'/../src/Client.php');
52 include_once(__DIR__.'/../src/Encoder.php');
53 include_once(__DIR__.'/../src/PhpXmlRpc.php');
54 include_once(__DIR__.'/../src/Request.php');
55 include_once(__DIR__.'/../src/Response.php');
56 include_once(__DIR__.'/../src/Value.php');
57 include_once(__DIR__.'/../src/Exception/HttpException.php');
58 include_once(__DIR__.'/../src/Exception/PhpXmlrpcException.php');
59 include_once(__DIR__.'/../src/Helper/Charset.php');
60 include_once(__DIR__.'/../src/Helper/Date.php');
61 include_once(__DIR__.'/../src/Helper/Http.php');
62 include_once(__DIR__.'/../src/Helper/Logger.php');
63 include_once(__DIR__.'/../src/Helper/XMLParser.php');
64
65 use PhpXmlRpc\Client;
66 use PhpXmlRpc\Encoder;
67 use PhpXmlRpc\Request;
68 use PhpXmlRpc\Response;
69 use PhpXmlRpc\Value;
70 use PhpXmlRpc\Helper\Charset;
71 use PhpXmlRpc\Helper\Date;
72 use PhpXmlRpc\Helper\Http;
73 use PhpXmlRpc\Helper\XMLParser;
74
75 /* Expose the global variables which used to be defined */
76 PhpXmlRpc\PhpXmlRpc::$xmlrpc_internalencoding = 'ISO-8859-1'; // old default
77 PhpXmlRpc\PhpXmlRpc::exportGlobals();
78
79 /* some stuff deprecated enough that we do not want to put it in the new lib version */
80
81 /// @deprecated
82 $GLOBALS['xmlEntities'] = array(
83     'amp'  => '&',
84     'quot' => '"',
85     'lt'   => '<',
86     'gt'   => '>',
87     'apos' => "'"
88 );
89
90 // formulate backslashes for escaping regexp
91 // Not in use anymore since 2.0. Shall we remove it?
92 /// @deprecated
93 $GLOBALS['xmlrpc_backslash'] = chr(92).chr(92);
94
95 /* Expose with the old names the classes which have been namespaced */
96
97 /**
98  * @todo reinstate access to method serializedata ?
99  */
100 class xmlrpcval extends Value
101 {
102     /**
103      * @deprecated
104      * @param xmlrpcval $o
105      * @return string
106      */
107     public function serializeval($o)
108     {
109         // add check? slower, but helps to avoid recursion in serializing broken xmlrpcvals...
110         //if (is_object($o) && (get_class($o) == 'xmlrpcval' || is_subclass_of($o, 'xmlrpcval')))
111         //{
112         $ar = $o->me;
113         $val = reset($ar);
114         $typ = key($ar);
115
116         return '<value>' . $this->serializedata($typ, $val) . "</value>\n";
117         //}
118     }
119
120     /**
121      * @deprecated this code looks like it is very fragile and has not been fixed
122      * for a long long time. Shall we remove it for 2.0?
123      */
124     public function getval()
125     {
126         // UNSTABLE
127         $b = reset($this->me);
128         $a = key($this->me);
129         // contributed by I Sofer, 2001-03-24
130         // add support for nested arrays to scalarval
131         // i've created a new method here, so as to
132         // preserve back compatibility
133
134         if (is_array($b)) {
135             foreach($b as $id => $cont) {
136                 $b[$id] = $cont->scalarval();
137             }
138         }
139
140         // add support for structures directly encoding php objects
141         if (is_object($b)) {
142             $t = get_object_vars($b);
143             foreach($t as $id => $cont) {
144                 $t[$id] = $cont->scalarval();
145             }
146             foreach($t as $id => $cont) {
147                 @$b->$id = $cont;
148             }
149         }
150         // end contrib
151         return $b;
152     }
153
154     /// reset functionality added by parent class: same as it would happen if no interface was declared
155     public function count()
156     {
157         return 1;
158     }
159
160     /// reset functionality added by parent class: same as it would happen if no interface was declared
161     public function getIterator()
162     {
163         return new ArrayIterator($this);
164     }
165 }
166
167 /**
168  * @todo reinstate access to method parseResponseHeaders ?
169  */
170 class xmlrpcmsg extends Request
171 {
172 }
173
174 class xmlrpcresp extends Response
175 {
176 }
177
178 /**
179  * @todo reinstate access to methods sendPayloadHTTP10, sendPayloadHTTPS, sendPayloadCURL, _try_multicall ?
180  */
181 class xmlrpc_client extends Client
182 {
183 }
184
185 /* Expose as global functions the ones which are now class methods */
186
187 /// Wrong speling, but we are adamant on backwards compatibility!
188 function xmlrpc_encode_entitites($data, $srcEncoding='', $destEncoding='')
189 {
190     return Charset::instance()->encodeEntities($data, $srcEncoding, $destEncoding);
191 }
192
193 function iso8601_encode($timeT, $utc=0)
194 {
195     return Date::iso8601Encode($timeT, $utc);
196 }
197
198 function iso8601_decode($iDate, $utc=0)
199 {
200     return Date::iso8601Decode($iDate, $utc);
201 }
202
203 function decode_chunked($buffer)
204 {
205     return Http::decodeChunked($buffer);
206 }
207
208 function php_xmlrpc_decode($xmlrpcVal, $options=array())
209 {
210     $encoder = new Encoder();
211     return $encoder->decode($xmlrpcVal, $options);
212 }
213
214 function php_xmlrpc_encode($phpVal, $options=array())
215 {
216     $encoder = new Encoder();
217     return $encoder->encode($phpVal, $options);
218 }
219
220 function php_xmlrpc_decode_xml($xmlVal, $options=array())
221 {
222     $encoder = new Encoder();
223     return $encoder->decodeXml($xmlVal, $options);
224 }
225
226 function guess_encoding($httpHeader='', $xmlChunk='', $encodingPrefs=null)
227 {
228     return XMLParser::guessEncoding($httpHeader, $xmlChunk, $encodingPrefs);
229 }
230
231 function has_encoding($xmlChunk)
232 {
233     return XMLParser::hasEncoding($xmlChunk);
234 }
235
236 function is_valid_charset($encoding, $validList)
237 {
238     return Charset::instance()->isValidCharset($encoding, $validList);
239 }