Class: RFlow::Components::HTTP::Server::Connection
- Inherits:
-
EventMachine::Connection
- Object
- EventMachine::Connection
- RFlow::Components::HTTP::Server::Connection
- Includes:
- EventMachine::HttpServer
- Defined in:
- lib/rflow/components/http/server.rb
Instance Attribute Summary collapse
-
#client_ip ⇒ Object
readonly
Returns the value of attribute client_ip.
-
#client_port ⇒ Object
readonly
Returns the value of attribute client_port.
-
#server ⇒ Object
Returns the value of attribute server.
-
#server_ip ⇒ Object
readonly
Returns the value of attribute server_ip.
-
#server_port ⇒ Object
readonly
Returns the value of attribute server_port.
Instance Method Summary collapse
- #post_init ⇒ Object
- #process_http_request ⇒ Object
- #receive_data(data) ⇒ Object
- #send_http_response(response_message = nil) ⇒ Object
-
#unbind(reason = nil) ⇒ Object
Called when a connection is torn down for whatever reason.
Instance Attribute Details
#client_ip ⇒ Object (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_port ⇒ Object (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 |
#server ⇒ Object
Returns the value of attribute server.
47 48 49 |
# File 'lib/rflow/components/http/server.rb', line 47 def server @server end |
#server_ip ⇒ Object (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_port ⇒ Object (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_init ⇒ Object
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_request ⇒ Object
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.(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( = 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 r.status = .data.status_code r.content = .data.content .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 |