In Files

  • xmlrpc/httpserver.rb

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

 
               # File 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 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 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 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 xmlrpc/httpserver.rb, line 136
def serve(io) # :doc:
  # perform IP authentification
  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
            

Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.

If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.

If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.

If you want to help improve the Ruby documentation, please visit Documenting-ruby.org.

blog comments powered by Disqus