spider-gazelle 2.0.4 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'thread'
2
4
 
3
5
  module SpiderGazelle
@@ -65,7 +67,7 @@ module SpiderGazelle
65
67
  end
66
68
  }
67
69
  def delegate(client, retries = 0)
68
- promise = @select_gazelle.next.write2(client, @indicator)
70
+ promise = @select_gazelle.next.write2(client, @indicator, wait: :promise)
69
71
  promise.then do
70
72
  client.close
71
73
  end
@@ -1,26 +1,28 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'websocket/driver'
2
4
  require 'forwardable'
3
5
 
4
6
  module SpiderGazelle
5
7
  class Websocket < ::Libuv::Q::DeferredPromise
6
- attr_reader :env, :url, :loop
8
+ attr_reader :env, :url, :reactor, :socket
7
9
 
8
10
 
9
- RACK_URL_SCHEME = "rack.url_scheme".freeze
10
- HTTP_HOST = "HTTP_HOST".freeze
11
- REQUEST_URI= "REQUEST_URI".freeze
12
- HTTPS = 'https'.freeze
11
+ RACK_URL_SCHEME = 'rack.url_scheme'
12
+ HTTP_HOST = 'HTTP_HOST'
13
+ REQUEST_URI= 'REQUEST_URI'
14
+ HTTPS = 'https'
13
15
 
14
16
 
15
17
  extend Forwardable
16
18
  def_delegators :@driver, :start, :ping, :protocol, :ready_state, :set_header, :state, :close
17
- def_delegators :@socket, :write
19
+ def_delegators :@socket, :write, :peername
18
20
 
19
21
  def initialize(tcp, env)
20
22
  @socket, @env = tcp, env
21
23
 
22
24
  # Initialise the promise
23
- super tcp.loop, tcp.loop.defer
25
+ super tcp.reactor, tcp.reactor.defer
24
26
 
25
27
  scheme = env[RACK_URL_SCHEME] == HTTPS ? 'wss://' : 'ws://'
26
28
  @url = scheme + env[HTTP_HOST] + env[REQUEST_URI]
@@ -42,14 +44,14 @@ module SpiderGazelle
42
44
  #
43
45
  # @param string [String] a string of data to be sent to the far end
44
46
  def text(string)
45
- @loop.schedule { @driver.text(string.to_s) }
47
+ @reactor.schedule { @driver.text(string.to_s) }
46
48
  end
47
49
 
48
50
  # Write some binary data to the websocket connection
49
51
  #
50
52
  # @param array [Array] an array of bytes to be sent to the far end
51
53
  def binary(array)
52
- @loop.schedule { @driver.binary(array.to_a) }
54
+ @reactor.schedule { @driver.binary(array.to_a) }
53
55
  end
54
56
 
55
57
  # Used to define a callback when data is received from the client
@@ -1,5 +1,6 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  module SpiderGazelle
3
- VERSION = '2.0.4'.freeze
4
- EXEC_NAME = 'sg'.freeze
4
+ VERSION = '3.0.0'
5
+ EXEC_NAME = 'sg'
5
6
  end
@@ -55,12 +55,18 @@ describe ::SpiderGazelle::Gazelle::Http1 do
55
55
  @shutdown_called = 0
56
56
  @close_called = 0
57
57
 
58
- @loop = ::Libuv::Loop.default
59
- @timeout = @loop.timer do
58
+ @loop = ::Libuv::Reactor.default
59
+ @loop.notifier do |error, context|
60
+ begin
61
+ p "Log called: #{context}\n#{error.message}\n#{error.backtrace.join("\n")}\n"
62
+ rescue Exception
63
+ p 'error in logger'
64
+ end
65
+ end
66
+ @timeout = @loop.timer {
60
67
  @loop.stop
61
68
  @general_failure << "test timed out"
62
- end
63
- @timeout.start(1000)
69
+ }.start(1000)
64
70
 
65
71
 
66
72
  @return ||= proc {|http1|
@@ -80,7 +86,6 @@ describe ::SpiderGazelle::Gazelle::Http1 do
80
86
  @loop.stop
81
87
  }
