Class: RFlow::Components::HTTP::Server::Connection

Inherits:
EventMachine::Connection
  • Object
show all
Includes:
EventMachine::HttpServer
Defined in:
lib/rflow/components/http/server.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#client_ipObject (readonly)

Returns the value of attribute client_ip.



48
49
50
# File 'lib/rflow/components/http/server.rb', line 48

def client_ip
  @client_ip
end

#client_portObject (readonly)

Returns the value of attribute client_port.



48
49
50
# File 'lib/rflow/components/http/server.rb', line 48

def client_port
  @client_port
end

#serverObject

Returns the value of attribute server.



47
48
49
# File 'lib/rflow/components/http/server.rb', line 47

def server
  @server
end

#server_ipObject (readonly)

Returns the value of attribute server_ip.



48
49
50
# File 'lib/rflow/components/http/server.rb', line 48

def server_ip
  @server_ip
end

#server_portObject (readonly)

Returns the value of attribute server_port.



48
49
50
# File 'lib/rflow/components/http/server.rb', line 48

def server_port
  @server_port
end

Instance Method Details

#post_initObject



50
51
52
53
54
55
# File 'lib/rflow/components/http/server.rb', line 50

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_requestObject



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/rflow/components/http/server.rb', line 62

def process_http_request
  RFlow.logger.debug { "#{server.name}: Received HTTP request from #{client_ip}:#{client_port} to #{@server_ip}:#{@server_port} 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
    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_ip}:#{client_port} to #{@server_ip}:#{@server_port} for #{@http_request_uri}: #{e.class.name}: #{e.message}, because: #{e.backtrace.inspect}"
end

#receive_data(data) ⇒ Object



57
58
59
60
# File 'lib/rflow/components/http/server.rb', line 57

def receive_data(data)
  RFlow.logger.debug { "#{server.name}: Received #{data.bytesize} bytes of data from #{client_ip}:#{client_port} to #{@server_ip}:#{@server_port}" }
  super
end

#send_http_response(response_message = nil) ⇒ Object



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/rflow/components/http/server.rb', line 92

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_ip}:#{client_port}" }

  resp.send_response
  close_connection_after_writing
end

#unbind(reason = nil) ⇒ Object

Called when a connection is torn down for whatever reason. Remove this connection from the server’s list



117
118
119
120
121
# File 'lib/rflow/components/http/server.rb', line 117

def unbind(reason = nil)
  RFlow.logger.debug { "#{server.name}: Disconnected from HTTP client #{client_ip}:#{client_port}#{reason.nil? ? '' : " due to '#{reason}'"}" }
  server.connections.delete(self.signature.to_s)
  super()
end