Class: ICAPrb::Server::FilterService
- Inherits:
-
Services::ServiceBase
- Object
- Services::ServiceBase
- ICAPrb::Server::FilterService
- Defined in:
- lib/icaprb/filter/service.rb
Overview
The filter service, reference in your startup script
Instance Method Summary collapse
-
#initialize(path, timeout = nil) ⇒ FilterService
constructor
- Load configuration for filter service
path -
Path to the configuration file.
- Load configuration for filter service
-
#process_request(icap_server, ip, socket, data) ⇒ Object
- Process a new filter request
icap_server: ICAP server dataip - IP
socket - Socket
data -
Data for the current request.
- Socket
- IP
- Process a new filter request
Constructor Details
#initialize(path, timeout = nil) ⇒ FilterService
Load configuration for filter service
path-
Path to the configuration file
12 13 14 15 16 |
# File 'lib/icaprb/filter/service.rb', line 12 def initialize(path, timeout=nil) super('filter',[:request_mod, :response_mod],nil,60,nil,nil,nil,1000) @timeout = timeout @request_list, @response_list = ::ICAPrb::Filter.load_filters(path) end |
Instance Method Details
#process_request(icap_server, ip, socket, data) ⇒ Object
Process a new filter request icap_server: ICAP server data
ip-
IP
socket-
Socket
data-
Data for the current request
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 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 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
# File 'lib/icaprb/filter/service.rb', line 22 def process_request(icap_server,ip,socket,data) logger = icap_server.logger ICAPrb::Filter.set_logger(logger) ICAPrb::Filters.set_logger(logger) logger.debug '===========================================' logger.debug 'Start processing data via filter service...' logger.debug 'Request url: ' + data[:http_request_header]["Host"].to_s #logger.debug data # Go through all filters for resp or req begin response = ::ICAPrb::Server::Response.new is_modified = false if data[:icap_data][:request_line][:icap_method] == :request_mod logger.debug('Event is REQUEST') @request_list.each do |entry| logger.debug('Executing filter: ' + entry[:name].to_s) filter_return_value = entry[:object].plugin(data) if [true, false].include? filter_return_value is_modified = (filter_return_value || is_modified) logger.debug("Filter return value: " + filter_return_value.to_s) else logger.error("Filter " + entry[:name] + ' has illegal return value') end end elsif data[:icap_data][:request_line][:icap_method] == :response_mod logger.debug('Event is RESPONSE') @response_list.each do |entry| logger.debug('Executing plugin: ' + entry[:name].to_s) plugin_return_value = entry[:object].plugin(data) if [true, false].include? plugin_return_value is_modified = (plugin_return_value || is_modified) logger.debug("Plugin return value: " + plugin_return_value.to_s) else logger.error("Plugin " + entry[:name] + ' has illegal return value') end end end if is_modified logger.debug('Data was modified, sending everything') else logger.debug('Data is unmodified, sending status code 204') end # Nothing changed unless is_modified # Send 204 (unmodified) flag, no content required response.icap_status_code = 204 response.write_headers_to_socket socket return end # Something changed if data[:icap_data][:request_line][:icap_method] == :response_mod http_header = data[:http_response_header] if data[:http_response_body] http_body = ICAPrb::Server::ResponseBody.new(data[:http_response_body]) http_header['Content-Length'] = http_body.length end else http_header = data[:http_request_header] if data[:http_request_body] http_body = ICAPrb::Server::RequestBody.new(data[:http_request_body]) http_header['Content-Length'] = http_body.length end end response.components << http_header response.components << http_body if http_body response.icap_status_code = 200 response.write_headers_to_socket socket socket.write(http_body.to_chunk) ::ICAPrb::Server::Response.send_last_chunk(socket,false) rescue StandardError => error logger.warn 'Error in filter framework' logger.warn error. logger.warn error.backtrace logger.warn error.backtrace_locations # Don't anger the consumer response = ::ICAPrb::Server::Response.new response.icap_status_code = 204 response.write_headers_to_socket socket end logger.debug '===========================================' end |