mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
webrick: add the ability to override res, req creation
So that a customized HTTPServer subclass can use it's own Request/Response classes. To apply the override, make a subclass of WEBrick::HTTPServer and override the `create_request_and_response(with_webrick_config)` method. The method should return an Array of [request, response]. To check whether the Server supports this method (i.e. when using older versions of WEBrick when needing this functionality), you can ask the server if it responds to the method server.respond_to?(:create_request_and_response) This is backportable. [ruby-core:69604] [Feature #11266] From: Julik Tarkhanov <me@julik.nl> git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66452 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
92e726628e
commit
4038d0137f
2 changed files with 48 additions and 2 deletions
|
@ -68,8 +68,8 @@ module WEBrick
|
||||||
|
|
||||||
def run(sock)
|
def run(sock)
|
||||||
while true
|
while true
|
||||||
res = HTTPResponse.new(@config)
|
req = create_request(@config)
|
||||||
req = HTTPRequest.new(@config)
|
res = create_response(@config)
|
||||||
server = self
|
server = self
|
||||||
begin
|
begin
|
||||||
timeout = @config[:RequestTimeout]
|
timeout = @config[:RequestTimeout]
|
||||||
|
@ -224,6 +224,20 @@ module WEBrick
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
# Creates the HTTPRequest used when handling the HTTP
|
||||||
|
# request. Can be overridden by subclasses.
|
||||||
|
def create_request(with_webrick_config)
|
||||||
|
HTTPRequest.new(with_webrick_config)
|
||||||
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
# Creates the HTTPResponse used when handling the HTTP
|
||||||
|
# request. Can be overridden by subclasses.
|
||||||
|
def create_response(with_webrick_config)
|
||||||
|
HTTPResponse.new(with_webrick_config)
|
||||||
|
end
|
||||||
|
|
||||||
##
|
##
|
||||||
# Mount table for the path a servlet is mounted on in the directory space
|
# Mount table for the path a servlet is mounted on in the directory space
|
||||||
# of the server. Users of WEBrick can only access this indirectly via
|
# of the server. Users of WEBrick can only access this indirectly via
|
||||||
|
|
|
@ -276,6 +276,38 @@ class TestWEBrickHTTPServer < Test::Unit::TestCase
|
||||||
assert_equal(stopped, 1)
|
assert_equal(stopped, 1)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
class CustomRequest < ::WEBrick::HTTPRequest; end
|
||||||
|
class CustomResponse < ::WEBrick::HTTPResponse; end
|
||||||
|
class CustomServer < ::WEBrick::HTTPServer
|
||||||
|
def create_request(config)
|
||||||
|
CustomRequest.new(config)
|
||||||
|
end
|
||||||
|
|
||||||
|
def create_response(config)
|
||||||
|
CustomResponse.new(config)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_custom_server_request_and_response
|
||||||
|
config = { :ServerName => "localhost" }
|
||||||
|
TestWEBrick.start_server(CustomServer, config){|server, addr, port, log|
|
||||||
|
server.mount_proc("/", lambda {|req, res|
|
||||||
|
assert_kind_of(CustomRequest, req)
|
||||||
|
assert_kind_of(CustomResponse, res)
|
||||||
|
res.body = "via custom response"
|
||||||
|
})
|
||||||
|
Thread.pass while server.status != :Running
|
||||||
|
|
||||||
|
Net::HTTP.start(addr, port) do |http|
|
||||||
|
req = Net::HTTP::Get.new("/")
|
||||||
|
http.request(req){|res|
|
||||||
|
assert_equal("via custom response", res.body)
|
||||||
|
}
|
||||||
|
server.shutdown
|
||||||
|
end
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
# This class is needed by test_response_io_with_chunked_set method
|
# This class is needed by test_response_io_with_chunked_set method
|
||||||
class EventManagerForChunkedResponseTest
|
class EventManagerForChunkedResponseTest
|
||||||
def initialize
|
def initialize
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue