aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/xmlrpc/datetime.rb4
-rw-r--r--lib/xmlrpc/parser.rb32
-rw-r--r--test/xmlrpc/data/datetime_iso8601.xml8
-rw-r--r--test/xmlrpc/test_parser.rb30
4 files changed, 54 insertions, 20 deletions
diff --git a/lib/xmlrpc/datetime.rb b/lib/xmlrpc/datetime.rb
index e3bc6943f0..8ae6c7a56e 100644
--- a/lib/xmlrpc/datetime.rb
+++ b/lib/xmlrpc/datetime.rb
@@ -126,6 +126,10 @@ class DateTime
[@year, @month, @day, @hour, @min, @sec]
end
+ def ==(o)
+ self.to_a == o.to_a
+ end
+
end
diff --git a/lib/xmlrpc/parser.rb b/lib/xmlrpc/parser.rb
index ed0e9a66f3..db99bafafc 100644
--- a/lib/xmlrpc/parser.rb
+++ b/lib/xmlrpc/parser.rb
@@ -84,18 +84,32 @@ module XMLRPC
end
def self.dateTime(str)
- if str =~ /^(-?\d\d\d\d)(\d\d)(\d\d)T(\d\d):(\d\d):(\d\d)$/ then
- # TODO: Time.gm ??? .local ???
+ case str
+ when /^(-?\d\d\d\d)-?(\d\d)-?(\d\d)T(\d\d):(\d\d):(\d\d)(?:Z|([+-])(\d\d):?(\d\d))?$/
+ a = [$1, $2, $3, $4, $5, $6].collect{|i| i.to_i}
+ if $7
+ ofs = $8.to_i*3600 + $9.to_i*60
+ ofs = -ofs if $7=='+'
+ utc = Time.utc(a.reverse) + ofs
+ a = [ utc.year, utc.month, utc.day, utc.hour, utc.min, utc.sec ]
+ end
+ XMLRPC::DateTime.new(*a)
+ when /^(-?\d\d)-?(\d\d)-?(\d\d)T(\d\d):(\d\d):(\d\d)(Z|([+-]\d\d):(\d\d))?$/
a = [$1, $2, $3, $4, $5, $6].collect{|i| i.to_i}
-
+ if a[0] < 70
+ a[0] += 2000
+ else
+ a[0] += 1900
+ end
+ if $7
+ ofs = $8.to_i*3600 + $9.to_i*60
+ ofs = -ofs if $7=='+'
+ utc = Time.utc(a.reverse) + ofs
+ a = [ utc.year, utc.month, utc.day, utc.hour, utc.min, utc.sec ]
+ end
XMLRPC::DateTime.new(*a)
- #if a[0] >= 1970 then
- # Time.gm(*a)
- #else
- # Date.new(*a[0,3])
- #end
else
- raise "wrong dateTime.iso8601 format"
+ raise "wrong dateTime.iso8601 format " + str
end
end
diff --git a/test/xmlrpc/data/datetime_iso8601.xml b/test/xmlrpc/data/datetime_iso8601.xml
new file mode 100644
index 0000000000..43d8da6c13
--- /dev/null
+++ b/test/xmlrpc/data/datetime_iso8601.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<methodResponse>
+ <params>
+ <param>
+ <value><dateTime.iso8601>20041105T01:15:23Z</dateTime.iso8601></value>
+ </param>
+ </params>
+</methodResponse>
diff --git a/test/xmlrpc/test_parser.rb b/test/xmlrpc/test_parser.rb
index 3e55cdb35a..3665b6e1af 100644
--- a/test/xmlrpc/test_parser.rb
+++ b/test/xmlrpc/test_parser.rb
@@ -1,25 +1,29 @@
$LOAD_PATH.unshift '../../lib'
require 'test/unit'
+require 'xmlrpc/datetime'
require "xmlrpc/parser"
module GenericParserTest
def setup
- @xml1 = File.readlines("data/xml1.xml").to_s
- @expected1 = File.readlines("data/xml1.expected").to_s.chomp
+ @xml1 = File.read("data/xml1.xml")
+ @expected1 = File.read("data/xml1.expected").chomp
- @xml2 = File.readlines("data/bug_covert.xml").to_s
- @expected2 = File.readlines("data/bug_covert.expected").to_s.chomp
+ @xml2 = File.read("data/bug_covert.xml")
+ @expected2 = File.read("data/bug_covert.expected").chomp
- @xml3 = File.readlines("data/bug_bool.xml").to_s
- @expected3 = File.readlines("data/bug_bool.expected").to_s.chomp
+ @xml3 = File.read("data/bug_bool.xml")
+ @expected3 = File.read("data/bug_bool.expected").chomp
- @xml4 = File.readlines("data/value.xml").to_s
- @expected4 = File.readlines("data/value.expected").to_s.chomp
+ @xml4 = File.read("data/value.xml")
+ @expected4 = File.read("data/value.expected").chomp
- @cdata_xml = File.readlines("data/bug_cdata.xml").to_s.chomp
- @cdata_expected = File.readlines("data/bug_cdata.expected").to_s.chomp
+ @cdata_xml = File.read("data/bug_cdata.xml").chomp
+ @cdata_expected = File.read("data/bug_cdata.expected").chomp
- @fault_doc = File.readlines("data/fault.xml").to_s
+ @datetime_xml = File.read("data/datetime_iso8601.xml")
+ @datetime_expected = XMLRPC::DateTime.new(2004, 11, 5, 1, 15, 23)
+
+ @fault_doc = File.read("data/fault.xml").to_s
end
# test parseMethodResponse --------------------------------------------------
@@ -40,6 +44,10 @@ module GenericParserTest
assert_equal(@cdata_expected, @p.parseMethodResponse(@cdata_xml).inspect)
end
+ def test_dateTime
+ assert_equal(@datetime_expected, @p.parseMethodResponse(@datetime_xml)[1])
+ end
+
# test parseMethodCall ------------------------------------------------------
def test_parseMethodCall