class SpiderGazelle::Spider::Binding
Attributes
app[R]
app_port[R]
tcp[R]
tls[R]
Public Class Methods
new(iterator, options)
click to toggle source
# File lib/spider-gazelle/spider/binding.rb, line 11 def initialize(iterator, options) @options = options @logger = Logger.instance @signaller = Signaller.instance @thread = @signaller.thread @iterator = iterator @port = @options[:port] @app, @app_port, @tls = AppStore.lookup(options[:rackup]) @http1_cache = [] @http2_cache = [] @return_http1 = proc { |parser| @http1_cache << parser } @return_http2 = proc { |parser| @http2_cache << parser } @parser_count = 0 end
Public Instance Methods
bind()
click to toggle source
Bind the application to the selected port
# File lib/spider-gazelle/spider/binding.rb, line 30 def bind # Bind the socket @tcp = @thread.tcp @tcp.enable_simultaneous_accepts if @tls @tcp.bind @options[:host], @port do |client| prepare_client_tls client end else @tcp.bind @options[:host], @port do |client| prepare_client client end end @tcp.listen 10000 @logger.info "Listening on tcp://#{@options[:host]}:#{@port}" @tcp.catch do |error| begin @logger.print_error(error) rescue ensure @signaller.general_failure end end @tcp end
unbind()
click to toggle source
Close the bindings
# File lib/spider-gazelle/spider/binding.rb, line 60 def unbind @tcp.close unless @tcp.nil? @tcp end
Protected Instance Methods
new_http1_parser()
click to toggle source
Select a protocol to handle the request
# File lib/spider-gazelle/spider/binding.rb, line 103 def new_http1_parser @h1_parser_obj ||= Http1::Callbacks.new @parser_count += 1 Http1.new(@return_http1, @h1_parser_obj, @thread, @logger, @iterator) end
new_http2_parser()
click to toggle source
# File lib/spider-gazelle/spider/binding.rb, line 110 def new_http2_parser raise NotImplementedError.new 'TODO:: Create HTTP2 parser class' @parser_count += 1 Http2.new(@return_http2, @thread, @logger, @iterator) end
prepare_client(client)
click to toggle source
Setup the client connection
# File lib/spider-gazelle/spider/binding.rb, line 72 def prepare_client(client) set_protocol(client, :http1) client.start_read client.enable_nodelay end
prepare_client_tls(client)
click to toggle source
# File lib/spider-gazelle/spider/binding.rb, line 78 def prepare_client_tls(client) client.on_handshake { |client, version| set_protocol(client, version) } client.start_tls(@tls) client.start_read client.enable_nodelay end
set_protocol(client, version)
click to toggle source
# File lib/spider-gazelle/spider/binding.rb, line 86 def set_protocol(client, version) parser = if version == :h2 @http2_cache.pop || new_http2_parser else @http1_cache.pop || new_http1_parser end parser.load(client, @app_port, @app, @tls) client.progress do |data| parser.parse(data) end end