82
88
 
83
- @app_mode = :thread_pool
84
89
  @port = 80
85
90
  @tls = false
86
91
  end
@@ -94,12 +99,12 @@ describe ::SpiderGazelle::Gazelle::Http1 do
94
99
  expect(env['SERVER_PORT']).to eq(80)
95
100
 
96
101
  body = 'Hello, World!'
97
- [200, {'Content-Type' => 'text/plain', 'Content-Length' => body.length.to_s}, [body]]
102
+ [200, {'Content-Type' => 'text/plain', 'Content-Length' => body.bytesize.to_s}, [body]]
98
103
  end
99
104
  writes = []
100
105
 
101
106
  @loop.run {
102
- @http1.load(@socket, @port, app, @app_mode, @tls)
107
+ @http1.load(@socket, @port, app, @tls)
103
108
  @http1.parse("GET / HTTP/1.1\r\nConnection: Close\r\n\r\n")
104
109
 
105
110
  @socket.write_cb = proc { |data|
@@ -107,12 +112,12 @@ describe ::SpiderGazelle::Gazelle::Http1 do
107
112
  }
108
113
  }
109
114
 
110
- expect(@shutdown_called).to be == 1
111
- expect(@close_called).to be == 0
112
115
  expect(writes).to eq([
113
116
  "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nContent-Length: 13\r\nConnection: close\r\n\r\n",
114
117
  "Hello, World!"
115
118
  ])
119
+ expect(@shutdown_called).to be == 1
120
+ expect(@close_called).to be == 0
116
121
  end
117
122
 
118
123
  it "should fill out the environment properly", http1: true do
@@ -121,7 +126,7 @@ describe ::SpiderGazelle::Gazelle::Http1 do
121
126
  expect(env['REQUEST_PATH']).to eq('/')
122
127
  expect(env['QUERY_STRING']).to eq('test=ing')
123
128
  expect(env['SERVER_NAME']).to eq('spider.gazelle.net')
124
- expect(env['SERVER_PORT']).to eq(3000)
129
+ expect(env['SERVER_PORT']).to eq('3000')
125
130
  expect(env['REMOTE_ADDR']).to eq('127.0.0.1')
126
131
  expect(env['rack.url_scheme']).to eq('http')
127
132
 
@@ -130,7 +135,7 @@ describe ::SpiderGazelle::Gazelle::Http1 do
130
135
  end
131
136
 
132
137
  @loop.run {
133
- @http1.load(@socket, @port, app, @app_mode, @tls)
138
+ @http1.load(@socket, @port, app, @tls)
134
139
  @http1.parse("GET /?test=ing HTTP/1.1\r\nHost: spider.gazelle.net:3000\r\nConnection: Close\r\n\r\n")
135
140
  }
136
141
 
@@ -146,7 +151,7 @@ describe ::SpiderGazelle::Gazelle::Http1 do
146
151
  writes = []
147
152
 
