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