class EmmyHttp::Server::Request
Attributes
connection[R]
attribute :upgrade_data
parser[R]
remote_address[R]
request[R]
Public Class Methods
new()
click to toggle source
# File lib/emmy_http/server/request.rb, line 24 def initialize @parser = Server::Parser.new @body = StringIO.new(Server::INITIAL_BODY.dup) request = self on :data do |chunk| @body << chunk end parser.on :head do |headers| request.http_version = parser.http_version request.http_method = parser.http_method request.url = parser.request_url request.headers = parser.headers end parser.on :body do |chunk| request.data!(request.decoder ? (request.decoder.decompress(chunk) || '') : chunk) end parser.on :complete do conn = request.connection dettach complete!(request, conn) end end
Public Instance Methods
attach(conn)
click to toggle source
# File lib/emmy_http/server/request.rb, line 128 def attach(conn) @connection = conn @remote_address = socket_address listen conn, :data, :post_data listen conn, :close, :close end
close(reason=nil)
click to toggle source
# File lib/emmy_http/server/request.rb, line 123 def close(reason=nil) terminate!(reason, self, connection) if reason dettach end
dettach()
click to toggle source
# File lib/emmy_http/server/request.rb, line 135 def dettach if connection stop_listen connection, :data stop_listen connection, :close @connection = nil end end
keep_alive?()
click to toggle source
# File lib/emmy_http/server/request.rb, line 61 def keep_alive? #return false if terminate_connection? case http_version when [1,0] then (headers['Connection'].downcase == 'keep-alive') rescue false when [1,1] then (headers['Connection'].downcase != 'close') rescue true when [2,0] then false else false end end
post_data(chunk)
click to toggle source
# File lib/emmy_http/server/request.rb, line 51 def post_data(chunk) #p chunk parser << chunk #if parser.upgrade? #end rescue EmmyHttp::ParserError => e close(e.message) end
prepare_env()
click to toggle source
# File lib/emmy_http/server/request.rb, line 75 def prepare_env @env = {} # Server info @env['rack.version'] = Server::RACK_VERSION_NUM @env['rack.errors'] = STDERR @env['rack.multithread'] = false @env['rack.multiprocess'] = false @env['rack.run_once'] = false #env['rack.logger'] = logger # HTTP headers headers.each do |n, v| @env['HTTP_' + n.gsub('-','_').upcase] = v end %w(CONTENT_TYPE CONTENT_LENGTH).each do |n| @env[n] = @env.delete("HTTP_#{n}") if @env["HTTP_#{n}"] end @env['SERVER_NAME'] = 'localhost' @env['SERVER_SOFTWARE'] = Server::SERVER_NAME if @env['HTTP_HOST'] # FIXME name, port = @env['HTTP_HOST'].split(':') @env['SERVER_NAME'] = name if name @env['SERVER_PORT'] = port if port end uri = URI(parser.request_url) @env['HTTP_VERSION'] = "HTTP/#{http_version.join('.')}" @env['REMOTE_ADDR'] = remote_address @env['REQUEST_METHOD'] = http_method @env['REQUEST_URI'] = url.to_s @env['QUERY_STRING'] = url.query || '' # string required @env['SCRIPT_NAME'] = '' @env['REQUEST_PATH'] = url.path @env['PATH_INFO'] = url.path @env['FRAGMENT'] = url.fragment # HTTP body @env['rack.input'] = body end
Protected Instance Methods
socket_address()
click to toggle source
# File lib/emmy_http/server/request.rb, line 145 def socket_address Socket.unpack_sockaddr_in(connection.get_peername)[1] rescue Exception nil end