148
153
  @loop.run {
149
- @http1.load(@socket, @port, app, @app_mode, @tls)
154
+ @http1.load(@socket, @port, app, @tls)
150
155
  @http1.parse("GET / HTTP/1.1\r\nConnection: Close\r\n\r\n")
151
156
 
152
157
  @socket.write_cb = proc { |data|
@@ -170,7 +175,7 @@ describe ::SpiderGazelle::Gazelle::Http1 do
170
175
  writes = []
171
176
 
172
177
  @loop.run {
173
- @http1.load(@socket, @port, app, @app_mode, @tls)
178
+ @http1.load(@socket, @port, app, @tls)
174
179
  @http1.parse("GET / HTTP/1.1\r\n\r\n")
175
180
 
176
181
  @socket.write_cb = proc { |data|
@@ -221,7 +226,7 @@ describe ::SpiderGazelle::Gazelle::Http1 do
221
226
 
222
227
  writes = []
223
228
  @loop.run {
224
- @http1.load(@socket, @port, app, @app_mode, @tls)
229
+ @http1.load(@socket, @port, app, @tls)
225
230
  @http1.parse("GET /1 HTTP/1.1\r\n\r\nGET /2 HTTP/1.1\r\n\r\nGET /3 HTTP/1.1\r\n\r\n")
226
231
  @http1.parse("GET /4 HTTP/1.1\r\nConnection: Close\r\n\r\n")
227
232
 
@@ -260,7 +265,7 @@ describe ::SpiderGazelle::Gazelle::Http1 do
260
265
  writes = []
261
266
 
262
267
  @loop.run {
263
- @http1.load(@socket, @port, app, @app_mode, @tls)
268
+ @http1.load(@socket, @port, app, @tls)
264
269
  @http1.parse("GET / HTTP/1.1\r\nConnection: Close\r\n\r\n")
265
270
 
266
271
  @socket.write_cb = proc { |data|
@@ -310,7 +315,7 @@ describe ::SpiderGazelle::Gazelle::Http1 do
310
315
 
311
316
  writes = []
312
317
  @loop.run {
313
- @http1.load(@socket, @port, app, @app_mode, @tls)
318
+ @http1.load(@socket, @port, app, @tls)
314
319
  @http1.parse("GET /1 HTTP/1.1\r\n\r\nGET /2 HTTP/1.1\r\n\r\nGET /3 HTTP/1.1\r\n\r\n")
315
320
  @http1.parse("GET /4 HTTP/1.1\r\nConnection: Close\r\n\r\n")
316
321
 
@@ -351,7 +356,7 @@ describe ::SpiderGazelle::Gazelle::Http1 do
351
356
  writes = []
352
357
 
353
358
  @loop.run {
354
- @http1.load(@socket, @port, app, @app_mode, @tls)
359
+ @http1.load(@socket, @port, app, @tls)
355
360
  @http1.parse("GET / HTTP/1.1\r\nConnection: Close\r\n\r\n")
356
361
 
357
362
  @socket.write_cb = proc { |data|
@@ -18,16 +18,16 @@ Gem::Specification.new do |s|
18
18
  Look out! Here comes the Spidergazelle!
19
19
  EOF
20
20
 
21
- s.add_dependency 'rake'
22
- s.add_dependency 'http-parser' # Ruby FFI bindings for https://github.com/joyent/http-parser
23
- s.add_dependency 'libuv', '>= 2.0.5' # Ruby FFI bindings for https://github.com/libuv/libuv
24
- s.add_dependency 'uv-rays','>= 1.2.0' # Provides buffering tools
25
- s.add_dependency 'rack', '>= 1.0.0' # Ruby web server interface
26
- s.add_dependency 'websocket-driver' # Websocket parser
27
- s.add_dependency 'http-2' # HTTP2 parsing and response management
21
+ s.add_dependency 'http-parser', '~> 1.1' # Ruby FFI bindings for https://github.com/joyent/http-parser
22
+ s.add_dependency 'libuv', '~> 3.0' # Ruby FFI bindings for https://github.com/libuv/libuv
23
+ s.add_dependency 'uv-rays','~> 2.0' # Provides buffering tools
24
+ s.add_dependency 'rack', '~> 2.0' # Ruby web server interface
25
+ s.add_dependency 'websocket-driver', '~> 0.6' # Websocket parser
26
+ s.add_dependency 'http-2', '~> 0.8' # HTTP2 parsing and response management
28
27
 
29
- s.add_development_dependency 'rspec' # Testing framework
30
- s.add_development_dependency 'yard' # Comment based documentation generation
28
+ s.add_development_dependency 'rspec', '~> 3.5' # Testing framework
29
+ s.add_development_dependency 'rake', '~> 11.2' # Task runner
30
+ s.add_development_dependency 'yard', '~> 0.9' # Comment based documentation generation
31
31
 
32
32
  s.files = Dir["{lib,bin}/**/*"] + %w(Rakefile spider-gazelle.gemspec README.md LICENSE)
33
33
  s.test_files = Dir["spec/**/*"]
metadata CHANGED
@@ -1,141 +1,141 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spider-gazelle
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.4
4
+ version: 3.0.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: 2016-08-30 00:00:00.000000000 Z
11
+ date: 2016-10-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rake
14
+ name: http-parser
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '1.1'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: '1.1'
27
27
  - !ruby/object:Gem::Dependency
28
- name: http-parser
28
+ name: libuv
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '3.0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: '3.0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: libuv
42
+ name: uv-rays
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 2.0.5
47
+ version: '2.0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 2.0.5
54
+ version: '2.0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: uv-rays
56
+ name: rack
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 1.2.0
61
+ version: '2.0'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 1.2.0
68
+ version: '2.0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: rack
70
+ name: websocket-driver
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 1.0.0
75
+ version: '0.6'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 1.0.0
82
+ version: '0.6'
83
83
  - !ruby/object:Gem::Dependency
84
- name: websocket-driver
84
+ name: http-2
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ">="
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '0'
89
+ version: '0.8'
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ">="
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '0'
96
+ version: '0.8'
97
97
  - !ruby/object:Gem::Dependency
98
- name: http-2
98
+ name: rspec
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - ">="
101
+ - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :runtime
103
+ version: '3.5'
104
+ type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - ">="
108
+ - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '0'
110
+ version: '3.5'
111
111
  - !ruby/object:Gem::Dependency
112
- name: rspec
112
+ name: rake
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - ">="
115
+ - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '0'
117
+ version: '11.2'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - ">="
122
+ - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: '0'
124
+ version: '11.2'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: yard
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - ">="
129
+ - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: '0'
131
+ version: '0.9'
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - ">="
136
+ - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: '0'
138
+ version: '0.9'
139
139
  description: |2
140
140
  Spidergazelle, spidergazelle, amazingly agile, she leaps through the veldt,
141
141
  Spidergazelle, spidergazelle! She don’t care what you think, she says what the hell!
@@ -153,7 +153,6 @@ files:
153
153
  - Rakefile
154
154
  - bin/sg
155
155
  - lib/rack/handler/spider-gazelle.rb
156
- - lib/rack/lock_patch.rb
157
156
  - lib/spider-gazelle.rb
158
157
  - lib/spider-gazelle/gazelle.rb
159
158
  - lib/spider-gazelle/gazelle/app_store.rb
@@ -169,7 +168,6 @@ files:
169
168
  - lib/spider-gazelle/upgrades/websocket.rb
170
169
  - lib/spider-gazelle/version.rb
171
170
  - spec/http1_spec.rb
172
- - spec/rack_lock_spec.rb
173
171
  - spider-gazelle.gemspec
174
172
  homepage: https://github.com/cotag/spider-gazelle
175
173
  licenses:
@@ -197,5 +195,3 @@ specification_version: 4
197
195
  summary: A fast, parallel and concurrent web server for ruby
198
196
  test_files:
199
197
  - spec/http1_spec.rb
200
- - spec/rack_lock_spec.rb
201
- has_rdoc:
@@ -1,39 +0,0 @@
1
- require 'thread'
2
- require 'rack/body_proxy'
3
-
4
- require 'rack/lock' # ensure this loads first
5
-
6
- module Rack
7
- # Rack::Lock locks every request inside a mutex, so that every request
8
- # will effectively be executed synchronously.
9
- class Lock
10
- # FLAG = 'rack.multithread'.freeze # defined in rack/lock
11
- RACK_MULTITHREAD ||= FLAG
12
-
13
- def initialize(app, mutex = Mutex.new)
14
- @app, @mutex = app, mutex
15
- @sig = ConditionVariable.new
16
- @count = 0
17
- end
18
-
19
- def call(env)
20
- @mutex.lock
21
- @count += 1
22
- @sig.wait(@mutex) if @count > 1
23
- response = @app.call(env.merge(RACK_MULTITHREAD => false))
24
- returned = response << BodyProxy.new(response.pop) {
25
- @mutex.synchronize { unlock }
26
- }
27
- ensure
28
- unlock unless returned
29
- @mutex.unlock
30
- end
31
-
32
- private
33
-
34
- def unlock
35
- @count -= 1
36
- @sig.signal
37
- end
38
- end
39
- end