serverless-rack 1.0.8 → 2.0.1

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: 608b6797822f34511d85d16879a2162849824d8fecd9be3b58d3cf6edf6fe2f0
4
- data.tar.gz: e2a981df1ac80fc775cf379405f84158a3f5b409b71db9459abeede0b7b0a75c
3
+ metadata.gz: be489aaf76e07b06fe136a1bd37c0786224c219d0575ec483c4e8ccc89a4c0de
4
+ data.tar.gz: 74b96b86ce73ba7d5956f34e51d5f9a246b54958ed562c2c267bab1ad67a5f69
5
5
  SHA512:
6
- metadata.gz: f5d701de917f422e78cb9a31e7f2c507ec15cd4bb7b214b20d1d2f099176f2c2ca3e613fbfbc8cb926d2ab8f020c97083383cd7f312d887f94aa3937bdfb7eda
7
- data.tar.gz: 133efab6c97a7e5ef83df340ecd4a7156698fbd5b78fe17736d33c48e55da6e09a2fafd442e5628e3ff2630906fb8db6bf36efd27fb41cafa12b2e3f49e320b7
6
+ metadata.gz: db6bdf6bb1eaa00c898511ff440989de2ec792541e4d76104f671284a1c9a7211aec6ddb217e474dc03bf245f3a44b470b7369c0c93a97cecbca4ce8f2c1b601
7
+ data.tar.gz: '025582f781343b70fdcdc9c3891c9d5be2b44dc9c567b8c78cfc1c5933da52965e921d363332ad425a8e05787c4051c41c1c7e8ef2614df870a93f6b28daad46'
data/CHANGELOG.md CHANGED
@@ -1,3 +1,14 @@
1
+ # 2.0.1
2
+
3
+ - Correctly initialise `Rack::Headers` instance for events containing `multiValueHeaders`
4
+ _Matthew Pickin_
5
+
6
+ # 2.0.0
7
+
8
+ - Add support for Rack v3 (#44)
9
+
10
+ _Lissa Moriarty_, _Matthew Pickin_
11
+
1
12
  # 1.0.8
2
13
 
3
14
  - Add types to command arguments to avoid deprecation warnings (#25)
data/Gemfile CHANGED
@@ -5,8 +5,8 @@ source 'https://rubygems.org'
5
5
  gem 'rack'
6
6
 
7
7
  group :test do
8
- gem 'codecov', require: false
9
8
  gem 'rake'
10
9
  gem 'rspec'
11
10
  gem 'rubocop', require: false
11
+ gem 'simplecov', require: false
12
12
  end
@@ -17,7 +17,9 @@ TEXT_MIME_TYPES = [
17
17
  ].freeze
18
18
 
19
19
  def base_path
20
- "/#{ENV['API_GATEWAY_BASE_PATH']}" unless ENV['API_GATEWAY_BASE_PATH'].to_s.empty?
20
+ return if ENV.fetch('API_GATEWAY_BASE_PATH', '').empty?
21
+
22
+ "/#{ENV.fetch('API_GATEWAY_BASE_PATH')}"
21
23
  end
22
24
 
23
25
  def keepalive_event?(event)
@@ -63,13 +65,13 @@ end
63
65
 
64
66
  def parse_headers(event)
65
67
  if event.include? 'multiValueHeaders'
66
- Rack::Utils::HeaderHash.new(
68
+ Rack::Headers[
67
69
  (event['multiValueHeaders'] || {}).transform_values do |value|
68
70
  value.join("\n")
69
71
  end
70
- )
72
+ ]
71
73
  else
72
- Rack::Utils::HeaderHash.new(event['headers'] || {})
74
+ Rack::Headers[event['headers'] || {}]
73
75
  end
74
76
  end
75
77
 
@@ -130,10 +132,47 @@ def text_mime_type?(headers:, text_mime_types:)
130
132
  false
131
133
  end
132
134
 
135
+ # Class to buffer a streaming response body
136
+ class ResponseInputStream
137
+ attr_reader :buffer
138
+
139
+ def initialize
140
+ @buffer = ''
141
+ end
142
+
143
+ def self.[](streaming_body)
144
+ stream = new
145
+ streaming_body.call(stream)
146
+ stream.buffer
147
+ end
148
+
149
+ def write(chunk)
150
+ @buffer += chunk
151
+ end
152
+
153
+ def <<(chunk)
154
+ write(chunk)
155
+ end
156
+
157
+ def close; end
158
+
159
+ alias read buffer
160
+
161
+ def flush
162
+ @buffer = ''
163
+ end
164
+ end
165
+
133
166
  def format_body(body:, headers:, text_mime_types:)
134
167
  response_data = ''
135
168
  begin
136
- body.each { |part| response_data += part }
169
+ if body.respond_to?(:each)
170
+ body.each { |part| response_data += part }
171
+ elsif body.respond_to?(:to_ary)
172
+ body.to_ary.each { |part| response_data += part }
173
+ elsif body.respond_to?(:call)
174
+ response_data = ResponseInputStream[body]
175
+ end
137
176
  ensure
138
177
  body.close if body.respond_to?(:close)
139
178
  end
@@ -157,6 +196,8 @@ def all_casings(input_string)
157
196
  # Permute all casings of a given string.
158
197
  # A pretty algoritm, via @Amber
159
198
  # http://stackoverflow.com/questions/6792803/finding-all-possible-case-permutations-in-python
199
+ return enum_for(__method__, input_string) unless block_given?
200
+
160
201
  if input_string.empty?
161
202
  yield ''
162
203
  else
@@ -175,32 +216,26 @@ def all_casings(input_string)
175
216
  end
176
217
 
177
218
  def format_split_headers(headers:)
178
- headers = headers.to_hash
179
- keys = headers.keys
219
+ # Rack::Headers will automatically lower-case new keys
220
+ # Use (and return) a regular hash literal instead
221
+ headers_hash = {}
180
222
 
181
223
  # If there are headers multiple occurrences, e.g. Set-Cookie, create
182
224
  # case-mutated variations in order to pass them through APIGW.
183
225
  # This is a hack that's currently needed.
184
- keys.each do |key|
185
- values = headers[key].split("\n")
186
-
187
- next if values.size < 2
188
-
189
- headers.delete(key)
190
-
191
- all_casings(key) do |casing|
192
- headers[casing] = values.shift
193
- break if values.empty?
226
+ headers.each do |key, value|
227
+ if value.is_a?(Array)
228
+ value.zip(all_casings(key)).each { |v, casing| headers_hash[casing] = v }
229
+ else
230
+ headers_hash[key] = value
194
231
  end
195
232
  end
196
233
 
197
- { 'headers' => headers }
234
+ { 'headers' => headers_hash }
198
235
  end
199
236
 
200
237
  def format_grouped_headers(headers:)
201
- { 'multiValueHeaders' => headers.transform_values do |value|
202
- value.split("\n")
203
- end }
238
+ { 'multiValueHeaders' => headers.transform_values { |v| v.is_a?(Array) ? v : [v] } }
204
239
  end
205
240
 
206
241
  def format_response(event:, status:, headers:, body:, text_mime_types:)
@@ -2,13 +2,13 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = 'serverless-rack'
5
- s.version = '1.0.8'
5
+ s.version = '2.0.1'
6
6
  s.summary =
7
- 'Serverless plugin to deploy Ruby Rack applications (Sinatra/Padrino/Cuba etc.) '\
7
+ 'Serverless plugin to deploy Ruby Rack applications (Sinatra/Padrino/Cuba etc.) ' \
8
8
  'and bundle gems'
9
9
  s.description =
10
- 'A Serverless v1.x plugin to build your deploy Ruby Rack applications using '\
11
- 'Serverless. Compatible Rack application frameworks include Sinatra, '\
10
+ 'A Serverless v1.x plugin to build your deploy Ruby Rack applications using ' \
11
+ 'Serverless. Compatible Rack application frameworks include Sinatra, ' \
12
12
  'Cuba and Padrino.'
13
13
  s.authors = ['Logan Raarup']
14
14
  s.email = 'logan@logan.dk'
@@ -24,5 +24,6 @@ Gem::Specification.new do |s|
24
24
  s.license = 'MIT'
25
25
 
26
26
  s.required_ruby_version = '>= 2.4.0'
27
- s.add_dependency 'rack', '~> 2.0'
27
+ s.add_dependency 'rack', '~> 3.0'
28
+ s.metadata['rubygems_mfa_required'] = 'true'
28
29
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: serverless-rack
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.8
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Logan Raarup
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2022-09-27 00:00:00.000000000 Z
10
+ date: 2026-05-01 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: rack
@@ -16,14 +15,14 @@ dependencies:
16
15
  requirements:
17
16
  - - "~>"
18
17
  - !ruby/object:Gem::Version
19
- version: '2.0'
18
+ version: '3.0'
20
19
  type: :runtime
21
20
  prerelease: false
22
21
  version_requirements: !ruby/object:Gem::Requirement
23
22
  requirements:
24
23
  - - "~>"
25
24
  - !ruby/object:Gem::Version
26
- version: '2.0'
25
+ version: '3.0'
27
26
  description: A Serverless v1.x plugin to build your deploy Ruby Rack applications
28
27
  using Serverless. Compatible Rack application frameworks include Sinatra, Cuba and
29
28
  Padrino.
@@ -41,8 +40,8 @@ files:
41
40
  homepage: https://github.com/logandk/serverless-rack
42
41
  licenses:
43
42
  - MIT
44
- metadata: {}
45
- post_install_message:
43
+ metadata:
44
+ rubygems_mfa_required: 'true'
46
45
  rdoc_options: []
47
46
  require_paths:
48
47
  - lib
@@ -57,8 +56,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
57
56
  - !ruby/object:Gem::Version
58
57
  version: '0'
59
58
  requirements: []
60
- rubygems_version: 3.2.32
61
- signing_key:
59
+ rubygems_version: 3.6.6
62
60
  specification_version: 4
63
61
  summary: Serverless plugin to deploy Ruby Rack applications (Sinatra/Padrino/Cuba
64
62
  etc.) and bundle gems