falcon 0.19.6 → 0.20.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c09541c3301a05218ed04a87672b46a5d1b715f106cea0e521a99abe08acd4b3
4
- data.tar.gz: aea4dd96271c20a0ad58797a88a463302b673d3c8eb8c76637248cf7723884da
3
+ metadata.gz: 9b2de4bddd24124f6859b6fe9abf37624537b3d9175cab2d3925a897cab1ca30
4
+ data.tar.gz: ca3ca0154ec2abf520c3b2a6c0f231bc66833689236a9144ce7832e390b9a894
5
5
  SHA512:
6
- metadata.gz: cedf78004e71300083ea4b514e550fac70368dde871be8942c8b37940f2c50356b76997c9f575470a4379536ee366af87876726a9a9cc677424873a44103a1a4
7
- data.tar.gz: 7cef15900bcf69b2ac7a240abf08d2ca34ec84bf1d44710dc27f406ccf2aa6f6b77d5724d73a72cb0fdb11d8ce00410d6dbe0869549ffee70d3b3fa86b388f10
6
+ metadata.gz: aee2014818ce576facb26f073df66c15cfc866f4aa9993185d98f0ebc774547fcb043a9de72f36cbaa8c977a3cdcd6af998b4860a9ad63d3cd41676ed8a5e5aa
7
+ data.tar.gz: 15a9f6d3e42d5333f533b3e005d0bf6c6fcbe533814221f8ee02b47e2152b58e91da948d607ad63d45225acc76736824baf743029b44435fe315dd872c882e07
data/.travis.yml CHANGED
@@ -1,5 +1,4 @@
1
1
  language: ruby
2
- sudo: required
3
2
  dist: xenial
4
3
  cache: bundler
5
4
 
@@ -18,11 +17,14 @@ matrix:
18
17
  - rvm: 2.4
19
18
  - rvm: 2.5
20
19
  - rvm: 2.6
20
+ - rvm: truffleruby
21
21
  - rvm: jruby-head
22
22
  env: JRUBY_OPTS="--debug -X+O"
23
23
  - rvm: ruby-head
24
24
  - rvm: rbx-3
25
25
  allow_failures:
26
+ - rvm: truffleruby
26
27
  - rvm: ruby-head
27
28
  - rvm: jruby-head
29
+ - rvm: truffleruby
28
30
  - rvm: rbx-3
data/Gemfile CHANGED
@@ -7,10 +7,10 @@ group :development do
7
7
  end
8
8
 
9
9
  group :test do
10
- gem 'simplecov'
11
- gem 'coveralls', require: false
10
+ gem 'pry'
11
+ gem 'covered', require: 'covered/rspec' if RUBY_VERSION >= "2.6.0"
12
12
 
13
- gem 'async-process', '~> 1.1.0'
13
+ gem 'async-process', '~> 1.1'
14
14
 
15
15
  gem 'puma'
16
16
  end
@@ -0,0 +1,8 @@
1
+
2
+ # A sample Gemfile
3
+ source "https://rubygems.org"
4
+
5
+ gem "sinatra"
6
+ gem "falcon"
7
+
8
+ gem "async-redis", ">= 0.3.1"
@@ -0,0 +1,27 @@
1
+
2
+ require 'sinatra/base'
3
+ require 'async/redis'
4
+ require 'async/clock'
5
+
6
+ CLIENT = Async::Redis::Client.new(Async::Redis.local_endpoint)
7
+
8
+ class MyApp < Sinatra::Base
9
+ get "/" do
10
+ puts "Starting BLPOP SLEEP..."
11
+ duration = Async::Clock.measure do
12
+ CLIENT.call "BLPOP", "SLEEP", 1
13
+ end
14
+ puts "Finished BLPOP SLEEP after #{duration.round(2)}s"
15
+
16
+ "ok"
17
+ end
18
+ end
19
+
20
+ use MyApp # Then, it will get to Sinatra.
21
+ run lambda {|env| [404, {}, []]} # Bottom of the stack, give 404.
22
+
23
+ # Start server like this:
24
+ # falcon --verbose serve --threaded --concurrency 1 --bind http://localhost:9292
25
+
26
+ # Test server, e.g.:
27
+ # time ab -n 64 -c 64 http://localhost:9292/
data/falcon.gemspec CHANGED
@@ -17,10 +17,11 @@ Gem::Specification.new do |spec|
17
17
  spec.require_paths = ["lib"]
