serverless-rack 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
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