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)
 | 
			
		||||
      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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue