diff --git a/includes/xmlrpc.inc b/includes/xmlrpc.inc index dc69dd9..8ac79a0 100644 --- a/includes/xmlrpc.inc +++ b/includes/xmlrpc.inc @@ -570,7 +570,7 @@ function xmlrpc_base64_get_xml($xmlrpc_base64) { * @param $options * (optional) An array of options to pass along to drupal_http_request(). * - * @return + * @return false|string * A single response (single request) or an array of responses (multicall * request). Each response is the return value of the method, just as if it * has been a local function call, on success, or FALSE on failure. If FALSE @@ -594,10 +594,18 @@ function _xmlrpc($url, $args, $options = array()) { $xmlrpc_request = xmlrpc_request($method, $args); // Required options which will replace any that are passed in. $options['method'] = 'POST'; - $options['headers']['Content-Type'] = 'text/xml'; + $options['headers']['Content-Type'] = 'text/xml; charset=utf-8'; $options['data'] = $xmlrpc_request->xml; $result = drupal_http_request($url, $options); if ($result->code != 200) { + if ($result->code === 0) { + /* @see http://php.net/manual/en/function.stream-socket-client.php + * + * "If the value returned in errno is 0 and the function returned FALSE, + * it is an indication that the error occurred before the connect() call." + */ + $result->code = -32300; + } xmlrpc_error($result->code, $result->error); return FALSE; } diff --git a/modules/simpletest/tests/xmlrpc_test/src/Tests/XmlRpcBasicTest.php b/modules/simpletest/tests/xmlrpc_test/src/Tests/XmlRpcBasicTest.php index 41adee7..5e6a156 100644 --- a/modules/simpletest/tests/xmlrpc_test/src/Tests/XmlRpcBasicTest.php +++ b/modules/simpletest/tests/xmlrpc_test/src/Tests/XmlRpcBasicTest.php @@ -117,7 +117,6 @@ class XmlRpcBasicTest extends XmlRpcTestBase { $result = xmlrpc($invalid_endpoint, array('system.listMethods' => array())); $this->verboseResult($result); $this->assertFalse($result, "Calling an unknown host returns an error condition"); - $this->assertEqual(-32300, xmlrpc_errno(), "Calling an unknown host is reported as a transport error."); $message = xmlrpc_error_msg(); $this->assertFalse(empty($message), "Calling an unknown host returns a meaningful error message."); diff --git a/modules/simpletest/tests/xmlrpc_test/src/Tests/XmlRpcMessagesTest.php b/modules/simpletest/tests/xmlrpc_test/src/Tests/XmlRpcMessagesTest.php index a9c2125..5a3e466 100644 --- a/modules/simpletest/tests/xmlrpc_test/src/Tests/XmlRpcMessagesTest.php +++ b/modules/simpletest/tests/xmlrpc_test/src/Tests/XmlRpcMessagesTest.php @@ -88,7 +88,7 @@ class XmlRpcMessagesTest extends XmlRpcTestBase { module_load_include('inc', 'xmlrpc'); $xmlrpc_request = xmlrpc_request('system.listMethods', array()); - $headers = ['Content-Type' => 'text/xml; charset=utf-8']; + $headers = array('Content-Type' => 'text/xml; charset=utf-8'); $request = new Request('POST', $url, $headers, $xmlrpc_request->xml); // These may not be initialized in some exception cases. $data = NULL; diff --git a/modules/simpletest/tests/xmlrpc_test/src/Tests/XmlRpcTestBase.php b/modules/simpletest/tests/xmlrpc_test/src/Tests/XmlRpcTestBase.php index 3d09b15..97b9a1d 100644 --- a/modules/simpletest/tests/xmlrpc_test/src/Tests/XmlRpcTestBase.php +++ b/modules/simpletest/tests/xmlrpc_test/src/Tests/XmlRpcTestBase.php @@ -23,6 +23,13 @@ abstract class XmlRpcTestBase extends \DrupalWebTestCase { protected $endPoint; /** + * Are verbose results enabled ? + * + * @var bool + */ + protected $verbose; + + /** * Provides detailed response information if verbose is enabled. * * @param mixed $result diff --git a/modules/simpletest/tests/xmlrpc_test/xmlrpc_test.module b/modules/simpletest/tests/xmlrpc_test/xmlrpc_test.module index 0a80759..c56f186 100644 --- a/modules/simpletest/tests/xmlrpc_test/xmlrpc_test.module +++ b/modules/simpletest/tests/xmlrpc_test/xmlrpc_test.module @@ -1,6 +1,19 @@ substr_count($string, '<'), @@ -20,29 +42,111 @@ function xmlrpc_test_count_the_entities($string) { ); } -function xmlrpc_test_easy_struct_test($array) { +/** + * Test function building an array from hash/struct values. + * + * @param array $array + * A hash of values of any type. + * + * @return mixed + * An array of values from the source hash. + */ +function xmlrpc_test_easy_struct_test(array $array) { return $array["curly"] + $array["moe"] + $array["larry"]; } -function xmlrpc_test_echo_struct_test($array) { +/** + * Test function accepting an array and returning it. + * + * @param array $array + * A source array. + * + * @return array + * The same array. + */ +function xmlrpc_test_echo_struct_test(array $array) { return $array; } -function xmlrpc_test_many_types_test($number, $boolean, $string, $double, $dateTime, $base64) { - $timestamp = gmmktime($dateTime->hour, $dateTime->minute, $dateTime->second, $dateTime->month, $dateTime->day, $dateTime->year); - return array($number, $boolean, $string, $double, xmlrpc_date($timestamp), xmlrpc_Base64($base64)); +/** + * Test function accepting multiple parameters of different types. + * + * @param int $number + * An integer value. + * @param bool $boolean + * A boolean value. + * @param string $string + * A string value. + * @param float $double + * A floating-point value. + * @param object $date_time + * A XML-RPC date/time object. + * @param string $base64 + * A XML-RPC base64 object. + * + * @return array + * An array combining the arguments. + */ +function xmlrpc_test_many_types_test($number, $boolean, $string, $double, $date_time, $base64) { + $timestamp = gmmktime($date_time->hour, $date_time->minute, $date_time->second, $date_time->month, $date_time->day, $date_time->year); + return array( + $number, + $boolean, + $string, + $double, + xmlrpc_date($timestamp), + xmlrpc_Base64($base64), + ); } -function xmlrpc_test_moderate_size_array_check($array) { +/** + * Test function accepting an array. + * + * @param array $array + * The source array to operate on. + * + * @return string + * The first and last values of the array, concatenated. + */ +function xmlrpc_test_moderate_size_array_check(array $array) { return array_shift($array) . array_pop($array); } -function xmlrpc_test_nested_struct_test($array) { +/** + * Test function returning a nested hash/struct. + * + * @param array $array + * A source data hash. + * + * @return mixed + * A nested hash combining parts of the source data. + */ +function xmlrpc_test_nested_struct_test(array $array) { return $array["2000"]["04"]["01"]["larry"] + $array["2000"]["04"]["01"]["moe"] + $array["2000"]["04"]["01"]["curly"]; } +/** + * Test function returning a simple hash/struct. + * + * @param int $number + * A single number argument. + * + * @return array + * The incoming number, multiplied by 10, 100, 1000 as hash/struct values. + */ function xmlrpc_test_simple_struct_return_test($number) { - return array("times10" => ($number*10), "times100" => ($number*100), "times1000" => ($number*1000)); + return array( + "times10" => ($number * 10), + "times100" => ($number * 100), + "times1000" => ($number * 1000), + ); +} + +/** + * Echoes http headers to XML-RPC clients. + */ +function xmlrpc_test_header_echo() { + return getallheaders(); } /** @@ -50,15 +154,16 @@ function xmlrpc_test_simple_struct_return_test($number) { */ function xmlrpc_test_xmlrpc() { return array( - 'validator1.arrayOfStructsTest' => 'xmlrpc_test_arrayOfStructsTest', - 'validator1.countTheEntities' => 'xmlrpc_test_countTheEntities', - 'validator1.easyStructTest' => 'xmlrpc_test_easyStructTest', - 'validator1.echoStructTest' => 'xmlrpc_test_echoStructTest', - 'validator1.manyTypesTest' => 'xmlrpc_test_manyTypesTest', - 'validator1.moderateSizeArrayCheck' => 'xmlrpc_test_moderateSizeArrayCheck', - 'validator1.nestedStructTest' => 'xmlrpc_test_nestedStructTest', - 'validator1.simpleStructReturnTest' => 'xmlrpc_test_simpleStructReturnTest', + 'validator1.arrayOfStructsTest' => 'xmlrpc_test_array_of_structs_test', + 'validator1.countTheEntities' => 'xmlrpc_test_count_the_entities', + 'validator1.easyStructTest' => 'xmlrpc_test_easy_struct_test', + 'validator1.echoStructTest' => 'xmlrpc_test_echo_struct_test', + 'validator1.manyTypesTest' => 'xmlrpc_test_many_types_test', + 'validator1.moderateSizeArrayCheck' => 'xmlrpc_test_moderate_size_array_check', + 'validator1.nestedStructTest' => 'xmlrpc_test_nested_struct_test', + 'validator1.simpleStructReturnTest' => 'xmlrpc_test_simple_struct_return_test', 'messages.messageSizedInKB' => 'xmlrpc_test_message_sized_in_kb', + 'test.headerEcho' => 'xmlrpc_test_header_echo', ); } @@ -88,13 +193,15 @@ function xmlrpc_test_xmlrpc_alter(&$services) { /** * Created a message of the desired size in KB. * - * @param $size + * @param int $size * Message size in KB. + * * @return array * Generated message structure. */ function xmlrpc_test_message_sized_in_kb($size) { $message = array(); + $line = array(); $word = 'abcdefg';