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:
normal 2018-12-19 11:08:05 +00:00
Родитель 92e726628e
Коммит 4038d0137f
2 изменённых файлов: 48 добавлений и 2 удалений

Просмотреть файл

@ -68,8 +68,8 @@ module WEBrick
def run(sock)
while true
res = HTTPResponse.new(@config)
req = HTTPRequest.new(@config)
req = create_request(@config)
res = create_response(@config)
server = self
begin
timeout = @config[:RequestTimeout]
@ -224,6 +224,20 @@ module WEBrick
}
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
# 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)
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
class EventManagerForChunkedResponseTest
def initialize