4.10.0
-
changed: the minimum php version required has been increased to 5.4
-
changed: dropped support for parsing cookie headers which follow the obsolete Cookie2 specification
-
new: it is now possible to make the library generate warning messages whenever a deprecated feature is used, such as
calling deprecated methods, using deprecated method parameters, or reading/writing deprecated object properties.
This is disabled by default, and can be enabled by settingPhpXmlRpc\PhpXmlRpc::xmlrpc_silence_deprecations = false
.
Note that the deprecation warnings will be by default added to the php error log, and not be displayed on screen.
If you prefer them to be handled in some other way, you should take over the Logger, as described below here -
new: allow to specify other charsets than the canonical three (UTF-8, ISO-8859-1, ASCII), when mbstring is
available, both for outgoing and incoming data (issue #42).For outgoing data, this can be set in
$client->request_charset_encoding
and$server->response_charset_encoding
.
The library will then transcode the data fed to it by the application into the desired charset when serializing
it for transmission.For incoming data, this can be set using
PhpXmlRpc::$internal_encoding
. The library will then transcode the data
received from 3rd parties into the desired charset when handling it back to the application.An example of using this feature has been added to demo file
windowscharset.php
-
new: allow the library to pass to the application DateTime objects instead of string for all received dateTime.iso8601
xml-rpc values. This includes both client-side, for data within the$response->value()
, and server-side, for data
passed to xml-rpc method handlers, and works for both 'xmlrpcvals' and 'phpvals' modes.
In order to enable this, you should setPhpXmlRpc\PhpXmlRpc::$xmlrpc_return_datetimes = true
.NB: since the xml-rpc spec mandates that no Timezone is used on the wire for dateTime values, the DateTime objects
created by the library will be set to the default php timezone, set using the 'date.timezone' ini setting.NB: if the received strings are not parseable as dates, NULL will be returned instead of an object, but that can
be avoided by settingPhpXmlRpc\PhpXmlRpc::$xmlrpc_reject_invalid_values = true
, see below. -
improved: be more strict in the
Response
constructor and inRequest::addParam
: both of those will now generate
an error message in the log if passed unexpected values -
improved: be more strict in the data accepted as valid for dateTime xml-rpc values. Clearly invalid dates such as a
month '13', day '32' or hour '25' will cause an error message to be logged or the value to be rejected, depending
on configuration -
improved: be more strict in the data accepted as valid for 'float' and 'int' xml-rpc values. If you need to allow
different formats for numbers, you can set a custom value toPhpXmlRpc\PhpXmlRpc::$xmlrpc_double_format
and
PhpXmlRpc\PhpXmlRpc::$xmlrpc_int_format
-
new: allow the library to be stricter in parsing the received xml: by setting
PhpXmlRpc\PhpXmlRpc::$xmlrpc_reject_invalid_values = true
, incoming xml which has data not conforming to the expected
format for value elements of type date, int, float, double, base64 and methodname will be rejected instead of passed
on to the application. The same will apply for elements of type struct-member which miss either the name or the value -
new: it is now possible to tell the library to allow non-standard formats for received datetime value, such as f.e.
datetimes with a timezone specifier, by setting a custom value toPhpXmlRpc\PhpXmlRpc::$xmlrpc_datetime_format
(issue #46). -
new: it is now possible to tell the library to allow non-standard formats for received int and float values, as well
as for methdoname elements. See the api docs forPhpXmlRpc\PhpXmlRpc
static variables. -
fixed: when a server is configured with its default value of 'xmlrpcvals' for
$functions_parameters_type
, and
a method handler in the dispatch was defined with'parameters_type' = 'phpvals'
, the handler would be passed a
Request object instead of plain php values. -
fixed: made sure all debug output goes through the logger at response parsing time (there was one printf call left)
-
fixed:
Client::send
will now return an error Response when it is requested to use an auth method that it does not
support, instead of logging an error message and continuing with another auth schema. The returned error code is 20 -
fixed: when calling
Client::multicall()
with$client->return_type = 'xml'
, the code would be always falling back to
non-multicall requests -
fixed: support calling
Client::setSSLVersion()
for the case of not using curl transport -
fixed: receiving integers which use the 'EX:I8' xml tag
-
fixed: setting/retrieving the php value from a Value object using array notation would fail if the object was created
usingi4
then accessed usingint
, eg:$v = new Value(1, 'i4'); $v[$v->scalrtyp()] = 2;
-
fixed: setting values to deprecated Response property
cookies
would trigger a PHP notice, ex:
$response->_cookies['name'] = ['value' => 'something'];
(introduced in 4.6.0) -
fixed: made deprecated method
Value::structEach
work again with php 8.0 and later -
new: method
PhpXmlRpc::useInteropFaults()
can be used to make the library change the error codes it generates to
match the spec described at https://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php -
new: both
Request
andResponse
acquired methodsgetPayload
andgetContentType
-
new: method
Response::valueType()
-
new: method
Client::getUrl()
-
new: method
Server::setDispatchMap()
-
new: added methods
getOption
,setOption
,setOptions
andgetOptions
to both Client and Server, meant to replace
direct access to all public properties as well as the$timeout
argument in calls toClient::send
andClient::multicall
-
new: by using
Client::setOption('extracurlopts')
, it is possible to pass in protocol=specific options for when
using the Socket http transport. The value has to be an array with key being 'socket' or 'ssl', and the value an array
(see https://www.php.net/manual/en/context.socket.php and https://www.php.net/manual/en/context.ssl.php) -
new: it is now possible to inject a custom logger into helper classes
Charset
,Http
,XMLParser
, inching a step
closer to supporting DIC patterns (issue #78) -
new: method
PhpXmlRpc::setLogger()
, to simplify injecting a custom logger into all classes of the library in one step -
improved: the Client will automatically try to use cURL for requests using Digest/NTLM auth, unless told explicitly
told not to do so via option 'use_curl' -
improved: the Client is more verbose in logging issues when trying to compress a Request for sending
-
improved: the
Logger
class now sports methods adhering to Psr\Log\LoggerInterface -
improved: limit the size of incoming data which will be used in error responses and logged error messages, making
it slightly harder to carry out DOS attacks against the library -
new: passing value -1 to
$client->setDebug
will avoid storing the full http response data in the returned Response
object when executingcall
. This could be useful in reducing memory usage for big responses -
new: when calling
Wrapper::wrapXmlrpcMethod
andwrapXmlrpcServer
, it is possible to pass 'throw_on_fault' as option
to argument$extraOptions
. This will make the generated function throw on http errors and xml-rpc faults instead of
returning a Response object -
new: when calling
Wrapper::wrapXmlrpcMethod
,wrapXmlrpcServer
,wrapPhpFunction
andwrapPhpClass
it is possible
to pass 'encode_nulls' as option to argument$extraOptions
. This will make the generated code emit a ''
xml-rpc element for php null values, instead of emitting an empty-string xml-rpc element -
new: methods
Wrapper::holdObject()
andWrapper::getheldObject()
, allowing flexibility in storing object instances
for code-generation scenarios involvingWrapper::wrapPhpClass
andWrapper::wrapPhpFunction
-
improved: all
Value
methods now follow snakeCase convention -
improved: all the Exceptions thrown by the library are now
\PhpXmlRpc\Exception
or subclasses thereof -
improved: all the Client's
setSomething()
methods now return the client object, allowing for usage of fluent style
calling. The same applies toRequest::setDebug
-
improved: when calling
Client::multicall()
, the returnedResponse
objects did not have any data in theirhttpResponse
-
new: method
Helper\Date::iso8601Encode
now accepts a DateTime input beside a timestamp -
new: in the dispatch map, it is now possible to set different exception handling modes for each exposed xml-rpc method
-
new: method
Server::add_to_map
is deprecated in favour ofaddToMap
. It has also acquired new parameters:
$parametersType = false, $exceptionHandling = false
-
improved: the
XMLParser
accepts more options in its constructor (see phpdocs for details) -
improved: removed usage of
extension_loaded
in favour offunction_exists
when checking for mbstring. This allows
for mbstring functions to be polyfilled -
improved: the code generated by the various code-generating methods of
Wrapper
are formatted better, and include
more phpdoc blocks too -
improved: made the
Wrapper
andClient
classes easy to subclass for use by the PhpJsonRpc library -
improved: added the library version number to the debugger title line
-
improved: the debugger will now sport the "load method synopsis" button when interacting with json-rpc servers
-
improved: added an example Symfony Client and Server to the demo files (using Symfony 6 / PHP 8 syntax)
-
improved: added to the
taskfile
command an option to automatically set up the git hooks for development -
improved: made sure the test container and gha test runners have at least one locale with comma as decimal separator
-
BC notes:
NB Given the considerable amount of API changes in this release, a set of tables listing every change has been
added in doc/api_changes_v4.10.md; a textual description follows.Besides what can be inferred from the changes listed above, for library users:
- the data passed to the application is not encoded anymore in UTF-8 when setting
PhpXmlRpc::$internal_encoding
to a custom character set and the mbstring extension is enabled. It will be encoded instead in the specified character
set. We expect this to affect few users, as settingPhpXmlRpc::$internal_encoding
to a custom character set did
not make a lot of sense beforehand - the regular expression used to check if incoming int and double values are valid has been tightened. That can be
tweaked via use ofPhpXmlRpc\PhpXmlRpc::$xmlrpc_double_format
andPhpXmlRpc\PhpXmlRpc::$xmlrpc_int_format
- the regular expression used to check if incoming datetime values are valid has been tightened to reject clearly
invalid dates. It has been widened as well, to allow leap seconds. That can be tweaked via use of
PhpXmlRpc\PhpXmlRpc::$xmlrpc_datetime_format
- a regular expression has been introduced to check incoming 'methodname' elements. In the default configuration it
will trigger error messages in the logs, but not reject the calls. It can be tweaked via use of
PhpXmlRpc\PhpXmlRpc::$xmlrpc_methodname_format
- an error message will now be generated if, in incoming data, a STRUCT element has no NAME
- parameters
$timeout
and$method
are now considered deprecated inClient::send()
andClient::multicall()
- Client properties
$errno
and$errstring
are now deprecated - direct access to all properties of Client and Server is now deprecated and should be replaced by calls to
setOption
/getOption
. The same applies to the following "setter" methods of the Client:setSSLVerifyPeer
,
setSSLVerifyHost
,setSSLVersion
,setRequestCompression
,setCurlOptions
,setUseCurl
,setUserAgent
- direct access to
Wrapper::$objHolder
is now deprecated - the code generated by the debugger when using "Generate stub for method call" will throw on errors instead of
returning a Response object
For library extenders:
- the
$options
argument passed toXMLParser::parse
will now contain both options intended to be passed down to
the php xml parser, and further options used to tweak the parsing results. If you have subclassedXMLParser
and reimplemented theparse
methods, or wholesale replaced it, you will have to adapt your code: both for that,
and for making sure that it sets$this->current_parsing_options['xmlrpc_null_extension']
from
PhpXmlRpc::$xmlrpc_null_extension
- also, if you had reimplemented
XMLParser::parse
, be warned that:- you should return
$this->_xh
instead of void - the callers now treat differently results when
_xh['isf'] > 3
- you should return
Client
protected methodssendPayloadSocket
,sendPayloadCURL
andprepareCurlHandle
are now deprecated. They
have been replaced bysendViaSocket
,sendViaCURL
andcreateCurlHandle
respectively- if you subclassed the
Client
class, take care of new static variables$requestClass
and$responseClass
,
which should be used to instantiate requests and responses - if you had been somehow interacting with private method
Client::_try_multicall
, be warned its returned data has
changed: it now returns a Response for the cases in which it previously returned false, and an array of Response
objects for the cases in which it previously returned a string - if you replaced the Logger class, take care that you will have to implement methods
error
,warning
anddebug
(all is ok if you subclassed it) - calling method
Value::serializeData
is now deprecated - traits have been introduced for all classes dealing with Logger, XMLParser and CharsetEncoder; method
setCharsetEncoder
is now static - new methods in helper classes:
Charset::knownCharsets
,Http::parseAcceptHeader
,XMLParser::truncateValueForLog
- new method
Response::xml_header
has replacedServer::xml_header
- protected property
Server::$accepted_charset_encodings
is now deprecated - exception
\PhpXmlRpc\Exception\PhpXmlRpcException
is deprecated. Use\PhpXmlRpc\Exception
instead
- the data passed to the application is not encoded anymore in UTF-8 when setting