class RFlow::Components::HTTP::Server::Connection

@!visibility private

Attributes

client_ip[R]
client_port[R]
server[RW]
server_ip[R]
server_port[R]

Public Instance Methods

client_details() click to toggle source

@!visibility private

# File lib/rflow/components/http/server.rb, line 116
def client_details
  if @real_client_ip
    "#{client_ip}:#{client_port} (proxied from #{@real_client_ip}:#{@real_client_port})"
  else
    "#{client_ip}:#{client_port}"
  end
end
post_init() click to toggle source

@!visibility private

Calls superclass method
# File lib/rflow/components/http/server.rb, line 108
def post_init
  @client_port, @client_ip = Socket.unpack_sockaddr_in(get_peername) rescue ["?", "?.?.?.?"]
  @server_port, @server_ip = Socket.unpack_sockaddr_in(get_sockname) rescue ["?", "?.?.?.?"]
  super
  no_environment_strings
end
process_http_request() click to toggle source

@!visibility private

# File lib/rflow/components/http/server.rb, line 140
def process_http_request
  RFlow.logger.debug { "#{server.name}: Received HTTP request from #{client_details} to #{server_details} for #{@http_request_uri}" }

  server.request_port.send_message(RFlow::Message.new('RFlow::Message::Data::HTTP::Request').tap do |m|
    m.data.client_ip    = client_ip
    m.data.client_port  = client_port
    m.data.server_ip    = server_ip
    m.data.server_port  = server_port

    m.data.method       = @http_request_method
    m.data.uri          = @http_request_uri
    m.data.query_string = @http_query_string
    m.data.protocol     = @http_protocol
    m.data.content      = @http_post_content
    m.data.headers      = {}

    @http_headers.split(/\0/).each do |header|
      name, val = header.split(/:\s*/, 2)
      m.data.headers[name] = val
      if server.proxy_real_client_ip_header && (name == server.proxy_real_client_ip_header)
        @real_client_ip ||= val
      elsif server.proxy_real_client_port_header && (name == server.proxy_real_client_port_header)
        @real_client_port ||= val
      elsif server.proxy_real_server_ip_header && (name == server.proxy_real_server_ip_header)
        @real_server_ip ||= val
      elsif server.proxy_real_server_port_header && (name == server.proxy_real_server_port_header)
        @real_server_port ||= val
      end
    end

    m.provenance << RFlow::Message::ProcessingEvent.new(server.uuid, Time.now.utc).tap do |e|
      e.context = signature.to_s
      e.completed_at = Time.now.utc
    end
  end)
rescue Exception => e
  RFlow.logger.error "#{server.name}: Error processing HTTP request from #{client_details} to #{server_details} for #{@http_request_uri}: #{e.class.name}: #{e.message}, because: #{e.backtrace.inspect}"
end
receive_data(data) click to toggle source

@!visibility private

Calls superclass method
# File lib/rflow/components/http/server.rb, line 134
def receive_data(data)
  RFlow.logger.debug { "#{server.name}: Received #{data.bytesize} bytes of data from #{client_details} to #{server_details}" }
  super
end
send_http_response(response_message = nil) click to toggle source

@!visibility private

# File lib/rflow/components/http/server.rb, line 180
def send_http_response(response_message = nil)
  resp = EventMachine::DelegatedHttpResponse.new(self).tap do |r|
    # Default values
    r.status                  = 200
    r.content                 = ""
    r.headers["Content-Type"] = "text/html"
    r.headers["Server"]       = "Apache"

    if response_message
      r.status  = response_message.data.status_code
      r.content = response_message.data.content
      response_message.data.headers.each do |header, value|
        r.headers[header] = value
      end
    end
  end

  RFlow.logger.debug { "#{server.name}: Sending an HTTP response #{resp.status} to #{client_details}" }

  resp.send_response
  close_connection_after_writing
end
server_details() click to toggle source

@!visibility private

# File lib/rflow/components/http/server.rb, line 125
def server_details
  if @real_server_ip
    "#{server_ip}:#{server_port} (proxied as #{@real_server_ip}:#{@real_server_port})"
  else
    "#{server_ip}:#{server_port}"
  end
end
unbind(reason = nil) click to toggle source

Called when a connection is torn down for whatever reason. Remove this connection from the server's list @!visibility private

Calls superclass method
# File lib/rflow/components/http/server.rb, line 206
def unbind(reason = nil)
  RFlow.logger.debug { "#{server.name}: Disconnected from HTTP client #{client_details}#{reason.nil? ? '' : " due to '#{reason}'"}" }
  server.closed_connections.write(signature.to_s, ClosedConnection.new(client_details))
  server.connections.delete(signature.to_s)
  super()
end