Class: SpiderGazelle::Gazelle
- Inherits:
-
Object
- Object
- SpiderGazelle::Gazelle
- 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
-
#initialize(app, options) ⇒ Gazelle
constructor
A new instance of Gazelle.
- #on_body(parser, data) ⇒ Object
- #on_header_field(parser, header) ⇒ Object
- #on_header_value(parser, value) ⇒ Object
- #on_headers_complete(parser) ⇒ Object
-
#on_message_begin(parser) ⇒ Object
HTTP Parser callbacks:.
- #on_message_complete(parser) ⇒ Object
- #on_url(parser, url) ⇒ Object
- #run ⇒ Object
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, ) @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 = # 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 (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 (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 |
#run ⇒ Object
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.}\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 |