spider-gazelle 3.0.9 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/spider-gazelle/reactor.rb +2 -3
- data/lib/spider-gazelle/signaller.rb +10 -13
- data/lib/spider-gazelle/spider.rb +1 -1
- data/lib/spider-gazelle/spider/binding.rb +4 -14
- data/lib/spider-gazelle/spider/http1.rb +16 -22
- data/lib/spider-gazelle/upgrades/websocket.rb +25 -39
- data/lib/spider-gazelle/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d64004e93ed47b0a816510fb7e1c2ef3fd587e1e
|
|
4
|
+
data.tar.gz: f3e23bff3cb16a0442ad6037872674d2dd3c7793
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1fa29f7d4dc35e3c870fe7fe4c0fa7755a09c6caa2296619d1c2b227430869914bcd030d77819f1ddd9dbbf1e28be6a15767661582b498c02cc34f315681064b
|
|
7
|
+
data.tar.gz: 0354d77ffd7971b1918eb5db4c7a6385b5b4708ff37eef32968e1bedd0cffa2060799041fcdedeb8eb265f6fc4fd3e599d2a80bd6e124391d31b6e6803318f3f
|
|
@@ -14,7 +14,6 @@ module SpiderGazelle
|
|
|
14
14
|
@thread = ::Libuv::Reactor.default
|
|
15
15
|
@logger = Logger.instance
|
|
16
16
|
@running = false
|
|
17
|
-
@shutdown = method(:shutdown)
|
|
18
17
|
@shutdown_called = false
|
|
19
18
|
end
|
|
20
19
|
|
|
@@ -23,8 +22,8 @@ module SpiderGazelle
|
|
|
23
22
|
@thread.schedule { yield }
|
|
24
23
|
else
|
|
25
24
|
@running = true
|
|
26
|
-
@thread.notifier
|
|
27
|
-
@thread.on_program_interrupt
|
|
25
|
+
@thread.notifier { |*args| log(*args) }
|
|
26
|
+
@thread.on_program_interrupt { shutdown }
|
|
28
27
|
@thread.run { yield }
|
|
29
28
|
end
|
|
30
29
|
end
|
|
@@ -89,8 +89,6 @@ module SpiderGazelle
|
|
|
89
89
|
|
|
90
90
|
def connect_to_sg_master
|
|
91
91
|
@pipe = @thread.pipe :ipc
|
|
92
|
-
|
|
93
|
-
process = method(:process_response)
|
|
94
92
|
@pipe.connect(SIGNAL_SERVER) do |client|
|
|
95
93
|
@is_client = true
|
|
96
94
|
@is_connected = true
|
|
@@ -103,7 +101,12 @@ module SpiderGazelle
|
|
|
103
101
|
delimiter: "\x03"
|
|
104
102
|
})
|
|
105
103
|
|
|
106
|
-
client
|
|
104
|
+
# The client processes responses here
|
|
105
|
+
client.progress do |data, server|
|
|
106
|
+
@parser.extract(data).each do |msg|
|
|
107
|
+
Spider.instance.__send__(msg)
|
|
108
|
+
end
|
|
109
|
+
end
|
|
107
110
|
client.start_read
|
|
108
111
|
@client_check.resolve(true)
|
|
109
112
|
end
|
|
@@ -138,7 +141,6 @@ module SpiderGazelle
|
|
|
138
141
|
rescue
|
|
139
142
|
end
|
|
140
143
|
|
|
141
|
-
process = method(:process_request)
|
|
142
144
|
@pipe.bind(SIGNAL_SERVER) do |client|
|
|
143
145
|
@logger.verbose { "Client <0x#{client.object_id.to_s(16)}> connection made" }
|
|
144
146
|
@validating[client.object_id] = SignalParser.new
|
|
@@ -159,12 +161,14 @@ module SpiderGazelle
|
|
|
159
161
|
end
|
|
160
162
|
end
|
|
161
163
|
|
|
162
|
-
client.progress
|
|
164
|
+
client.progress do |data, client|
|
|
165
|
+
process_request(data, client)
|
|
166
|
+
end
|
|
163
167
|
client.start_read
|
|
164
168
|
end
|
|
165
169
|
|
|
166
170
|
# catch server errors
|
|
167
|
-
@pipe.catch
|
|
171
|
+
@pipe.catch { |error| panic! error }
|
|
168
172
|
@pipe.finally { @is_connected = false }
|
|
169
173
|
|
|
170
174
|
# start listening
|
|
@@ -208,12 +212,5 @@ module SpiderGazelle
|
|
|
208
212
|
end
|
|
209
213
|
end
|
|
210
214
|
end
|
|
211
|
-
|
|
212
|
-
# The client processes responses here
|
|
213
|
-
def process_response(data, server)
|
|
214
|
-
@parser.extract(data).each do |msg|
|
|
215
|
-
Spider.instance.__send__(msg)
|
|
216
|
-
end
|
|
217
|
-
end
|
|
218
215
|
end
|
|
219
216
|
end
|
|
@@ -181,7 +181,7 @@ module SpiderGazelle
|
|
|
181
181
|
|
|
182
182
|
def load_gazelle_thread(reactor, thread, mode, options, loading)
|
|
183
183
|
# Log any unhandled errors
|
|
184
|
-
thread.notifier reactor.
|
|
184
|
+
thread.notifier { |*args| reactor.log(*args) }
|
|
185
185
|
# Give current requests 5 seconds to complete
|
|
186
186
|
thread.on_program_interrupt do
|
|
187
187
|
timer = thread.timer {
|
|
@@ -19,12 +19,10 @@ module SpiderGazelle
|
|
|
19
19
|
@port = @options[:port]
|
|
20
20
|
@app, @app_port, @tls = AppStore.lookup(options[:rackup])
|
|
21
21
|
|
|
22
|
-
@set_protocol = method(:set_protocol)
|
|
23
|
-
|
|
24
22
|
@http1_cache = []
|
|
25
23
|
@http2_cache = []
|
|
26
|
-
@return_http1 =
|
|
27
|
-
@return_http2 =
|
|
24
|
+
@return_http1 = proc { |parser| @http1_cache << parser }
|
|
25
|
+
@return_http2 = proc { |parser| @http2_cache << parser }
|
|
28
26
|
@parser_count = 0
|
|
29
27
|
end
|
|
30
28
|
|
|
@@ -78,7 +76,7 @@ module SpiderGazelle
|
|
|
78
76
|
end
|
|
79
77
|
|
|
80
78
|
def prepare_client_tls(client)
|
|
81
|
-
client.on_handshake
|
|
79
|
+
client.on_handshake { |client, version| set_protocol(client, version) }
|
|
82
80
|
client.start_tls(@tls)
|
|
83
81
|
|
|
84
82
|
client.start_read
|
|
@@ -93,7 +91,7 @@ module SpiderGazelle
|
|
|
93
91
|
end
|
|
94
92
|
|
|
95
93
|
parser.load(client, @app_port, @app, @tls)
|
|
96
|
-
client.progress do |data
|
|
94
|
+
client.progress do |data|
|
|
97
95
|
parser.parse(data)
|
|
98
96
|
end
|
|
99
97
|
end
|
|
@@ -109,19 +107,11 @@ module SpiderGazelle
|
|
|
109
107
|
Http1.new(@return_http1, @h1_parser_obj, @thread, @logger, @iterator)
|
|
110
108
|
end
|
|
111
109
|
|
|
112
|
-
def return_http1(parser)
|
|
113
|
-
@http1_cache.push parser
|
|
114
|
-
end
|
|
115
|
-
|
|
116
110
|
def new_http2_parser
|
|
117
111
|
raise NotImplementedError.new 'TODO:: Create HTTP2 parser class'
|
|
118
112
|
@parser_count += 1
|
|
119
113
|
Http2.new(@return_http2, @thread, @logger, @iterator)
|
|
120
114
|
end
|
|
121
|
-
|
|
122
|
-
def return_http2(parser)
|
|
123
|
-
@http2_cache << parser
|
|
124
|
-
end
|
|
125
115
|
end
|
|
126
116
|
end
|
|
127
117
|
end
|
|
@@ -74,8 +74,6 @@ module SpiderGazelle
|
|
|
74
74
|
@thread = thread
|
|
75
75
|
@logger = logger
|
|
76
76
|
|
|
77
|
-
@queue_response = method :queue_response
|
|
78
|
-
@write_chunk = method :write_chunk
|
|
79
77
|
@gazelles = gazelles
|
|
80
78
|
|
|
81
79
|
# The parser state for this instance
|
|
@@ -91,9 +89,7 @@ module SpiderGazelle
|
|
|
91
89
|
|
|
92
90
|
attr_reader :parsing
|
|
93
91
|
|
|
94
|
-
|
|
95
|
-
def self.on_progress(data, socket); end
|
|
96
|
-
DUMMY_PROGRESS = self.method :on_progress
|
|
92
|
+
DUMMY_PROGRESS = proc {}
|
|
97
93
|
|
|
98
94
|
def load(socket, port, app, tls)
|
|
99
95
|
@socket = socket
|
|
@@ -113,7 +109,7 @@ module SpiderGazelle
|
|
|
113
109
|
|
|
114
110
|
def on_close
|
|
115
111
|
# Unlink the progress callback (prevent funny business)
|
|
116
|
-
@socket.progress DUMMY_PROGRESS
|
|
112
|
+
@socket.progress &DUMMY_PROGRESS
|
|
117
113
|
@socket.storage = nil
|
|
118
114
|
reset
|
|
119
115
|
@return_method.call(self)
|
|
@@ -189,7 +185,15 @@ module SpiderGazelle
|
|
|
189
185
|
@processing = @requests.shift
|
|
190
186
|
if @processing
|
|
191
187
|
request = @processing
|
|
192
|
-
|
|
188
|
+
|
|
189
|
+
# queue response
|
|
190
|
+
request.then do |response|
|
|
191
|
+
@responses << response
|
|
192
|
+
send_next_response unless @transmitting
|
|
193
|
+
|
|
194
|
+
# Processing will be set to nil if the array is empty
|
|
195
|
+
process_next
|
|
196
|
+
end
|
|
193
197
|
|
|
194
198
|
@gazelles.next.schedule do
|
|
195
199
|
process_on_gazelle(request)
|
|
@@ -222,14 +226,6 @@ module SpiderGazelle
|
|
|
222
226
|
# ----------------
|
|
223
227
|
# Response Sending
|
|
224
228
|
# ----------------
|
|
225
|
-
def queue_response(response)
|
|
226
|
-
@responses << response
|
|
227
|
-
send_next_response unless @transmitting
|
|
228
|
-
|
|
229
|
-
# Processing will be set to nil if the array is empty
|
|
230
|
-
process_next
|
|
231
|
-
end
|
|
232
|
-
|
|
233
229
|
def send_next_response
|
|
234
230
|
request, result = @responses.shift
|
|
235
231
|
@transmitting = request
|
|
@@ -355,14 +351,17 @@ module SpiderGazelle
|
|
|
355
351
|
write_headers keep_alive, status, headers
|
|
356
352
|
|
|
357
353
|
# Stream the response (pass directly into @socket.write)
|
|
358
|
-
body.each
|
|
354
|
+
body.each { |data| @socket.write(data) }
|
|
359
355
|
@socket.shutdown if keep_alive == false
|
|
360
356
|
else
|
|
361
357
|
headers['Transfer-Encoding'] = 'chunked'
|
|
362
358
|
write_headers keep_alive, status, headers
|
|
363
359
|
|
|
364
360
|
# Stream the response
|
|
365
|
-
body.each
|
|
361
|
+
body.each do |part|
|
|
362
|
+
chunk = part.bytesize.to_s(16) << "\r\n" << part << "\r\n"
|
|
363
|
+
@socket.write chunk
|
|
364
|
+
end
|
|
366
365
|
|
|
367
366
|
@socket.write "0\r\n\r\n"
|
|
368
367
|
@socket.shutdown if keep_alive == false
|
|
@@ -390,11 +389,6 @@ module SpiderGazelle
|
|
|
390
389
|
@socket.write header
|
|
391
390
|
end
|
|
392
391
|
|
|
393
|
-
def write_chunk(part)
|
|
394
|
-
chunk = part.bytesize.to_s(16) << "\r\n" << part << "\r\n"
|
|
395
|
-
@socket.write chunk
|
|
396
|
-
end
|
|
397
|
-
|
|
398
392
|
HTTP_STATUS_CODES = Rack::Utils::HTTP_STATUS_CODES
|
|
399
393
|
HTTP_STATUS_DEFAULT = proc { 'CUSTOM' }
|
|
400
394
|
def fetch_code(status)
|
|
@@ -21,15 +21,34 @@ class SpiderGazelle::Websocket < ::Libuv::Q::DeferredPromise
|
|
|
21
21
|
@driver = ::WebSocket::Driver.rack self
|
|
22
22
|
|
|
23
23
|
# Pass data from the socket to the driver
|
|
24
|
-
@socket.progress
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
@socket.progress do |data|
|
|
25
|
+
begin
|
|
26
|
+
@driver.parse data
|
|
27
|
+
rescue Exception => e
|
|
28
|
+
# Prevent hanging sockets
|
|
29
|
+
@socket.close
|
|
30
|
+
raise e
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
@socket.finally do
|
|
34
|
+
if @shutdown_called.nil?
|
|
35
|
+
@defer.reject WebSocket::Driver::CloseEvent.new(1006, 'connection was closed unexpectedly')
|
|
36
|
+
end
|
|
37
|
+
end
|
|
27
38
|
|
|
28
39
|
# Driver has indicated that it is closing
|
|
29
40
|
# We'll close the socket after writing any remaining data
|
|
30
|
-
@driver.on :close
|
|
31
|
-
|
|
32
|
-
|
|
41
|
+
@driver.on :close do |event|
|
|
42
|
+
@shutdown_called = true
|
|
43
|
+
@socket.shutdown
|
|
44
|
+
@defer.resolve event
|
|
45
|
+
end
|
|
46
|
+
@driver.on :message do |event|
|
|
47
|
+
@progress.call(event.data, self) unless @progress.nil?
|
|
48
|
+
end
|
|
49
|
+
@driver.on :error do |event|
|
|
50
|
+
@defer.reject event
|
|
51
|
+
end
|
|
33
52
|
end
|
|
34
53
|
|
|
35
54
|
# Write some text to the websocket connection
|
|
@@ -61,37 +80,4 @@ class SpiderGazelle::Websocket < ::Libuv::Q::DeferredPromise
|
|
|
61
80
|
callback ||= blk
|
|
62
81
|
@driver.on :open, &callback
|
|
63
82
|
end
|
|
64
|
-
|
|
65
|
-
protected
|
|
66
|
-
|
|
67
|
-
def socket_read(data, tcp)
|
|
68
|
-
begin
|
|
69
|
-
@driver.parse data
|
|
70
|
-
rescue => e
|
|
71
|
-
# Prevent hanging sockets
|
|
72
|
-
@socket.close
|
|
73
|
-
raise e
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
def socket_close
|
|
78
|
-
if @shutdown_called.nil?
|
|
79
|
-
@defer.reject WebSocket::Driver::CloseEvent.new(1006, 'connection was closed unexpectedly')
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
def on_message(event)
|
|
85
|
-
@progress.call(event.data, self) unless @progress.nil?
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
def on_error(event)
|
|
89
|
-
@defer.reject event
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
def on_close(event)
|
|
93
|
-
@shutdown_called = true
|
|
94
|
-
@socket.shutdown
|
|
95
|
-
@defer.resolve event
|
|
96
|
-
end
|
|
97
83
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: spider-gazelle
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 3.0
|
|
4
|
+
version: 3.1.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Stephen von Takach
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2017-11-
|
|
11
|
+
date: 2017-11-19 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: http-parser
|