lib/rflow/components/http/server.rb in rflow-components-http-0.0.6 vs lib/rflow/components/http/server.rb in rflow-components-http-0.0.7

- old
+ new

@@ -8,13 +8,13 @@ module HTTP class Server < RFlow::Component input_port :response_port output_port :request_port - + attr_accessor :port, :listen, :server_signature, :connections - + def configure!(config) @listen = config['listen'] ? config['listen'] : '127.0.0.1' @port = config['port'] ? config['port'].to_i : 8000 @connections = Hash.new end @@ -41,11 +41,11 @@ RFlow.logger.debug { "#{self.class.name}: Found connection for #{connection_signature_string}" } connections[connection_signature_string].send_http_response message end end end - + class Connection < EventMachine::Connection include EventMachine::HttpServer attr_accessor :server attr_reader :client_ip, :client_port, :server_ip, :server_port @@ -56,20 +56,20 @@ RFlow.logger.debug { "#{self.class.name}: Connection from #{@client_ip}:#{@client_port} to #{@server_ip}:#{@server_port}" } super no_environment_strings end - + def receive_data(data) RFlow.logger.debug { "#{self.class.name}: Received #{data.bytesize} bytes of data from #{client_ip}:#{client_port} to #{@server_ip}:#{@server_port}" } super end - - + + def process_http_request RFlow.logger.debug { "#{self.class.name}: Received HTTP request from #{client_ip}:#{client_port} to #{@server_ip}:#{@server_port} for #{@http_request_uri}" } - + processing_event = RFlow::Message::ProcessingEvent.new(server.instance_uuid, Time.now.utc) request_message = RFlow::Message.new('RFlow::Message::Data::HTTP::Request') request_message.data.client_ip = @client_ip @@ -81,52 +81,53 @@ request_message.data.uri = @http_request_uri request_message.data.query_string = @http_query_string request_message.data.protocol = @http_protocol request_message.data.content = @http_post_content request_message.data.headers = {} - + @http_headers.split(/\0/).each do |header| name, val = header.split(/:\s*/, 2) request_message.data.headers[name] = val end - + processing_event.context = signature.to_s processing_event.completed_at = Time.now.utc request_message.provenance << processing_event server.request_port.send_message request_message end - + def send_http_response(response_message=nil) resp = EventMachine::DelegatedHttpResponse.new(self) # Default values resp.status = 200 resp.content = "" resp.headers["Content-Type"] = "text/html" resp.headers["Server"] = "Apache" - + if response_message resp.status = response_message.data.status_code resp.content = response_message.data.content response_message.data.headers.each do |header, value| resp.headers[header] = value end end RFlow.logger.debug { "#{self.class.name}: Sending a HTTP response #{resp.status} to #{client_ip}:#{client_port}" } - + resp.send_response close_connection_after_writing end - + # Called when a connection is torn down for whatever reason. # Remove this connection from the server's list def unbind(reason=nil) RFlow.logger.debug { "#{self.class.name}: Disconnected from HTTP client #{client_ip}:#{client_port}#{reason.nil? ? '' : " due to '#{reason}'"}" } server.connections.delete(self.signature.to_s) + super() end end end end