18
18
 
19
19
  spec.add_dependency("http-protocol", "~> 0.10.0")
20
-
21
- spec.add_dependency("async-io", "~> 1.9")
20
+
21
+ spec.add_dependency("async", "~> 1.13")
22
+ spec.add_dependency("async-io", "~> 1.18")
22
23
  spec.add_dependency("async-http", "~> 0.37.2")
23
- spec.add_dependency("async-container", "~> 0.8.0")
24
+ spec.add_dependency("async-container", "~> 0.9.0")
24
25
 
25
26
  spec.add_dependency("rack", ">= 1.0")
26
27
 
@@ -30,7 +31,7 @@ Gem::Specification.new do |spec|
30
31
  spec.add_development_dependency "async-rspec", "~> 1.7"
31
32
  spec.add_development_dependency "async-websocket", "~> 0.6.0"
32
33
 
33
- spec.add_development_dependency "bundler", "~> 1.3"
34
+ spec.add_development_dependency "bundler"
34
35
  spec.add_development_dependency "rspec", "~> 3.6"
35
36
  spec.add_development_dependency "rake"
36
37
  end
@@ -47,8 +47,11 @@ module Falcon
47
47
  def self.wrap(status, headers, body)
48
48
  headers = wrap_headers(headers)
49
49
 
50
- headers.add('server', "falcon/#{Falcon::VERSION}")
51
- headers.add('date', Time.now.httpdate)
50
+ # https://tools.ietf.org/html/rfc7231#section-7.4.2
51
+ # headers.add('server', "falcon/#{Falcon::VERSION}")
52
+
53
+ # https://tools.ietf.org/html/rfc7231#section-7.1.1.2
54
+ # headers.add('date', Time.now.httpdate)
52
55
 
53
56
  body = Output.wrap(status, headers, body)
54
57
 
@@ -24,6 +24,7 @@ require_relative 'command/virtual'
24
24
  require_relative 'version'
25
25
 
26
26
  require 'samovar'
27
+ require 'logger'
27
28
 
28
29
  module Falcon
29
30
  module Command
@@ -42,6 +42,7 @@ module Falcon
42
42
 
43
43
  option '-p/--port <number>', "Override the specified port", type: Integer
44
44
  option '-h/--hostname <hostname>', "Specify the hostname which would be used for certificates, etc."
45
+ option '-t/--timeout <duration>', "Specify the maximum time to wait for blocking operations.", type: Float, default: 60
45
46
 
46
47
  option '-c/--config <path>', "Rackup configuration file to load", default: 'config.ru'
47
48
  option '-n/--concurrency <count>', "Number of processes to start", default: Async::Container.hardware_concurrency, type: Integer
@@ -78,6 +79,10 @@ module Falcon
78
79
  options[:port] = @options[:port]
79
80
  end
80
81
 
82
+ if duration = @options[:timeout] and !duration.zero?
83
+ options[:timeout] = duration
84
+ end
85
+
81
86
  return options
82
87
  end
83
88
 
@@ -96,19 +101,30 @@ module Falcon
96
101
 
97
102
  bound_endpoint = Async::Reactor.run do
98
103
  Async::IO::SharedEndpoint.bound(endpoint)
99
- end.result
104
+ end.wait
100
105
 
101
- Async.logger.info "Falcon taking flight! Binding to #{endpoint} [#{container_class} with concurrency: #{@options[:concurrency]}]"
106
+ Async.logger.info(endpoint) do
107
+ "Falcon taking flight! Using #{container_class} with concurrency: #{@options[:concurrency]}"
108
+ end
102
109
 
103
110
  debug_trap = Async::IO::Trap.new(:USR1)
104
111
 
112
+ debug_trap.ignore!
113
+
114
+ if container_class.multiprocess?
115
+ Async.logger.info "Full status: kill -USR1 #{-Process.pid}"
116
+ end
117
+
105
118
  container_class.new(concurrency: @options[:concurrency], name: "Falcon Server") do |task, instance|
106
119
  task.async do
107
- debug_trap.install!
108
- Async.logger.info "Send `kill -USR1 #{Process.pid}` for detailed status :)"
120
+ if debug_trap.install!
121
+ Async.logger.info "Per-process status: kill -USR1 #{Process.pid}"
122
+ end
109
123
 
110
124
  debug_trap.trap do
111
- task.reactor.print_hierarchy($stderr)
125
+ Async.logger.info(self) do |buffer|
126
+ task.reactor.print_hierarchy(buffer)
127
+ end
112
128
  end
