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