serverless-rack 1.0.0 → 1.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: 0e289b85392f4e213d35b038b1fdb7799465808977279b3c851d15e3f38a31cf
4
- data.tar.gz: 5cfa5111685c7d22109325c0bbb6539aadcae750c7ea2407cd62285619a73544
3
+ metadata.gz: 9e2ee06d74ace889ea61ad77a3c208075d81822482bed898d298bca6da2814d6
4
+ data.tar.gz: f8e09735728d88f2dec09c3ae0fd934569120d51dc5c5e082223e2bce7aae32c
5
5
  SHA512:
6
- metadata.gz: 9c906ef876675f6df4bae686f50623bdb31769122e8ce36b82110c9eb92baab10c9a48308bfa7f9c2a8a7b3e27b2a4b531e95618f6898002a496666c7d9a98c6
7
- data.tar.gz: 88c461157b7449c9fd4e974767d452e10059b87805916aed60392cd421b7745865d1dec7e23e0a1c645dd03b190a976ac09a2d913fdb29bc156c9c05ed1c5301
6
+ metadata.gz: da480222e126f675db95a97930f4b74b04553c2471d262d454db69121b5ffb76ea56d0c8b5bb5822b5ceb8d7c54fc106139de7c552cede33094c28f170eb8fd0
7
+ data.tar.gz: 2d75c999716059e286376c8998663223d7eb4f834f195692bdf3609bd00499f15e4f24dee8b4d085efe4d33b08fffa0a4c91026c7c98addd3e2793088d57b1a7
data/CHANGELOG.md CHANGED
@@ -1,7 +1,13 @@
1
+ # 1.0.1
2
+
3
+ - Support additional bundler arguments to be passed when using docker (#2)
4
+ - Support multi-value query string parameters
5
+ - Support multi-value headers in request and response
6
+
1
7
  # 1.0.0
2
8
 
3
- Feature parity with `serverless-wsgi`.
9
+ - Feature parity with `serverless-wsgi`.
4
10
 
5
11
  # 0.0.1
6
12
 
7
- Initial release.
13
+ - Initial release.
data/README.md CHANGED
@@ -327,7 +327,7 @@ from the browser is usually the preferred approach.
327
327
  ### Raw context and event
328
328
 
329
329
  The raw context and event from AWS Lambda are both accessible through the Rack
330
- request. The following example shows how to access them when using Flask:
330
+ request. The following example shows how to access them when using Sinatra:
331
331
 
332
332
  ```ruby
333
333
  require 'sinatra'
@@ -41,6 +41,14 @@ def parse_path_info(event)
41
41
  event['path']
42
42
  end
43
43
 
44
+ def parse_query_string(event)
45
+ if event.include? 'multiValueQueryStringParameters'
46
+ Rack::Utils.build_query(event['multiValueQueryStringParameters'] || {})
47
+ else
48
+ Rack::Utils.build_query(event['queryStringParameters'] || {})
49
+ end
50
+ end
51
+
44
52
  def parse_body(event)
45
53
  if event['isBase64Encoded']
46
54
  Base64.decode64(event['body'])
@@ -49,6 +57,16 @@ def parse_body(event)
49
57
  end
50
58
  end
51
59
 
60
+ def parse_headers(event)
61
+ if event.include? 'multiValueHeaders'
62
+ Rack::Utils::HeaderHash.new((event['multiValueHeaders'] || {}).map do |key, value|
63
+ [key, value.join("\n")]
64
+ end.to_h)
65
+ else
66
+ Rack::Utils::HeaderHash.new(event['headers'] || {})
67
+ end
68
+ end
69
+
52
70
  def parse_http_headers(headers)
53
71
  headers = headers.map do |key, value|
54
72
  ["HTTP_#{key.upcase.tr('-', '_')}", value]
@@ -66,7 +84,7 @@ def build_environ(event:, context:, headers:, body:)
66
84
  'REQUEST_METHOD' => event['httpMethod'],
67
85
  'SCRIPT_NAME' => parse_script_name(event, headers),
68
86
  'PATH_INFO' => parse_path_info(event),
69
- 'QUERY_STRING' => Rack::Utils.build_query(event['queryStringParameters'] || {}),
87
+ 'QUERY_STRING' => parse_query_string(event),
70
88
  'SERVER_NAME' => headers['Host'] || 'lambda',
71
89
  'SERVER_PORT' => headers['X-Forwarded-Port'] || '80',
72
90
  'CONTENT_LENGTH' => body.bytesize.to_s,
@@ -146,7 +164,7 @@ def all_casings(input_string)
146
164
  end
147
165
  end
148
166
 
149
- def format_headers(headers:)
167
+ def format_split_headers(headers:)
150
168
  headers = headers.to_hash
151
169
 
152
170
  # If there are headers multiple occurrences, e.g. Set-Cookie, create
@@ -168,12 +186,20 @@ def format_headers(headers:)
168
186
  { 'headers' => headers }
169
187
  end
170
188
 
189
+ def format_grouped_headers(headers:)
190
+ { 'multiValueHeaders' => headers.map do |key, value|
191
+ [key, value.split("\n")]
192
+ end.to_h }
193
+ end
194
+
171
195
  def format_response(event:, status:, headers:, body:, text_mime_types:)
172
196
  response = { 'statusCode' => status }
173
197
 
174
- response.merge!(
175
- format_headers(headers: headers)
176
- )
198
+ if event.include? 'multiValueHeaders'
199
+ response.merge!(format_grouped_headers(headers: headers))
200
+ else
201
+ response.merge!(format_split_headers(headers: headers))
202
+ end
177
203
 
178
204
  response.merge!(
179
205
  format_status_description(event: event, status: status)
@@ -197,7 +223,7 @@ def handle_request(app:, event:, context:, config: {})
197
223
  build_environ(
198
224
  event: event,
199
225
  context: context,
200
- headers: Rack::Utils::HeaderHash.new(event['headers'] || {}),
226
+ headers: parse_headers(event),
201
227
  body: parse_body(event)
202
228
  )
203
229
  )
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'serverless-rack'
3
- s.version = '1.0.0'
3
+ s.version = '1.0.1'
4
4
  s.summary =
5
5
  'Serverless plugin to deploy Ruby Rack applications (Sinatra/Padrino/Cuba etc.) '\
6
6
  'and bundle gems'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: serverless-rack
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Logan Raarup
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-01-04 00:00:00.000000000 Z
11
+ date: 2019-03-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack