[前][次][番号順一覧][スレッド一覧]

ruby-changes:4549

From: ko1@a...
Date: Tue, 15 Apr 2008 23:10:33 +0900 (JST)
Subject: [ruby-changes:4549] kou - Ruby:r16042 (trunk): * lib/xmlrpc/client.rb: fix cookie handling.

kou	2008-04-15 23:10:18 +0900 (Tue, 15 Apr 2008)

  New Revision: 16042

  Added files:
    trunk/test/xmlrpc/test_cookie.rb
  Modified files:
    trunk/ChangeLog
    trunk/lib/xmlrpc/client.rb

  Log:
    * lib/xmlrpc/client.rb: fix cookie handling. [ruby-dev:34403]
    * test/xmlrpc/test_cookie.rb: add a test for the above fix.


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/lib/xmlrpc/client.rb?r1=16042&r2=16041&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=16042&r2=16041&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/test/xmlrpc/test_cookie.rb?revision=16042&view=markup

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 16041)
+++ ChangeLog	(revision 16042)
@@ -1,3 +1,9 @@
+Tue Apr 15 23:08:46 2008  Kouhei Sutou  <kou@c...>
+
+	* lib/xmlrpc/client.rb: fix cookie handling. [ruby-dev:34403]
+
+	* test/xmlrpc/test_cookie.rb: add a test for the above fix.
+
 Tue Apr 15 19:20:14 2008  Yukihiro Matsumoto  <matz@r...>
 
 	* io.c: #undef rb_argv moved before #define.
Index: lib/xmlrpc/client.rb
===================================================================
--- lib/xmlrpc/client.rb	(revision 16041)
+++ lib/xmlrpc/client.rb	(revision 16042)
@@ -565,8 +565,13 @@
         raise "Wrong size. Was #{data.size}, should be #{expected}"
       end
 
-      c = resp["Set-Cookie"]
-      @cookie = c if c
+      set_cookies = resp.get_fields("Set-Cookie")
+      if set_cookies and !set_cookies.empty?
+        @cookie = set_cookies.collect do |set_cookie|
+          cookie = WEBrick::Cookie.parse_set_cookie(set_cookie)
+          WEBrick::Cookie.new(cookie.name, cookie.value).to_s
+        end.join("; ")
+      end
 
       return data
     end
Index: test/xmlrpc/test_cookie.rb
===================================================================
--- test/xmlrpc/test_cookie.rb	(revision 0)
+++ test/xmlrpc/test_cookie.rb	(revision 16042)
@@ -0,0 +1,96 @@
+require 'test/unit'
+require 'time'
+require 'webrick'
+require File.join(File.dirname(__FILE__), 'webrick_testing')
+require "xmlrpc/server"
+require 'xmlrpc/client'
+
+class TestCookie < Test::Unit::TestCase
+  include WEBrick_Testing
+
+  def create_servlet
+    s = XMLRPC::WEBrickServlet.new
+
+    def s.logged_in_users
+      @logged_in_users ||= {}
+    end
+    def s.request
+      @request
+    end
+    def s.response
+      @response
+    end
+    def s.service(request, response)
+      @request = request
+      @response = response
+      super
+    ensure
+      @request = nil
+      @response = nil
+    end
+
+    key = Time.now.to_i.to_s
+    valid_user = "valid-user"
+    s.add_handler("test.login") do |user, password|
+      ok = (user == valid_user and password == "secret")
+      if ok
+        s.logged_in_users[key] = user
+        expires = (Time.now + 60 * 60).httpdate
+        cookies = s.response.cookies
+        cookies << "key=\"#{key}\"; path=\"/RPC2\"; expires=#{expires}"
+        cookies << "user=\"#{user}\"; path=\"/RPC2\""
+      end
+      ok
+    end
+
+    s.add_handler("test.require_authenticate_echo") do |string|
+      cookies = {}
+      s.request.cookies.each do |cookie|
+        cookies[cookie.name] = cookie.value
+      end
+      if cookies == {"key" => key, "user" => valid_user}
+        string
+      else
+        raise XMLRPC::FaultException.new(29, "Authentication required")
+      end
+    end
+
+    s.set_default_handler do |name, *args|
+      raise XMLRPC::FaultException.new(-99, "Method #{name} missing" +
+            " or wrong number of parameters!")
+    end
+
+    s.add_introspection
+
+    s
+  end
+
+  def setup_http_server(port)
+    option = {:Port => port}
+
+    start_server(option) {|w| w.mount('/RPC2', create_servlet) }
+
+    @s = XMLRPC::Client.new3(:port => port)
+  end
+
+  PORT = 8070
+  def test_cookie
+    begin
+      setup_http_server(PORT)
+      do_test
+    ensure
+      stop_server
+    end
+  end
+
+  def do_test
+    assert(!@s.call("test.login", "invalid-user", "invalid-password"))
+    exception = assert_raise(XMLRPC::FaultException) do
+      @s.call("test.require_authenticate_echo", "Hello")
+    end
+    assert_equal(29, exception.faultCode)
+
+    assert(@s.call("test.login", "valid-user", "secret"))
+    assert_equal("Hello", @s.call("test.require_authenticate_echo", "Hello"))
+  end
+end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]