Class: WEBrick::HTTPServlet::AbstractServlet
Relationships & Source Files | |
Extension / Inclusion / Inheritance Descendants | |
Subclasses:
|
|
Inherits: | Object |
Defined in: | lib/webrick/httpservlet/abstract.rb |
Overview
AbstractServlet
allows HTTP server modules to be reused across multiple servers and allows encapsulation of functionality.
By default a servlet will respond to GET, HEAD (through an alias to GET) and OPTIONS requests.
By default a new servlet is initialized for every request. A servlet instance can be reused by overriding .get_instance in the AbstractServlet
subclass.
A Simple Servlet
class Simple < WEBrick::HTTPServlet::AbstractServlet
def do_GET request, response
status, content_type, body = do_stuff_with request
response.status = status
response['Content-Type'] = content_type
response.body = body
end
def do_stuff_with request
return 200, 'text/plain', 'you got a page'
end
end
This servlet can be mounted on a server at a given path:
server.mount '/simple', Simple
Servlet Configuration
Servlets can be configured via initialize. The first argument is the HTTP server the servlet is being initialized for.
class Configurable < Simple
def initialize server, color, size
super server
@color = color
@size = size
end
def do_stuff_with request
content = "<p " \
%q{style="color: #{@color}; font-size: #{@size}"} \
">Hello, World!"
return 200, "text/html", content
end
end
This servlet must be provided two arguments at mount time:
server.mount '/configurable', Configurable, 'red', '2em'
Class Method Summary
-
.get_instance(server, *options)
Factory for servlet instances that will handle a request from
server
usingoptions
from the mount point. -
.new(server, *options) ⇒ AbstractServlet
constructor
Initializes a new servlet for
server
usingoptions
which are stored as-is in @options.
Instance Method Summary
-
#do_GET(req, res)
Raises a NotFound exception.
-
#do_HEAD(req, res)
Dispatches to do_GET.
-
#do_OPTIONS(req, res)
Returns the allowed HTTP request methods.
-
#service(req, res)
Dispatches to a
do_
method based onreq
if such a method is available. -
#redirect_to_directory_uri(req, res)
private
Redirects to a path ending in /.
Constructor Details
.new(server, *options) ⇒ AbstractServlet
Initializes a new servlet for server
using options
which are stored as-is in @options. @logger is also provided.
# File 'lib/webrick/httpservlet/abstract.rb', line 93
def initialize(server, * ) @server = @config = server @logger = @server[:Logger] @options = end
Class Method Details
.get_instance(server, *options)
Factory for servlet instances that will handle a request from server
using options
from the mount point. By default a new servlet instance is created for every call.
# File 'lib/webrick/httpservlet/abstract.rb', line 85
def self.get_instance(server, * ) self.new(server, * ) end
Instance Method Details
#do_GET(req, res)
Raises a NotFound exception
# File 'lib/webrick/httpservlet/abstract.rb', line 117
def do_GET(req, res) raise HTTPStatus::NotFound, "not found." end
#do_HEAD(req, res)
Dispatches to do_GET
# File 'lib/webrick/httpservlet/abstract.rb', line 124
def do_HEAD(req, res) do_GET(req, res) end
#do_OPTIONS(req, res)
Returns the allowed HTTP request methods
# File 'lib/webrick/httpservlet/abstract.rb', line 131
def do_OPTIONS(req, res) m = self.methods.grep(/\Ado_([A-Z]+)\z/) {$1} m.sort! res["allow"] = m.join(",") end
#redirect_to_directory_uri(req, res) (private)
Redirects to a path ending in /
# File 'lib/webrick/httpservlet/abstract.rb', line 142
def redirect_to_directory_uri(req, res) if req.path[-1] != ?/ location = WEBrick::HTTPUtils.escape_path(req.path + "/") if req.query_string && req.query_string.bytesize > 0 location << "?" << req.query_string end res.set_redirect(HTTPStatus::MovedPermanently, location) end end
#service(req, res)
Dispatches to a do_
method based on req
if such a method is available. (#do_GET for a GET request). Raises a MethodNotAllowed exception if the method is not implemented.
# File 'lib/webrick/httpservlet/abstract.rb', line 104
def service(req, res) method_name = "do_" + req.request_method.gsub(/-/, "_") if respond_to?(method_name) __send__(method_name, req, res) else raise HTTPStatus::MethodNotAllowed, "unsupported method `#{req.request_method}'." end end