113
129
  end
114
130
 
@@ -46,7 +46,7 @@ module Falcon
46
46
  response = super
47
47
 
48
48
  statistics.wrap(response) do |statistics, error|
49
- @logger.info(request.authority) {"#{statistics.object_id}] #{request.method} #{request.path} #{request.version} -> #{response.status} #{response.headers.to_h}; #{statistics.inspect}"}
49
+ @logger.info(request.authority) {"#{request.method} #{request.path} #{request.version} -> #{response.status} #{response.headers.to_h}; #{statistics.inspect}"}
50
50
 
51
51
  @logger.error(request.authority) {"#{error.class}: #{error.message}"} if error
52
52
  end
@@ -19,5 +19,5 @@
19
19
  # THE SOFTWARE.
20
20
 
21
21
  module Falcon
22
- VERSION = "0.19.6"
22
+ VERSION = "0.20.0"
23
23
  end
data/tasks/benchmark.rake CHANGED
@@ -17,7 +17,7 @@ namespace :benchmark do
17
17
  servers = [
18
18
  ["puma", "--bind", host.gsub("http", "tcp")],
19
19
  ["puma", "--workers", threads.to_s, "--bind", host.gsub("http", "tcp")],
20
- ["falcon", "--bind", host, "--config"]
20
+ ["falcon", "serve", "--bind", host, "--config"]
21
21
  ]
22
22
 
23
23
  endpoint = Async::HTTP::URLEndpoint.parse(host)
@@ -51,7 +51,7 @@ namespace :benchmark do
51
51
  response.close
52
52
 
53
53
  socket.close
54
- rescue Errno::ECONNREFUSED
54
+ rescue Errno::ECONNREFUSED, Errno::ECONNRESET
55
55
  task.sleep 0.01
56
56
 
57
57
  retry
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: falcon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.19.6
4
+ version: 0.20.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-26 00:00:00.000000000 Z
11
+ date: 2019-01-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: http-protocol
@@ -24,20 +24,34 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.10.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: async
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.13'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.13'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: async-io
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - "~>"
32
46
  - !ruby/object:Gem::Version
33
- version: '1.9'
47
+ version: '1.18'
34
48
  type: :runtime
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
52
  - - "~>"
39
53
  - !ruby/object:Gem::Version
40
- version: '1.9'
54
+ version: '1.18'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: async-http
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -58,14 +72,14 @@ dependencies:
58
72
  requirements:
59
73
  - - "~>"
60
74
  - !ruby/object:Gem::Version
61
- version: 0.8.0
75
+ version: 0.9.0
62
76
  type: :runtime
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
80
  - - "~>"
67
81
  - !ruby/object:Gem::Version
68
- version: 0.8.0
82
+ version: 0.9.0
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: rack
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -140,16 +154,16 @@ dependencies:
140
154
  name: bundler
141
155
  requirement: !ruby/object:Gem::Requirement
142
156
  requirements:
143
- - - "~>"
157
+ - - ">="
144
158
  - !ruby/object:Gem::Version
145
- version: '1.3'
159
+ version: '0'
146
160
  type: :development
147
161
  prerelease: false
148
162
  version_requirements: !ruby/object:Gem::Requirement
149
163
  requirements:
150
- - - "~>"
164
+ - - ">="
151
165
  - !ruby/object:Gem::Version
152
- version: '1.3'
166
+ version: '0'
153
167
  - !ruby/object:Gem::Dependency
154
168
  name: rspec
155
169
  requirement: !ruby/object:Gem::Requirement
@@ -197,6 +211,8 @@ files:
197
211
  - examples/beer/config.ru
198
212
  - examples/benchmark/config.ru
199
213
  - examples/hello/config.ru
214
+ - examples/redis/Gemfile
215
+ - examples/redis/config.ru
200
216
  - examples/sinatra/Gemfile
201
217
  - examples/sinatra/Gemfile.lock
202
218
  - examples/sinatra/config.ru
@@ -240,8 +256,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
240
256
  - !ruby/object:Gem::Version
241
257
  version: '0'
242
258
  requirements: []
243
- rubyforge_project:
244
- rubygems_version: 2.7.7
259
+ rubygems_version: 3.0.1
245
260
  signing_key:
246
261
  specification_version: 4
247
262
  summary: A fast, asynchronous, rack-compatible web server.