Class: SpiderGazelle::Gazelle

Inherits:
Object
  • Object
show all
Defined in:
lib/spider-gazelle/gazelle.rb

Constant Summary collapse

HTTP_META =
'HTTP_'.freeze
REQUEST_METHOD =

GET, POST, etc

'REQUEST_METHOD'.freeze

Instance Method Summary collapse

Constructor Details

#initialize(app, options) ⇒ Gazelle

Returns a new instance of Gazelle.



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/spider-gazelle/gazelle.rb', line 12

def initialize(app, options)
    @gazelle = Libuv::Loop.new
    @connections = Set.new      # Set of active connections on this thread
    @parser_cache = []      	# Stale parser objects cached for reuse
    @connection_queue = ::Libuv::Q::ResolvedPromise.new(@gazelle, true)

    @app = app
    @options = options

    # A single parser instance for processing requests for each gazelle
    @parser = ::HttpParser::Parser.new(self)

    # Single progress callback for each gazelle
    @on_progress = method(:on_progress)
end

Instance Method Details

#on_body(parser, data) ⇒ Object



95
96
97
# File 'lib/spider-gazelle/gazelle.rb', line 95

def on_body(parser, data)
    @connection.parsing.body << data
end

#on_header_field(parser, header) ⇒ Object



68
69
70
71
72
73
74
75
# File 'lib/spider-gazelle/gazelle.rb', line 68

def on_header_field(parser, header)
    req = @connection.parsing
    if req.header.frozen?
        req.header = header
    else
        req.header << header
    end
end

#on_header_value(parser, value) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/spider-gazelle/gazelle.rb', line 77

def on_header_value(parser, value)
    req = @connection.parsing
    if req.header.frozen?
        req.env[req.header] << value
    else
        header = req.header
        header.upcase!
        header.gsub!('-', '_')
        header.prepend(HTTP_META)
        header.freeze
        req.env[header] = value
    end
end

#on_headers_complete(parser) ⇒ Object



91
92
93
# File 'lib/spider-gazelle/gazelle.rb', line 91

def on_headers_complete(parser)
    @connection.parsing.env[REQUEST_METHOD] = @connection.state.http_method.to_s
end

#on_message_begin(parser) ⇒ Object

HTTP Parser callbacks:



60
61
62
# File 'lib/spider-gazelle/gazelle.rb', line 60

def on_message_begin(parser)
    @connection.start_parsing(Request.new(@app, @options))
end

#on_message_complete(parser) ⇒ Object



99
100
101
# File 'lib/spider-gazelle/gazelle.rb', line 99

def on_message_complete(parser)
    @connection.finished_parsing
end

#on_url(parser, url) ⇒ Object



64
65
66
# File 'lib/spider-gazelle/gazelle.rb', line 64

def on_url(parser, url)
    @connection.parsing.url << url
end

#runObject



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
# File 'lib/spider-gazelle/gazelle.rb', line 28

def run
    @gazelle.run do |logger|
        logger.progress do |level, errorid, error|
            begin
                p "Log called: #{level}: #{errorid}\n#{error.message}\n#{error.backtrace.join("\n")}\n"
            rescue Exception
                p 'error in gazelle logger'
            end
        end

        # A pipe used to forward connections to different threads
        @socket_server = @gazelle.pipe(true)
        @socket_server.connect(DELEGATE_PIPE) do
            @socket_server.progress do |data, socket|
                new_connection(socket)
            end
            @socket_server.start_read2
        end

        # A pipe used to signal various control commands (shutdown, etc)
        @signal_server = @gazelle.pipe
        @signal_server.connect(SIGNAL_PIPE) do
            @signal_server.progress do |data|
                process_signal(data)
            end
            @signal_server.start_read
        end
    end
end