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