From 522e08496dfc2714dc71a7431e637389536ef7b7 Mon Sep 17 00:00:00 2001
From: "mkanat%bugzilla.org" <>
Date: Mon, 18 May 2009 21:25:15 +0000
Subject: Bug 477593: Make the WebService send for undef values Patch by
Rosie Clarkson r=mkanat, a=mkanat
---
Bugzilla/WebService/Server/XMLRPC.pm | 47 +++++++++++++++++++++++++++++++++---
1 file changed, 44 insertions(+), 3 deletions(-)
diff --git a/Bugzilla/WebService/Server/XMLRPC.pm b/Bugzilla/WebService/Server/XMLRPC.pm
index cff429fcb..f2b629088 100644
--- a/Bugzilla/WebService/Server/XMLRPC.pm
+++ b/Bugzilla/WebService/Server/XMLRPC.pm
@@ -14,6 +14,9 @@
#
# Contributor(s): Marc Schumann
# Max Kanat-Alexander
+# Rosie Clarkson
+#
+# Portions © Crown copyright 2009 - Rosie Clarkson (development@planningportal.gov.uk) for the Planning Portal
package Bugzilla::WebService::Server::XMLRPC;
@@ -155,6 +158,37 @@ sub as_string {
return $self->SUPER::as_string($value);
}
+# Here the XMLRPC::Serializer is extended to use the XMLRPC nil extension.
+sub encode_object {
+ my $self = shift;
+ my @encoded = $self->SUPER::encode_object(@_);
+
+ return $encoded[0]->[0] eq 'nil'
+ ? ['value', {}, [@encoded]]
+ : @encoded;
+}
+
+sub BEGIN {
+ no strict 'refs';
+ for my $type (qw(double i4 int dateTime)) {
+ my $method = 'as_' . $type;
+ *$method = sub {
+ my ($self, $value) = @_;
+ if (!defined($value)) {
+ return as_nil();
+ }
+ else {
+ my $super_method = "SUPER::$method";
+ return $self->$super_method($value);
+ }
+ }
+ }
+}
+
+sub as_nil {
+ return ['nil', {}];
+}
+
1;
__END__
@@ -201,11 +235,18 @@ Normally, XML-RPC does not allow empty values for C, C, or
C fields. Bugzilla does--it treats empty values as
C (called C or C in some programming languages).
-Bugzilla also accepts a type called C<< >>, which is always considered
-to be C, no matter what it contains.
+Bugzilla also accepts an element called C<< >>, as specified by the
+XML-RPC extension here: L, which
+is always considered to be C, no matter what it contains.
+
+Bugzilla uses C<< >> values to return C, C, or
+C values which are undefined.
=begin private
-nil is implemented by XMLRPC::Lite, in XMLRPC::Deserializer::decode_value.
+nil is implemented by XMLRPC::Lite, in XMLRPC::Deserializer::decode_value
+in the CPAN SVN since 14th Dec 2008
+L and in Fedora's
+perl-SOAP-Lite package in versions 0.68-1 and above.
=end private
--
cgit v1.2.3-24-g4f1b