1require 'test/unit' 2require 'time' 3require 'webrick' 4require_relative 'webrick_testing' 5require "xmlrpc/server" 6require 'xmlrpc/client' 7 8class TestCookie < Test::Unit::TestCase 9 include WEBrick_Testing 10 11 def create_servlet 12 s = XMLRPC::WEBrickServlet.new 13 14 def s.logged_in_users 15 @logged_in_users ||= {} 16 end 17 def s.request 18 @request 19 end 20 def s.response 21 @response 22 end 23 def s.service(request, response) 24 @request = request 25 @response = response 26 super 27 ensure 28 @request = nil 29 @response = nil 30 end 31 32 key = Time.now.to_i.to_s 33 valid_user = "valid-user" 34 s.add_handler("test.login") do |user, password| 35 ok = (user == valid_user and password == "secret") 36 if ok 37 s.logged_in_users[key] = user 38 expires = (Time.now + 60 * 60).httpdate 39 cookies = s.response.cookies 40 cookies << "key=\"#{key}\"; path=\"/RPC2\"; expires=#{expires}" 41 cookies << "user=\"#{user}\"; path=\"/RPC2\"" 42 end 43 ok 44 end 45 46 s.add_handler("test.require_authenticate_echo") do |string| 47 cookies = {} 48 s.request.cookies.each do |cookie| 49 cookies[cookie.name] = cookie.value 50 end 51 if cookies == {"key" => key, "user" => valid_user} 52 string 53 else 54 raise XMLRPC::FaultException.new(29, "Authentication required") 55 end 56 end 57 58 s.set_default_handler do |name, *args| 59 raise XMLRPC::FaultException.new(-99, "Method #{name} missing" + 60 " or wrong number of parameters!") 61 end 62 63 s.add_introspection 64 65 s 66 end 67 68 def setup_http_server(port) 69 option = {:Port => port} 70 71 start_server(option) {|w| w.mount('/RPC2', create_servlet) } 72 73 @s = XMLRPC::Client.new3(:port => port) 74 end 75 76 PORT = 8070 77 def test_cookie 78 begin 79 setup_http_server(PORT) 80 do_test 81 ensure 82 stop_server 83 end 84 end 85 86 def do_test 87 assert(!@s.call("test.login", "invalid-user", "invalid-password")) 88 exception = assert_raise(XMLRPC::FaultException) do 89 @s.call("test.require_authenticate_echo", "Hello") 90 end 91 assert_equal(29, exception.faultCode) 92 93 assert(@s.call("test.login", "valid-user", "secret")) 94 assert_equal("Hello", @s.call("test.require_authenticate_echo", "Hello")) 95 end 96end 97