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(-) (limited to 'Bugzilla') 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