X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/ef003f48f4a3fe8fb67fda62c70a299b07d75976..fb2e00014da40d677f79b6b07e05ae821e7e10e5:/IkiWiki/Plugin/external.pm

diff --git a/IkiWiki/Plugin/external.pm b/IkiWiki/Plugin/external.pm
index 0d292dfc2..a4cc1dd3c 100644
--- a/IkiWiki/Plugin/external.pm
+++ b/IkiWiki/Plugin/external.pm
@@ -8,7 +8,6 @@ use warnings;
 use strict;
 use IkiWiki 3.00;
 use RPC::XML;
-use RPC::XML::Parser;
 use IPC::Open2;
 use IO::Handle;
 
@@ -29,7 +28,9 @@ sub import {
 
 	$plugins{$plugin}={in => $plugin_read, out => $plugin_write, pid => $pid,
 		accum => ""};
+
 	$RPC::XML::ENCODING="utf-8";
+	$RPC::XML::FORCE_STRING_ENCODING="true";
 
 	rpc_call($plugins{$plugin}, "import");
 }
@@ -55,7 +56,19 @@ sub rpc_call ($$;@) {
 		$plugin->{accum}.=$_;
 		while ($plugin->{accum} =~ /^\s*(<\?xml\s.*?<\/(?:methodCall|methodResponse)>)\n(.*)/s) {
 			$plugin->{accum}=$2;
-			my $r = RPC::XML::Parser->new->parse($1);
+			my $parser;
+			eval q{
+				use RPC::XML::ParserFactory;
+				$parser = RPC::XML::ParserFactory->new;
+			};
+			if ($@) {
+				# old interface
+				eval q{
+					use RPC::XML::Parser;
+					$parser = RPC::XML::Parser->new;
+				};
+			}
+			my $r=$parser->parse($1);
 			error("XML RPC parser failure: $r") unless ref $r;
 			if ($r->isa('RPC::XML::response')) {
 				my $value=$r->value;
@@ -72,9 +85,9 @@ sub rpc_call ($$;@) {
 
 					# XML-RPC v1 does not allow for
 					# nil/null/None/undef values to be
-					# transmitted, so until
-					# XML::RPC::Parser honours v2
-					# (<nil/>), external plugins send
+					# transmitted. The <nil/> extension
+					# is the right fix, but for
+					# back-compat, let external plugins send
 					# a hash with one key "null" pointing
 					# to an empty string.
 					if (exists $hash{null} &&