isomorfeus-transport 2.1.1 → 2.2.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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 73dc7fdfde8b9fd88f0d5c0771e94089ac870ab439497e941c39a8086461763f
|
4
|
+
data.tar.gz: 4a0f6bc9d44166a1e6362829ac6f2309296e043d7cd57de3c460e1956f964ea7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ccd348bcdcc4ba424d1d3f348a331f36c47d5d95ab7dbc6e0f3b92ec866896395f3fdaa550c6ce9408e89686fc5f09d0109c3824aa9b51de9f1350ce757fb13e
|
7
|
+
data.tar.gz: 95c448f2c43a817f0d7146c4b0c328827601257c37cb503e95909222792f866cfaeb23b3e94bfc507c063d72ce7a0616435d21bae9e5f56b12775a532dce980a
|
@@ -0,0 +1,140 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Isomorfeus
|
4
|
+
module Transport
|
5
|
+
class CompressorRack
|
6
|
+
C_ENCODINGS = %w[br gzip identity].freeze
|
7
|
+
|
8
|
+
def initialize(app, options = {})
|
9
|
+
@app = app
|
10
|
+
end
|
11
|
+
|
12
|
+
def call(env)
|
13
|
+
status, headers, body = @app.call(env)
|
14
|
+
headers = Rack::Utils::HeaderHash[headers]
|
15
|
+
|
16
|
+
|
17
|
+
unless should_deflate?(env, status, headers, body)
|
18
|
+
return [status, headers, body]
|
19
|
+
end
|
20
|
+
|
21
|
+
request = Rack::Request.new(env)
|
22
|
+
|
23
|
+
encoding = Rack::Utils.select_best_encoding(C_ENCODINGS,
|
24
|
+
request.accept_encoding)
|
25
|
+
|
26
|
+
vary = headers["Vary"].to_s.split(",").map(&:strip)
|
27
|
+
unless vary.include?("*") || vary.include?("Accept-Encoding")
|
28
|
+
headers["Vary"] = vary.push("Accept-Encoding").join(",")
|
29
|
+
end
|
30
|
+
|
31
|
+
case encoding
|
32
|
+
when "br"
|
33
|
+
headers['Content-Encoding'] = "br"
|
34
|
+
headers.delete(Rack::CONTENT_LENGTH)
|
35
|
+
[status, headers, BrotliStream.new(body, @sync)]
|
36
|
+
when "gzip"
|
37
|
+
headers['Content-Encoding'] = "gzip"
|
38
|
+
headers.delete(Rack::CONTENT_LENGTH)
|
39
|
+
mtime = headers["Last-Modified"]
|
40
|
+
mtime = Time.httpdate(mtime).to_i if mtime
|
41
|
+
[status, headers, GzipStream.new(body, mtime, @sync)]
|
42
|
+
when "identity"
|
43
|
+
[status, headers, body]
|
44
|
+
when nil
|
45
|
+
message = "An acceptable encoding for the requested resource #{request.fullpath} could not be found."
|
46
|
+
bp = Rack::BodyProxy.new([message]) { body.close if body.respond_to?(:close) }
|
47
|
+
[406, { CONTENT_TYPE => "text/plain", CONTENT_LENGTH => message.length.to_s }, bp]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
class BrotliStream
|
52
|
+
BUFFER_LENGTH = 128 * 1_024
|
53
|
+
|
54
|
+
def initialize(body, sync)
|
55
|
+
@body = body
|
56
|
+
@sync
|
57
|
+
end
|
58
|
+
|
59
|
+
def each(&block)
|
60
|
+
@writer = block
|
61
|
+
brotli = ::Brotli::Writer.new(self, quality: 5)
|
62
|
+
|
63
|
+
if @body.is_a? ::File
|
64
|
+
while part = @body.read(BUFFER_LENGTH)
|
65
|
+
brotli.write(part)
|
66
|
+
brotli.flush if @sync
|
67
|
+
end
|
68
|
+
else
|
69
|
+
@body.each do |part|
|
70
|
+
next if part.empty?
|
71
|
+
brotli.write(part)
|
72
|
+
brotli.flush if @sync
|
73
|
+
end
|
74
|
+
end
|
75
|
+
ensure
|
76
|
+
brotli.close
|
77
|
+
end
|
78
|
+
|
79
|
+
def write(data)
|
80
|
+
@writer.call(data)
|
81
|
+
end
|
82
|
+
|
83
|
+
def close
|
84
|
+
@body.close if @body.respond_to?(:close)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
class GzipStream
|
89
|
+
BUFFER_LENGTH = 128 * 1_024
|
90
|
+
|
91
|
+
def initialize(body, mtime, sync)
|
92
|
+
@body = body
|
93
|
+
@mtime = mtime
|
94
|
+
@sync = sync
|
95
|
+
end
|
96
|
+
|
97
|
+
def each(&block)
|
98
|
+
@writer = block
|
99
|
+
gzip = ::Zlib::GzipWriter.new(self)
|
100
|
+
gzip.mtime = @mtime if @mtime
|
101
|
+
|
102
|
+
if @body.is_a? ::File
|
103
|
+
while part = @body.read(BUFFER_LENGTH)
|
104
|
+
gzip.write(part)
|
105
|
+
gzip.flush if @sync
|
106
|
+
end
|
107
|
+
else
|
108
|
+
@body.each do |part|
|
109
|
+
next if part.empty?
|
110
|
+
gzip.write(part)
|
111
|
+
gzip.flush if @sync
|
112
|
+
end
|
113
|
+
end
|
114
|
+
ensure
|
115
|
+
gzip.close
|
116
|
+
end
|
117
|
+
|
118
|
+
def write(data)
|
119
|
+
@writer.call(data)
|
120
|
+
end
|
121
|
+
|
122
|
+
def close
|
123
|
+
@body.close if @body.respond_to?(:close)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
private
|
128
|
+
|
129
|
+
def should_deflate?(env, status, headers, body)
|
130
|
+
if Rack::Utils::STATUS_WITH_NO_ENTITY_BODY.key?(status.to_i) ||
|
131
|
+
/\bno-transform\b/.match?(headers['Cache-Control'].to_s) ||
|
132
|
+
headers['Content-Encoding']&.!~(/\bidentity\b/)
|
133
|
+
return false
|
134
|
+
end
|
135
|
+
return false if headers[Rack::CONTENT_LENGTH] == '0'
|
136
|
+
true
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
@@ -2,9 +2,9 @@ module Isomorfeus
|
|
2
2
|
module Transport
|
3
3
|
module Middlewares
|
4
4
|
def use_isomorfeus_middlewares
|
5
|
-
puts "Isomorfeus is using the following middlewares:"
|
5
|
+
puts "Isomorfeus is using the following middlewares:" if Isomorfeus.production?
|
6
6
|
Isomorfeus.middlewares.each do |isomorfeus_middleware|
|
7
|
-
puts "#{isomorfeus_middleware}"
|
7
|
+
puts "#{isomorfeus_middleware}" if Isomorfeus.production?
|
8
8
|
use isomorfeus_middleware
|
9
9
|
end
|
10
10
|
end
|
@@ -70,9 +70,14 @@ module Isomorfeus
|
|
70
70
|
result
|
71
71
|
end
|
72
72
|
rescue Exception => e
|
73
|
-
#
|
74
|
-
|
75
|
-
|
73
|
+
e_text = "#{e.class}: #{e.message}\n #{e.backtrace.join("\n")}"
|
74
|
+
STDERR.puts e_text
|
75
|
+
message = if Isomorfeus.production?
|
76
|
+
"<html><head><title>Error</title></head><body>Sorry, a error occured!</body></html>"
|
77
|
+
else
|
78
|
+
"<html><head><title>#{e.class}</title></head><body><pre>#{e_text}</pre></body></html>"
|
79
|
+
end
|
80
|
+
return [500, { Rack::CONTENT_TYPE => "text/html", Rack::CONTENT_LENGTH => message.length.to_s }, [message]]
|
76
81
|
end
|
77
82
|
end
|
78
83
|
end
|
data/lib/isomorfeus-transport.rb
CHANGED
@@ -26,7 +26,14 @@ else
|
|
26
26
|
require 'ostruct'
|
27
27
|
require 'socket'
|
28
28
|
require 'sorted_set'
|
29
|
+
require 'time'
|
30
|
+
require 'brotli'
|
31
|
+
require 'zlib'
|
29
32
|
require 'oj'
|
33
|
+
require 'rack'
|
34
|
+
require 'rack/body_proxy'
|
35
|
+
require 'rack/request'
|
36
|
+
require 'rack/utils'
|
30
37
|
require 'active_support'
|
31
38
|
require 'isomorfeus-asset-manager'
|
32
39
|
require 'isomorfeus-hamster'
|
@@ -44,10 +51,12 @@ else
|
|
44
51
|
require 'isomorfeus/transport/websocket_client'
|
45
52
|
require 'isomorfeus/transport'
|
46
53
|
require 'isomorfeus/transport/rack_middleware'
|
54
|
+
require 'isomorfeus/transport/compressor_rack'
|
47
55
|
require 'isomorfeus/transport/middlewares'
|
48
56
|
|
49
|
-
Isomorfeus.add_middleware(Isomorfeus::Transport::RackMiddleware)
|
50
57
|
Isomorfeus.add_middleware(Isomorfeus::AssetManager::RackMiddleware)
|
58
|
+
Isomorfeus.add_middleware(Isomorfeus::Transport::CompressorRack)
|
59
|
+
Isomorfeus.add_middleware(Isomorfeus::Transport::RackMiddleware)
|
51
60
|
|
52
61
|
require 'lucid_handler/mixin'
|
53
62
|
require 'lucid_handler/base'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: isomorfeus-transport
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jan Biedermann
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-02-
|
11
|
+
date: 2022-02-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 3.1.16
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: brotli
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.4.0
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.4.0
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: isomorfeus-iodine
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,70 +100,98 @@ dependencies:
|
|
86
100
|
requirements:
|
87
101
|
- - "~>"
|
88
102
|
- !ruby/object:Gem::Version
|
89
|
-
version: 0.14.
|
103
|
+
version: 0.14.17
|
90
104
|
type: :runtime
|
91
105
|
prerelease: false
|
92
106
|
version_requirements: !ruby/object:Gem::Requirement
|
93
107
|
requirements:
|
94
108
|
- - "~>"
|
95
109
|
- !ruby/object:Gem::Version
|
96
|
-
version: 0.14.
|
110
|
+
version: 0.14.17
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: isomorfeus-hamster
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
100
114
|
requirements:
|
101
115
|
- - "~>"
|
102
116
|
- !ruby/object:Gem::Version
|
103
|
-
version: 0.6.
|
117
|
+
version: 0.6.6
|
104
118
|
type: :runtime
|
105
119
|
prerelease: false
|
106
120
|
version_requirements: !ruby/object:Gem::Requirement
|
107
121
|
requirements:
|
108
122
|
- - "~>"
|
109
123
|
- !ruby/object:Gem::Version
|
110
|
-
version: 0.6.
|
124
|
+
version: 0.6.6
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: isomorfeus-preact
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
114
128
|
requirements:
|
115
129
|
- - "~>"
|
116
130
|
- !ruby/object:Gem::Version
|
117
|
-
version: 10.6.
|
131
|
+
version: 10.6.40
|
118
132
|
type: :runtime
|
119
133
|
prerelease: false
|
120
134
|
version_requirements: !ruby/object:Gem::Requirement
|
121
135
|
requirements:
|
122
136
|
- - "~>"
|
123
137
|
- !ruby/object:Gem::Version
|
124
|
-
version: 10.6.
|
138
|
+
version: 10.6.40
|
125
139
|
- !ruby/object:Gem::Dependency
|
126
140
|
name: isomorfeus-policy
|
127
141
|
requirement: !ruby/object:Gem::Requirement
|
128
142
|
requirements:
|
129
143
|
- - '='
|
130
144
|
- !ruby/object:Gem::Version
|
131
|
-
version: 2.
|
145
|
+
version: 2.2.0
|
132
146
|
type: :runtime
|
133
147
|
prerelease: false
|
134
148
|
version_requirements: !ruby/object:Gem::Requirement
|
135
149
|
requirements:
|
136
150
|
- - '='
|
137
151
|
- !ruby/object:Gem::Version
|
138
|
-
version: 2.
|
152
|
+
version: 2.2.0
|
139
153
|
- !ruby/object:Gem::Dependency
|
140
154
|
name: isomorfeus-redux
|
141
155
|
requirement: !ruby/object:Gem::Requirement
|
142
156
|
requirements:
|
143
157
|
- - "~>"
|
144
158
|
- !ruby/object:Gem::Version
|
145
|
-
version: 4.1.
|
159
|
+
version: 4.1.18
|
160
|
+
type: :runtime
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - "~>"
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: 4.1.18
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: isomorfeus-speednode
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - "~>"
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: 0.5.2
|
174
|
+
type: :runtime
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - "~>"
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: 0.5.2
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: rack
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - "~>"
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: 2.2.3
|
146
188
|
type: :runtime
|
147
189
|
prerelease: false
|
148
190
|
version_requirements: !ruby/object:Gem::Requirement
|
149
191
|
requirements:
|
150
192
|
- - "~>"
|
151
193
|
- !ruby/object:Gem::Version
|
152
|
-
version:
|
194
|
+
version: 2.2.3
|
153
195
|
- !ruby/object:Gem::Dependency
|
154
196
|
name: sorted_set
|
155
197
|
requirement: !ruby/object:Gem::Requirement
|
@@ -164,20 +206,34 @@ dependencies:
|
|
164
206
|
- - "~>"
|
165
207
|
- !ruby/object:Gem::Version
|
166
208
|
version: 1.0.3
|
209
|
+
- !ruby/object:Gem::Dependency
|
210
|
+
name: zlib
|
211
|
+
requirement: !ruby/object:Gem::Requirement
|
212
|
+
requirements:
|
213
|
+
- - "~>"
|
214
|
+
- !ruby/object:Gem::Version
|
215
|
+
version: 2.1.1
|
216
|
+
type: :runtime
|
217
|
+
prerelease: false
|
218
|
+
version_requirements: !ruby/object:Gem::Requirement
|
219
|
+
requirements:
|
220
|
+
- - "~>"
|
221
|
+
- !ruby/object:Gem::Version
|
222
|
+
version: 2.1.1
|
167
223
|
- !ruby/object:Gem::Dependency
|
168
224
|
name: isomorfeus
|
169
225
|
requirement: !ruby/object:Gem::Requirement
|
170
226
|
requirements:
|
171
227
|
- - '='
|
172
228
|
- !ruby/object:Gem::Version
|
173
|
-
version: 2.
|
229
|
+
version: 2.2.0
|
174
230
|
type: :development
|
175
231
|
prerelease: false
|
176
232
|
version_requirements: !ruby/object:Gem::Requirement
|
177
233
|
requirements:
|
178
234
|
- - '='
|
179
235
|
- !ruby/object:Gem::Version
|
180
|
-
version: 2.
|
236
|
+
version: 2.2.0
|
181
237
|
- !ruby/object:Gem::Dependency
|
182
238
|
name: rake
|
183
239
|
requirement: !ruby/object:Gem::Requirement
|
@@ -198,14 +254,14 @@ dependencies:
|
|
198
254
|
requirements:
|
199
255
|
- - "~>"
|
200
256
|
- !ruby/object:Gem::Version
|
201
|
-
version: 3.
|
257
|
+
version: 3.11.0
|
202
258
|
type: :development
|
203
259
|
prerelease: false
|
204
260
|
version_requirements: !ruby/object:Gem::Requirement
|
205
261
|
requirements:
|
206
262
|
- - "~>"
|
207
263
|
- !ruby/object:Gem::Version
|
208
|
-
version: 3.
|
264
|
+
version: 3.11.0
|
209
265
|
description: Channels, authetication and various transport options for Isomorfeus.
|
210
266
|
email: jan@kursator.de
|
211
267
|
executables: []
|
@@ -217,6 +273,7 @@ files:
|
|
217
273
|
- lib/isomorfeus-transport.rb
|
218
274
|
- lib/isomorfeus/transport.rb
|
219
275
|
- lib/isomorfeus/transport/client_processor.rb
|
276
|
+
- lib/isomorfeus/transport/compressor_rack.rb
|
220
277
|
- lib/isomorfeus/transport/config.rb
|
221
278
|
- lib/isomorfeus/transport/hamster_session_store.rb
|
222
279
|
- lib/isomorfeus/transport/handler/authentication_handler.rb
|