class Rakie::HttpServer
Attributes
channel[R]
host[R]
opt[R]
port[R]
Public Class Methods
new(host: '127.0.0.1', port: 10086, delegate: nil)
click to toggle source
# File lib/rakie/http_server.rb, line 18 def initialize(host: '127.0.0.1', port: 10086, delegate: nil) @host = host @port = port @channel = TCPServerChannel.new(host, port, self) # @type [Hash{Channel=>Session}] @sessions = {} @delegate = delegate @opt = {} end
Public Instance Methods
on_accept(channel)
click to toggle source
# File lib/rakie/http_server.rb, line 30 def on_accept(channel) channel.delegate = self @sessions[channel] = Session.new Log.debug("Rakie::HTTPServer accept client: #{channel}") end
on_close(channel)
click to toggle source
# File lib/rakie/http_server.rb, line 130 def on_close(channel) @sessions.delete(channel) end
on_recv(channel, data)
click to toggle source
# File lib/rakie/http_server.rb, line 36 def on_recv(channel, data) # Log.debug("Rakie::HTTPServer recv: #{data}") session = @sessions[channel] if session == nil return 0 end # @type [HttpRequest] request request = session.request if request.parse_status == ParseStatus::COMPLETE request = HttpRequest.new session.request = request end len = request.parse(data) Log.debug("Rakie::HttpServer receive request: #{request.to_s}") if request.parse_status == ParseStatus::COMPLETE response = HttpResponse.new if upgrade = request.headers["upgrade"] if websocket_delegate = @opt[:websocket_delegate] websocket_delegate.upgrade(request, response) Log.debug("Rakie::HttpServer upgrade protocol") end elsif @delegate != nil @delegate.handle(request, response) else response.headers["content-type"] = HttpMIME::HTML response.content = "<html><body><h1>Rakie!</h1></body></html>" end if header_connection = request.headers["connection"] response.headers["connection"] = header_connection end if response.content.length > 0 response.headers["content-length"] = response.content.length end response.headers["server"] = Rakie.full_version_s session.responses << response response_data = response.to_s Log.debug("Rakie::HttpServer response: #{response_data}") channel.write(response_data) # Response data elsif request.parse_status == ParseStatus::ERROR channel.close @sessions.delete(channel) Log.debug("Rakie::HttpServer: Illegal request") return len end return len end
on_send(channel)
click to toggle source
# File lib/rakie/http_server.rb, line 100 def on_send(channel) session = @sessions[channel] # @type [HttpRequest] last_response = session.responses.shift if last_response if connect_status = last_response.headers["connection"] if connect_status.downcase == "close" Log.debug("Rakie::HttpServer: send finish and close channel") channel.close @sessions.delete(channel) end end if upgrade = last_response.headers["upgrade"] websocket_delegate = @opt[:websocket_delegate] if websocket_delegate websocket_delegate.on_accept(channel) @sessions.delete(channel) return end Log.debug("Rakie::HttpServer: no websocket delegate and close channel") channel.close @sessions.delete(channel) end end end