falcon 0.23.0 → 0.24.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/README.md +6 -1
- data/examples/push/config.ru +19 -0
- data/examples/push/index.html +14 -0
- data/examples/push/script.js +0 -0
- data/examples/push/style.css +4 -0
- data/lib/falcon/adapters/{push.rb → early_hints.rb} +12 -24
- data/lib/falcon/adapters/rack.rb +2 -5
- data/lib/falcon/server.rb +0 -1
- data/lib/falcon/version.rb +1 -1
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 504e6916fab8a0e117d92f5278a9b5fd9c882da9e390b32884db933af61f311d
|
4
|
+
data.tar.gz: 1706310fa9fd8d820b005fad2fec24426828d92fdaeee5252e1f6e6fa0b6a50f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5aedf3ada69a3df6e5c4be27617e9e4de163272f992ab1915568781e808991bfa4a0ba5e35051578195975dfc776afe704c5c6d810f0691e0335e5a7600380f5
|
7
|
+
data.tar.gz: 816941e7cb925b12aedeb0b8cd171d4df3783eeb6b999bf73734b579fe3ae0545c7d9864ce20f1d28af69772be49ef88d44f3b2449189dfa534c56b16b42335d
|
data/README.md
CHANGED
@@ -101,6 +101,7 @@ module MySite
|
|
101
101
|
end
|
102
102
|
end
|
103
103
|
```
|
104
|
+
|
104
105
|
##### Rails 4.x
|
105
106
|
|
106
107
|
Please ensure you have `config.allow_concurrency = true` in your configuration.
|
@@ -119,6 +120,10 @@ Falcon supports `rack.hijack` for HTTP/1.x connections. You can thus use [async-
|
|
119
120
|
|
120
121
|
The `rack.hijack` functionality is compatible with ActionCable. If you use the `async` adapter, you should run falcon in threaded mode, or in forked mode with `--concurrency 1`. Otherwise, your messaging system will be distributed over several processes with no IPC mechanism. You might like to try out [async-redis](https://github.com/socketry/async-redis) as an asynchronous message bus.
|
121
122
|
|
123
|
+
### Early Hints
|
124
|
+
|
125
|
+
Falcon supports the `rack.early_hints` API when running over HTTP/2.
|
126
|
+
|
122
127
|
### Integration with Guard
|
123
128
|
|
124
129
|
Falcon can restart very quickly and is ideal for use with guard. See [guard-falcon] for more details.
|
@@ -218,7 +223,7 @@ The standard price for business support is $120.00 USD / year / production insta
|
|
218
223
|
|
219
224
|
Each paying business customer is entitled to one vote to prioritize the below work.
|
220
225
|
|
221
|
-
- Add support
|
226
|
+
- Add support stream prioritization in [async-http].
|
222
227
|
- Add support for rolling restarts in [async-container].
|
223
228
|
- Add support for hybrid process/thread model in [async-container].
|
224
229
|
- Asynchronous Postgres and MySQL database adapters for ActiveRecord in [async-postgres] and [async-mysql].
|
@@ -0,0 +1,19 @@
|
|
1
|
+
|
2
|
+
class EarlyHints
|
3
|
+
def initialize(app)
|
4
|
+
@app = app
|
5
|
+
end
|
6
|
+
|
7
|
+
def call(env)
|
8
|
+
if env['PATH_INFO'] == "/index.html" and early_hints = env['rack.early_hints']
|
9
|
+
early_hints.push("/style.css")
|
10
|
+
early_hints.push("/script.js")
|
11
|
+
end
|
12
|
+
|
13
|
+
@app.call(env)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
use EarlyHints
|
18
|
+
use Rack::Static, :urls => [""], :root => __dir__, :index => 'index.html'
|
19
|
+
run lambda{|env| [404, [], ["Not Found"]]}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<!doctype HTML>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Hello World</title>
|
5
|
+
|
6
|
+
<link rel="stylesheet" href="/style.css" />
|
7
|
+
<script type="text/javascript" src="script.js"></script>
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
<h1>Early Hints</h1>
|
11
|
+
|
12
|
+
<p>Check the developer tools to see if early hints worked!</p>
|
13
|
+
</body>
|
14
|
+
</html>
|
File without changes
|
@@ -22,37 +22,25 @@ require 'async/http/middleware'
|
|
22
22
|
|
23
23
|
module Falcon
|
24
24
|
module Adapters
|
25
|
-
|
26
|
-
# https://tools.ietf.org/html/rfc8288
|
27
|
-
class Push < Async::HTTP::Middleware
|
25
|
+
class EarlyHints
|
28
26
|
PRELOAD = /<(?<path>.*?)>;.*?rel=preload/
|
29
27
|
|
30
|
-
def
|
28
|
+
def initialize(request)
|
29
|
+
@request = request
|
30
|
+
end
|
31
|
+
|
32
|
+
def push(path, preload: true, **options)
|
33
|
+
@request.push(path)
|
34
|
+
end
|
35
|
+
|
36
|
+
def call(headers)
|
31
37
|
headers.each do |key, value|
|
32
38
|
if key.casecmp("link").zero? and match = PRELOAD.match(value)
|
33
|
-
|
39
|
+
@request.push(match[:path])
|
34
40
|
else
|
35
|
-
Async.logger.warn(request) {"Unsure how to handle early hints header: #{key}"}
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def call(request)
|
41
|
-
response = super
|
42
|
-
|
43
|
-
Async.logger.debug(self) {response}
|
44
|
-
|
45
|
-
if request.push?
|
46
|
-
Async.logger.debug(self) {response.headers['link']}
|
47
|
-
|
48
|
-
response.headers['link']&.each do |link|
|
49
|
-
if match = link.match(PRELOAD)
|
50
|
-
request.push(match[:path])
|
51
|
-
end
|
41
|
+
Async.logger.warn(@request) {"Unsure how to handle early hints header: #{key}"}
|
52
42
|
end
|
53
43
|
end
|
54
|
-
|
55
|
-
return response
|
56
44
|
end
|
57
45
|
end
|
58
46
|
end
|
data/lib/falcon/adapters/rack.rb
CHANGED
@@ -22,6 +22,7 @@ require 'rack'
|
|
22
22
|
|
23
23
|
require_relative 'input'
|
24
24
|
require_relative 'response'
|
25
|
+
require_relative 'early_hints'
|
25
26
|
|
26
27
|
require 'async/logger'
|
27
28
|
|
@@ -161,11 +162,7 @@ module Falcon
|
|
161
162
|
self.unwrap_request(request, env)
|
162
163
|
|
163
164
|
if request.push?
|
164
|
-
env[RACK_EARLY_HINTS] =
|
165
|
-
Falcon::Adapters::Push.early_hints(headers) do |path|
|
166
|
-
request.push(path)
|
167
|
-
end
|
168
|
-
end
|
165
|
+
env[RACK_EARLY_HINTS] = EarlyHints.new(request)
|
169
166
|
end
|
170
167
|
|
171
168
|
if request.hijack?
|
data/lib/falcon/server.rb
CHANGED
data/lib/falcon/version.rb
CHANGED
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.
|
4
|
+
version: 0.24.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: 2019-02-
|
11
|
+
date: 2019-02-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: http-protocol
|
@@ -239,6 +239,10 @@ files:
|
|
239
239
|
- examples/beer/config.ru
|
240
240
|
- examples/benchmark/config.ru
|
241
241
|
- examples/hello/config.ru
|
242
|
+
- examples/push/config.ru
|
243
|
+
- examples/push/index.html
|
244
|
+
- examples/push/script.js
|
245
|
+
- examples/push/style.css
|
242
246
|
- examples/redis/Gemfile
|
243
247
|
- examples/redis/config.ru
|
244
248
|
- examples/sinatra/Gemfile
|
@@ -248,9 +252,9 @@ files:
|
|
248
252
|
- gems/rack1.gemfile
|
249
253
|
- gems/rack3.gemfile
|
250
254
|
- lib/falcon.rb
|
255
|
+
- lib/falcon/adapters/early_hints.rb
|
251
256
|
- lib/falcon/adapters/input.rb
|
252
257
|
- lib/falcon/adapters/output.rb
|
253
|
-
- lib/falcon/adapters/push.rb
|
254
258
|
- lib/falcon/adapters/rack.rb
|
255
259
|
- lib/falcon/adapters/response.rb
|
256
260
|
- lib/falcon/adapters/rewindable.rb
|