spider-gazelle 0.1.1 → 0.1.2
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/bin/sg +0 -1
- data/lib/spider-gazelle/connection.rb +40 -10
- data/lib/spider-gazelle/spider.rb +5 -2
- 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: 389b76b304d2c434532df00b18f0e772b7bca616
|
|
4
|
+
data.tar.gz: de17af1941a3ce3cf24a65ec069a1e33bf5490f6
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d3751fe5f50137772b2b434cf8ab2bbbeb8c597e343977ca99fd43de1cc5592f7897d756ae04e1ba4d81adbe60de712ab6f8169a42eb3a62bc9b91b6ccd60d90
|
|
7
|
+
data.tar.gz: 1bd6d81f822682a1c52b0c1f843e0f3323f69cc80e7effd755c092874fd6019692f8a705d92d87509393654034ac3a0d885b4c43ad88660f2247fc6834df5734
|
data/bin/sg
CHANGED
|
@@ -82,7 +82,6 @@ ENV['SG_MODE'] = 'no_ipc' if ::FFI::Platform.windows?
|
|
|
82
82
|
puts "#{e.message}\n#{e.backtrace.join("\n") unless e.backtrace.nil?}\n"
|
|
83
83
|
}).finally do
|
|
84
84
|
# This will execute if the TCP binding is lost
|
|
85
|
-
p 'server failed to load - shutting down'
|
|
86
85
|
server.shutdown
|
|
87
86
|
end
|
|
88
87
|
|
|
@@ -5,6 +5,8 @@ module SpiderGazelle
|
|
|
5
5
|
class Connection
|
|
6
6
|
Hijack = Struct.new(:socket, :env)
|
|
7
7
|
|
|
8
|
+
REQUEST_METHOD = 'REQUEST_METHOD'.freeze # NOTE:: duplicate in gazelle.rb
|
|
9
|
+
HEAD = 'HEAD'.freeze
|
|
8
10
|
|
|
9
11
|
RACK = 'rack'.freeze # used for filtering headers
|
|
10
12
|
CLOSE = 'close'.freeze
|
|
@@ -15,6 +17,10 @@ module SpiderGazelle
|
|
|
15
17
|
COLON_SPACE = ': '.freeze
|
|
16
18
|
EOF = "0\r\n\r\n".freeze
|
|
17
19
|
CRLF = "\r\n".freeze
|
|
20
|
+
ZERO = '0'.freeze
|
|
21
|
+
|
|
22
|
+
HTTP_STATUS_CODES = ::Rack::Utils::HTTP_STATUS_CODES
|
|
23
|
+
HTTP_STATUS_DEFAULT = proc { 'CUSTOM' }
|
|
18
24
|
|
|
19
25
|
HTTP_11_400 = "HTTP/1.1 400 Bad Request\r\n\r\n".freeze
|
|
20
26
|
|
|
@@ -187,6 +193,7 @@ module SpiderGazelle
|
|
|
187
193
|
@deferred_responses = nil if @deferred_responses
|
|
188
194
|
|
|
189
195
|
status, headers, body = result
|
|
196
|
+
send_body = @request.env[REQUEST_METHOD] != HEAD
|
|
190
197
|
|
|
191
198
|
# If a file, stream the body in a non-blocking fashion
|
|
192
199
|
if body.respond_to? :to_path
|
|
@@ -201,19 +208,38 @@ module SpiderGazelle
|
|
|
201
208
|
|
|
202
209
|
write_headers(status, headers)
|
|
203
210
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
file.
|
|
207
|
-
file.
|
|
208
|
-
|
|
209
|
-
@
|
|
211
|
+
if send_body
|
|
212
|
+
file = @loop.file(body.to_path, File::RDONLY)
|
|
213
|
+
file.progress do # File is open and available for reading
|
|
214
|
+
file.send_file(@socket, type).finally do
|
|
215
|
+
file.close
|
|
216
|
+
if @request.keep_alive == false
|
|
217
|
+
@socket.shutdown
|
|
218
|
+
end
|
|
210
219
|
end
|
|
211
220
|
end
|
|
221
|
+
return file
|
|
212
222
|
end
|
|
213
|
-
|
|
214
|
-
return file
|
|
215
223
|
else
|
|
216
|
-
|
|
224
|
+
# Optimize the response
|
|
225
|
+
begin
|
|
226
|
+
body_size = body.size
|
|
227
|
+
if body_size < 2
|
|
228
|
+
if body_size == 1
|
|
229
|
+
headers[CONTENT_LENGTH] = body[0].bytesize
|
|
230
|
+
else
|
|
231
|
+
headers[CONTENT_LENGTH] = ZERO
|
|
232
|
+
end
|
|
233
|
+
end
|
|
234
|
+
rescue # just in case
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
if send_body
|
|
238
|
+
write_response(status, headers, body)
|
|
239
|
+
else
|
|
240
|
+
write_headers(status, headers)
|
|
241
|
+
@socket.shutdown if @request.keep_alive == false
|
|
242
|
+
end
|
|
217
243
|
end
|
|
218
244
|
end
|
|
219
245
|
end
|
|
@@ -256,7 +282,7 @@ module SpiderGazelle
|
|
|
256
282
|
end
|
|
257
283
|
|
|
258
284
|
def write_headers(status, headers)
|
|
259
|
-
header = "HTTP/1.1 #{status}\r\n"
|
|
285
|
+
header = "HTTP/1.1 #{status} #{fetch_code(status)}\r\n"
|
|
260
286
|
headers.each do |key, value|
|
|
261
287
|
next if key.start_with? RACK
|
|
262
288
|
|
|
@@ -274,6 +300,10 @@ module SpiderGazelle
|
|
|
274
300
|
@socket.write chunk
|
|
275
301
|
end
|
|
276
302
|
|
|
303
|
+
def fetch_code(status)
|
|
304
|
+
HTTP_STATUS_CODES.fetch(status, &HTTP_STATUS_DEFAULT)
|
|
305
|
+
end
|
|
306
|
+
|
|
277
307
|
|
|
278
308
|
# ------------------------
|
|
279
309
|
# Async response functions:
|
|
@@ -352,12 +352,15 @@ module SpiderGazelle
|
|
|
352
352
|
|
|
353
353
|
def log(*args)
|
|
354
354
|
msg = ''
|
|
355
|
-
|
|
356
|
-
|
|
355
|
+
err = args[-1]
|
|
356
|
+
if err && err.respond_to?(:backtrace)
|
|
357
|
+
msg << "unhandled exception: #{err.message} (#{args[0..-2]})"
|
|
358
|
+
msg << "\n#{err.backtrace.join("\n")}" if err.respond_to?(:backtrace) && err.backtrace
|
|
357
359
|
else
|
|
358
360
|
msg << "unhandled exception: #{args}"
|
|
359
361
|
end
|
|
360
362
|
@logger.error msg
|
|
363
|
+
::Libuv::Q.reject(@web, msg)
|
|
361
364
|
end
|
|
362
365
|
end
|
|
363
366
|
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: 0.1.
|
|
4
|
+
version: 0.1.2
|
|
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: 2014-01-
|
|
11
|
+
date: 2014-01-19 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rake
|