class HttpServer

Implements a simple HTTP-server by using John W. Small's (jsmall@laser.net) ruby-generic-server: GServer.

Constants

CRLF
DEFAULT_HEADER

Default header for the server name

HTTP_PROTO
SERVER_NAME
StatusCodeMapping

Mapping of status codes and error messages

Public Class Methods

new(handle_obj, port = 8080, host = DEFAULT_HOST, maxConnections = 4, stdlog = $stdout, audit = true, debug = true) click to toggle source

handle_obj specifies the object, that receives calls from request_handler and ip_auth_handler

Calls superclass method GServer.new
# File lib/xmlrpc/httpserver.rb, line 16
def initialize(handle_obj, port = 8080, host = DEFAULT_HOST, maxConnections = 4,
               stdlog = $stdout, audit = true, debug = true)
  @handler = handle_obj
  super(port, host, maxConnections, stdlog, audit, debug)
end

Private Instance Methods

http_date( aTime ) click to toggle source

Returns a string which represents the time as rfc1123-date of HTTP-date

# File lib/xmlrpc/httpserver.rb, line 115
def http_date( aTime ) # :doc:
  aTime.gmtime.strftime( "%a, %d %b %Y %H:%M:%S GMT" )
end
http_header(header=nil) click to toggle source

Generates a Hash with the HTTP headers

# File lib/xmlrpc/httpserver.rb, line 104
def http_header(header=nil) # :doc:
  new_header = Table.new(DEFAULT_HEADER)
  new_header.update(header) unless header.nil?

  new_header["Connection"] = "close"
  new_header["Date"]       = http_date(Time.now)

  new_header
end
http_resp(status_code, status_message=nil, header=nil, body=nil) click to toggle source

Returns a string which includes the status code message as, http headers, and body for the response.

# File lib/xmlrpc/httpserver.rb, line 121
def http_resp(status_code, status_message=nil, header=nil, body=nil) # :doc:
  status_message ||= StatusCodeMapping[status_code]

  str = ""
  str << "#{HTTP_PROTO} #{status_code} #{status_message}" << CRLF
  http_header(header).writeTo(str)
  str << CRLF
  str << body unless body.nil?
  str
end
serve(io) click to toggle source

Handles the HTTP request and writes the response back to the client, io.

If an Exception is raised while handling the request, the client will receive a 500 “Internal Server Error” message.

# File lib/xmlrpc/httpserver.rb, line 136
def serve(io) # :doc:
  # perform IP authentication
  unless @handler.ip_auth_handler(io)
    io << http_resp(403, "Forbidden")
    return
  end

  # parse first line
  if io.gets =~ /^(\S+)\s+(\S+)\s+(\S+)/
    request = Request.new(io, $1, $2, $3)
  else
    io << http_resp(400, "Bad Request")
    return
  end

  # parse HTTP headers
  while (line=io.gets) !~ /^(\n|\r)/
    if line =~ /^([\w-]+):\s*(.*)$/
      request.header[$1] = $2.strip
    end
  end

  io.binmode
  response = Response.new

  # execute request handler
  @handler.request_handler(request, response)

  # write response back to the client
  io << http_resp(response.status, response.status_message,
                  response.header, response.body)

rescue Exception
  io << http_resp(500, "Internal Server Error")
end