httpimagestore 1.8.1 → 1.9.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.
Files changed (64) hide show
  1. checksums.yaml +15 -0
  2. data/Gemfile +7 -7
  3. data/Gemfile.lock +20 -20
  4. data/README.md +165 -37
  5. data/Rakefile +7 -2
  6. data/VERSION +1 -1
  7. data/bin/httpimagestore +74 -41
  8. data/lib/httpimagestore/configuration/file.rb +20 -11
  9. data/lib/httpimagestore/configuration/handler.rb +96 -257
  10. data/lib/httpimagestore/configuration/handler/source_store_base.rb +37 -0
  11. data/lib/httpimagestore/configuration/handler/statement.rb +114 -0
  12. data/lib/httpimagestore/configuration/identify.rb +17 -9
  13. data/lib/httpimagestore/configuration/output.rb +33 -61
  14. data/lib/httpimagestore/configuration/path.rb +2 -2
  15. data/lib/httpimagestore/configuration/request_state.rb +131 -0
  16. data/lib/httpimagestore/configuration/s3.rb +41 -29
  17. data/lib/httpimagestore/configuration/thumbnailer.rb +189 -96
  18. data/lib/httpimagestore/configuration/validate_hmac.rb +170 -0
  19. data/lib/httpimagestore/error_reporter.rb +6 -1
  20. data/lib/httpimagestore/ruby_string_template.rb +10 -19
  21. metadata +40 -102
  22. data/.rspec +0 -1
  23. data/features/cache-control.feature +0 -41
  24. data/features/compatibility.feature +0 -165
  25. data/features/data-uri.feature +0 -55
  26. data/features/encoding.feature +0 -103
  27. data/features/error-reporting.feature +0 -281
  28. data/features/flexi.feature +0 -259
  29. data/features/health-check.feature +0 -29
  30. data/features/request-matching.feature +0 -211
  31. data/features/rewrite.feature +0 -122
  32. data/features/s3-store-and-thumbnail.feature +0 -82
  33. data/features/source-failover.feature +0 -71
  34. data/features/step_definitions/httpimagestore_steps.rb +0 -203
  35. data/features/storage.feature +0 -198
  36. data/features/support/env.rb +0 -116
  37. data/features/support/test-large.jpg +0 -0
  38. data/features/support/test.empty +0 -0
  39. data/features/support/test.jpg +0 -0
  40. data/features/support/test.png +0 -0
  41. data/features/support/test.txt +0 -1
  42. data/features/support/tiny.png +0 -0
  43. data/features/xid-forwarding.feature +0 -49
  44. data/httpimagestore.gemspec +0 -145
  45. data/load_test/load_test.1k.23a022f6e.m1.small-comp.csv +0 -3
  46. data/load_test/load_test.1k.ec9bde794.m1.small.csv +0 -4
  47. data/load_test/load_test.jmx +0 -317
  48. data/load_test/thumbnail_specs.csv +0 -11
  49. data/load_test/thumbnail_specs_v2.csv +0 -10
  50. data/spec/configuration_file_spec.rb +0 -333
  51. data/spec/configuration_handler_spec.rb +0 -255
  52. data/spec/configuration_identify_spec.rb +0 -67
  53. data/spec/configuration_output_spec.rb +0 -821
  54. data/spec/configuration_path_spec.rb +0 -138
  55. data/spec/configuration_s3_spec.rb +0 -911
  56. data/spec/configuration_source_failover_spec.rb +0 -101
  57. data/spec/configuration_spec.rb +0 -90
  58. data/spec/configuration_thumbnailer_spec.rb +0 -483
  59. data/spec/ruby_string_template_spec.rb +0 -61
  60. data/spec/spec_helper.rb +0 -89
  61. data/spec/support/compute.jpg +0 -0
  62. data/spec/support/cuba_response_env.rb +0 -40
  63. data/spec/support/full.cfg +0 -183
  64. data/spec/support/utf_string.txt +0 -1
@@ -1,259 +0,0 @@
1
- Feature: Flexible API with two storage options and Facebook like thumbnailing URL format
2
- Features two storage approaches: with JPEG conversion and limiting in size - for user provided content - and storing as is.
3
- POST requests will end up with server side generated storage key based on input data digest.
4
- PUT requests can be used to store image under provided storage key.
5
- Thumbnail GET API is similar to described in https://developers.facebook.com/docs/reference/api/using-pictures/#sizes.
6
- Stored object extension and content type is determined from image data.
7
-
8
- Background:
9
- Given S3 settings in AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY and AWS_S3_TEST_BUCKET environment variables
10
- Given httpthumbnailer server is running at http://localhost:3100/health_check
11
- Given httpimagestore server is running at http://localhost:3000/health_check with the following configuration
12
- """
13
- s3 key="@AWS_ACCESS_KEY_ID@" secret="@AWS_SECRET_ACCESS_KEY@" ssl=false
14
-
15
- path "hash" "#{input_digest}.#{image_mime_extension}"
16
- path "path" "#{path}"
17
-
18
- ## User uploaded content - always JPEG converted, not bigger than 2160x2160 and in hight quality compression
19
- post "pictures" {
20
- thumbnail "input" "original" operation="limit" width=2160 height=2160 format="jpeg" quality=95
21
- store_s3 "original" bucket="@AWS_S3_TEST_BUCKET@" path="hash"
22
- output_store_path "original"
23
- }
24
-
25
- put "pictures" {
26
- thumbnail "input" "original" operation="limit" width=2160 height=2160 format="jpeg" quality=95
27
- store_s3 "original" bucket="@AWS_S3_TEST_BUCKET@" path="path"
28
- output_store_path "original"
29
- }
30
-
31
- ## Uploaded by us for use on the website - whatever we send
32
- post "images" {
33
- identify "input"
34
- store_s3 "input" bucket="@AWS_S3_TEST_BUCKET@" path="hash"
35
- output_store_path "input"
36
- }
37
-
38
- put "images" {
39
- identify "input"
40
- store_s3 "input" bucket="@AWS_S3_TEST_BUCKET@" path="path"
41
- output_store_path "input"
42
- }
43
-
44
- ## Thumbailing - keep input format; default JPEG quality is 85
45
- get "pictures" "&:width" "&:height" "&:operation?crop" "&:background-color?white" {
46
- source_s3 "original" bucket="@AWS_S3_TEST_BUCKET@" path="path"
47
- thumbnail "original" "thumbnail" operation="#{operation}" width="#{width}" height="#{height}" options="background-color:#{background-color}"
48
- output_image "thumbnail" cache-control="public, max-age=31557600, s-maxage=0"
49
- }
50
-
51
- get "pictures" "&:width" "&:height?1080" "&:operation?fit" "&:background-color?white" {
52
- source_s3 "original" bucket="@AWS_S3_TEST_BUCKET@" path="path"
53
- thumbnail "original" "thumbnail" operation="#{operation}" width="#{width}" height="#{height}" options="background-color:#{background-color}"
54
- output_image "thumbnail" cache-control="public, max-age=31557600, s-maxage=0"
55
- }
56
-
57
- get "pictures" "&:height" "&:width?1080" "&:operation?fit" "&:background-color?white" {
58
- source_s3 "original" bucket="@AWS_S3_TEST_BUCKET@" path="path"
59
- thumbnail "original" "thumbnail" operation="#{operation}" width="#{width}" height="#{height}" options="background-color:#{background-color}"
60
- output_image "thumbnail" cache-control="public, max-age=31557600, s-maxage=0"
61
- }
62
-
63
- get "pictures" "&type=square" {
64
- source_s3 "original" bucket="@AWS_S3_TEST_BUCKET@" path="path"
65
- thumbnail "original" "thumbnail" operation="crop" width="50" height="50"
66
- output_image "thumbnail" cache-control="public, max-age=31557600, s-maxage=0"
67
- }
68
-
69
- get "pictures" "&type=small" {
70
- source_s3 "original" bucket="@AWS_S3_TEST_BUCKET@" path="path"
71
- thumbnail "original" "thumbnail" operation="fit" width="50" height="2000"
72
- output_image "thumbnail" cache-control="public, max-age=31557600, s-maxage=0"
73
- }
74
-
75
- get "pictures" "&type=normall" {
76
- source_s3 "original" bucket="@AWS_S3_TEST_BUCKET@" path="path"
77
- thumbnail "original" "thumbnail" operation="fit" width="100" height="2000"
78
- output_image "thumbnail" cache-control="public, max-age=31557600, s-maxage=0"
79
- }
80
-
81
- get "pictures" "&type=large" {
82
- source_s3 "original" bucket="@AWS_S3_TEST_BUCKET@" path="path"
83
- thumbnail "original" "thumbnail" operation="fit" width="200" height="2000"
84
- output_image "thumbnail" cache-control="public, max-age=31557600, s-maxage=0"
85
- }
86
-
87
- ## By default serve original image
88
- get "pictures" {
89
- source_s3 "original" bucket="@AWS_S3_TEST_BUCKET@" path="path"
90
- output_image "original" cache-control="public, max-age=31557600, s-maxage=0"
91
- }
92
- """
93
-
94
- @flexi @pictures @post
95
- Scenario: Posting picture to S3 bucket will store it under input data digest, limit to 2160x1260 and converted to JPEG
96
- Given there is no 625d51a1820b607f.jpg file in S3 bucket
97
- Given test-large.jpg file content as request body
98
- When I do POST request http://localhost:3000/pictures
99
- Then response status will be 200
100
- And response content type will be text/plain
101
- And response body will be CRLF ended lines
102
- """
103
- 625d51a1820b607f.jpg
104
- """
105
- Then S3 object 625d51a1820b607f.jpg will contain JPEG image of size 1529x2160
106
- Then S3 object 625d51a1820b607f.jpg content type will be image/jpeg
107
- When I do GET request http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/625d51a1820b607f.jpg
108
- Then response status will be 403
109
- Given there is no b0fe25319ba5909a.jpg file in S3 bucket
110
- Given test.png file content as request body
111
- When I do POST request http://localhost:3000/pictures
112
- Then response status will be 200
113
- And response content type will be text/plain
114
- And response body will be CRLF ended lines
115
- """
116
- b0fe25319ba5909a.jpg
117
- """
118
- Then S3 object b0fe25319ba5909a.jpg will contain JPEG image of size 509x719
119
- Then S3 object b0fe25319ba5909a.jpg content type will be image/jpeg
120
- When I do GET request http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/b0fe25319ba5909a.jpg
121
- Then response status will be 403
122
-
123
- @flexi @pictures @put
124
- Scenario: Putting picture to S3 bucket will store it under provided path, limit it to 2160x1260 and converted to JPEG
125
- Given there is no hello/world file in S3 bucket
126
- Given test-large.jpg file content as request body
127
- When I do PUT request http://localhost:3000/pictures/hello/world
128
- Then response status will be 200
129
- And response content type will be text/plain
130
- And response body will be CRLF ended lines
131
- """
132
- hello/world
133
- """
134
- Then S3 object hello/world will contain JPEG image of size 1529x2160
135
- Then S3 object hello/world content type will be image/jpeg
136
- When I do GET request http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/hello/world
137
- Then response status will be 403
138
- Given test.png file content as request body
139
- When I do PUT request http://localhost:3000/pictures/hello/world
140
- Then response status will be 200
141
- And response content type will be text/plain
142
- And response body will be CRLF ended lines
143
- """
144
- hello/world
145
- """
146
- Then S3 object hello/world will contain JPEG image of size 509x719
147
- Then S3 object hello/world content type will be image/jpeg
148
- When I do GET request http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/hello/world
149
- Then response status will be 403
150
-
151
- @flexi @images @post
152
- Scenario: Posting picture to S3 bucket will store it under first input data digest
153
- Given there is no b0fe25319ba5909a.png file in S3 bucket
154
- Given test.png file content as request body
155
- When I do POST request http://localhost:3000/images
156
- Then response status will be 200
157
- And response content type will be text/plain
158
- And response body will be CRLF ended lines
159
- """
160
- b0fe25319ba5909a.png
161
- """
162
- Then S3 object b0fe25319ba5909a.png will contain PNG image of size 509x719
163
- Then S3 object b0fe25319ba5909a.png content type will be image/png
164
- When I do GET request http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/b0fe25319ba5909a.png
165
- Then response status will be 403
166
-
167
- @flexi @images @put
168
- Scenario: Putting picture to S3 bucket will store it under provided path
169
- Given there is no hello/world file in S3 bucket
170
- Given test.png file content as request body
171
- When I do PUT request http://localhost:3000/images/hello/world
172
- Then response status will be 200
173
- And response content type will be text/plain
174
- And response body will be CRLF ended lines
175
- """
176
- hello/world
177
- """
178
- Then S3 object hello/world will contain PNG image of size 509x719
179
- Then S3 object hello/world content type will be image/png
180
- When I do GET request http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/hello/world
181
- Then response status will be 403
182
-
183
- @flexi @default
184
- Scenario: Getting stored image when no query string param is present
185
- Given test.png file content as request body
186
- When I do PUT request http://localhost:3000/images/test.png
187
- And I do GET request http://localhost:3000/pictures/test.png
188
- Then response status will be 200
189
- And response content type will be image/png
190
- Then response body will contain PNG image of size 509x719
191
- Given test.jpg file content as request body
192
- When I do PUT request http://localhost:3000/images/test.jpg
193
- And I do GET request http://localhost:3000/pictures/test.jpg
194
- Then response status will be 200
195
- And response content type will be image/jpeg
196
- Then response body will contain JPEG image of size 509x719
197
-
198
- @flexi @type
199
- Scenario: Getting square type tumbnail
200
- Given test.png file content as request body
201
- When I do PUT request http://localhost:3000/images/test.png
202
- And I do GET request http://localhost:3000/pictures/test.png?type=square
203
- Then response status will be 200
204
- And response content type will be image/png
205
- Then response body will contain PNG image of size 50x50
206
-
207
- @flexi @type
208
- Scenario: Getting small type tumbnail
209
- Given test.png file content as request body
210
- When I do PUT request http://localhost:3000/images/test.png
211
- And I do GET request http://localhost:3000/pictures/test.png?type=small
212
- Then response status will be 200
213
- And response content type will be image/png
214
- Then response body will contain PNG image of size 50x71
215
-
216
- @flexi @type
217
- Scenario: Getting normall type tumbnail
218
- Given test.png file content as request body
219
- When I do PUT request http://localhost:3000/images/test.png
220
- And I do GET request http://localhost:3000/pictures/test.png?type=normall
221
- Then response status will be 200
222
- And response content type will be image/png
223
- Then response body will contain PNG image of size 100x141
224
-
225
- @flexi @type
226
- Scenario: Getting large type tumbnail
227
- Given test.png file content as request body
228
- When I do PUT request http://localhost:3000/images/test.png
229
- And I do GET request http://localhost:3000/pictures/test.png?type=large
230
- Then response status will be 200
231
- And response content type will be image/png
232
- Then response body will contain PNG image of size 200x283
233
-
234
- @flexi @size
235
- Scenario: Getting custom size tumbnail
236
- Given test.png file content as request body
237
- When I do PUT request http://localhost:3000/images/test.png
238
- And I do GET request http://localhost:3000/pictures/test.png?width=123&height=321
239
- Then response status will be 200
240
- And response content type will be image/png
241
- Then response body will contain PNG image of size 123x321
242
-
243
- @flexi @size
244
- Scenario: Getting custom size tumbnail without height
245
- Given test.png file content as request body
246
- When I do PUT request http://localhost:3000/images/test.png
247
- And I do GET request http://localhost:3000/pictures/test.png?width=123
248
- Then response status will be 200
249
- And response content type will be image/png
250
- Then response body will contain PNG image of size 123x174
251
-
252
- @flexi @size
253
- Scenario: Getting custom size tumbnail without width
254
- Given test.png file content as request body
255
- When I do PUT request http://localhost:3000/images/test.png
256
- And I do GET request http://localhost:3000/pictures/test.png?height=321
257
- Then response status will be 200
258
- And response content type will be image/png
259
- Then response body will contain PNG image of size 227x321
@@ -1,29 +0,0 @@
1
- Feature: Health check URL
2
- Server can be tested with GET request to '/health_check'.
3
-
4
- Background:
5
- Given httpimagestore server is running at http://localhost:3000/ with the following configuration
6
- """
7
- """
8
-
9
- @health-check
10
- Scenario: Passing health check when thumbnailer is running
11
- Given httpthumbnailer server is running at http://localhost:3100/
12
- When I do GET request http://localhost:3000/health_check
13
- Then response status will be 200
14
- And response content type will be text/plain
15
- And response body will be CRLF ended lines
16
- """
17
- HTTP Image Store OK
18
- """
19
-
20
- @health-check
21
- Scenario: Failing health check when thumbnailer is not running
22
- Given httpthumbnailer server is not running
23
- When I do GET request http://localhost:3000/health_check
24
- Then response status will be 502
25
- And response content type will be text/plain
26
- And response body will be CRLF ended lines
27
- """
28
- Connection refused - connect(2) (http://localhost:3100)
29
- """
@@ -1,211 +0,0 @@
1
- Feature: Request matching
2
- Incoming requests needs to be matched in flexible way and appropriate data needs to be available in form of variables used to parametrize processing.
3
-
4
- Background:
5
- Given httpthumbnailer server is running at http://localhost:3100/health_check
6
- Given httpimagestore server is running at http://localhost:3000/health_check with the following configuration
7
- """
8
- # URI segment matchers
9
- get "string" {
10
- output_text "path: '#{path}'"
11
- }
12
-
13
- get "any" "default" ":test1" ":test2?foo" ":test3?bar" ":test4?baz" {
14
- output_text "test1: '#{test1}' test2: '#{test2}' test3: '#{test3}' test4: '#{test4}' path: '#{path}'"
15
- }
16
- get "any" ":test1" ":test2" {
17
- output_text "test1: '#{test1}' test2: '#{test2}' path: '#{path}'"
18
- }
19
-
20
- get "regexp1" ":test1/a.c/" ":test2/.*/" {
21
- output_text "test1: '#{test1}' test2: '#{test2}' path: '#{path}'"
22
- }
23
- get "regexp-404" ":test1/a.c.*/" ":test2/\\./" {
24
- output_text "test1: '#{test1}' test2: '#{test2}' path: '#{path}'"
25
- }
26
-
27
- get "regexp" "named" "/(?<test1>..)-(?<test2>..)/" ":test3/.*/" {
28
- output_text "test1: '#{test1}' test2: '#{test2}' test3: '#{test3}' path: '#{path}'"
29
- }
30
- get "regexp" "named" "nocapture" "/..-../" {
31
- output_text "path: '#{path}'"
32
- }
33
- get "regexp" "named" "bad1" "/(?<test1>..)-(?<test1>..)/" ":test3/.*/" {
34
- output_text "test1: '#{test1}' test2: '#{test2}' test3: '#{test3}' path: '#{path}'"
35
- }
36
- get "regexp" "named" "bad2" "/(?<test1>..)-(?<test1>..)/" ":test3/.*/" {
37
- output_text "test1: '#{test1}' test3: '#{test3}' path: '#{path}'"
38
- }
39
-
40
- # Query string matchers
41
- get "query" "key-value" "&hello=world" {
42
- output_text "query key-value matched path: '#{path}'"
43
- }
44
-
45
- get "query" "key" "default" "&:hello?abc" {
46
- output_text "key: '#{hello}' path: '#{path}'"
47
- }
48
- get "query" "key" "&:hello" {
49
- output_text "key: '#{hello}' path: '#{path}'"
50
- }
51
- get "query" "options" {
52
- output_text "query_string_options: '#{query_string_options}' path: '#{path}'"
53
- }
54
- """
55
-
56
- @request-matching @string
57
- Scenario: Matching URI segment with strings
58
- When I do GET request http://localhost:3000/string/hello/world
59
- Then response status will be 200
60
- And response content type will be text/plain
61
- And response body will be CRLF ended lines
62
- """
63
- path: 'hello/world'
64
- """
65
-
66
- @request-matching @capture-any
67
- Scenario: Capturing any URI segment
68
- When I do GET request http://localhost:3000/any/foo/bar/hello/world
69
- Then response status will be 200
70
- And response content type will be text/plain
71
- And response body will be CRLF ended lines
72
- """
73
- test1: 'foo' test2: 'bar' path: 'hello/world'
74
- """
75
-
76
- @request-matching @capture-any-default
77
- Scenario: Capturing any URI segment with default value
78
- When I do GET request http://localhost:3000/any/default/foo/bar
79
- Then response status will be 200
80
- And response content type will be text/plain
81
- And response body will be CRLF ended lines
82
- """
83
- test1: 'foo' test2: 'bar' test3: 'bar' test4: 'baz' path: ''
84
- """
85
-
86
- @request-matching @capture-regexp
87
- Scenario: Capturing URI segment with regexp match
88
- When I do GET request http://localhost:3000/regexp1/abc/foobar/hello/world
89
- Then response status will be 200
90
- And response content type will be text/plain
91
- And response body will be CRLF ended lines
92
- """
93
- test1: 'abc' test2: 'foobar/hello/world' path: ''
94
- """
95
- When I do GET request http://localhost:3000/regexp2/abc/foobar/hello/world
96
- Then response status will be 404
97
-
98
- @request-matching @capture-named-regexp
99
- Scenario: Capturing URI segment with named regexp match
100
- When I do GET request http://localhost:3000/regexp/named/ab-12/hello/world
101
- Then response status will be 200
102
- And response content type will be text/plain
103
- And response body will be CRLF ended lines
104
- """
105
- test1: 'ab' test2: '12' test3: 'hello/world' path: ''
106
- """
107
- When I do GET request http://localhost:3000/regexp/named/nocapture/ab-12/hello/world
108
- Then response status will be 200
109
- And response content type will be text/plain
110
- And response body will be CRLF ended lines
111
- """
112
- path: 'hello/world'
113
- """
114
- When I do GET request http://localhost:3000/regexp/named/ab-12
115
- Then response status will be 404
116
- When I do GET request http://localhost:3000/regexp/named/ab-123/hello/world
117
- Then response status will be 404
118
- When I do GET request http://localhost:3000/regexp/named/bad1/ab-12/hello/world
119
- Then response status will be 500
120
- When I do GET request http://localhost:3000/regexp/named/bad2/ab-12/hello/world
121
- Then response status will be 500
122
- And response body will be CRLF ended lines
123
- """
124
- matched more arguments than named (3 for 2)
125
- """
126
-
127
- @request-matching @query-key-value
128
- Scenario: Capturing URI by presence of given key-value query string pair
129
- When I do GET request http://localhost:3000/query/key-value/hello/world?hello=world
130
- Then response status will be 200
131
- And response content type will be text/plain
132
- And response body will be CRLF ended lines
133
- """
134
- query key-value matched path: 'hello/world'
135
- """
136
- When I do GET request http://localhost:3000/query/key-value/hello/world?foo=bar&hello=world&bar=baz
137
- Then response status will be 200
138
- And response content type will be text/plain
139
- And response body will be CRLF ended lines
140
- """
141
- query key-value matched path: 'hello/world'
142
- """
143
- When I do GET request http://localhost:3000/query/key-value/hello/world
144
- Then response status will be 404
145
- When I do GET request http://localhost:3000/query/key-value/hello/world?hello=Xorld
146
- Then response status will be 404
147
- When I do GET request http://localhost:3000/query/key-value/hello/world?heXlo=world
148
- Then response status will be 404
149
-
150
- @request-matching @query-key
151
- Scenario: Capturing URI by query string key presence
152
- When I do GET request http://localhost:3000/query/key/hello/world?hello=world
153
- Then response status will be 200
154
- And response content type will be text/plain
155
- And response body will be CRLF ended lines
156
- """
157
- key: 'world' path: 'hello/world'
158
- """
159
- When I do GET request http://localhost:3000/query/key/hello/world?foo=bar&hello=foobar&bar=baz
160
- Then response status will be 200
161
- And response content type will be text/plain
162
- And response body will be CRLF ended lines
163
- """
164
- key: 'foobar' path: 'hello/world'
165
- """
166
- When I do GET request http://localhost:3000/query/key/hello/world
167
- Then response status will be 404
168
- When I do GET request http://localhost:3000/query/key/hello/world?heXlo=world
169
- Then response status will be 404
170
-
171
- @request-matching @query-key-default
172
- Scenario: Capturing URI by query string key presence
173
- When I do GET request http://localhost:3000/query/key/default/hello/world?hello=world
174
- Then response status will be 200
175
- And response content type will be text/plain
176
- And response body will be CRLF ended lines
177
- """
178
- key: 'world' path: 'hello/world'
179
- """
180
- When I do GET request http://localhost:3000/query/key/default/hello/world?foo=bar&hello=foobar&bar=baz
181
- Then response status will be 200
182
- And response content type will be text/plain
183
- And response body will be CRLF ended lines
184
- """
185
- key: 'foobar' path: 'hello/world'
186
- """
187
- When I do GET request http://localhost:3000/query/key/default/hello/world
188
- Then response status will be 200
189
- And response content type will be text/plain
190
- And response body will be CRLF ended lines
191
- """
192
- key: 'abc' path: 'hello/world'
193
- """
194
- When I do GET request http://localhost:3000/query/key/default/hello/world?heXlo=world
195
- Then response status will be 200
196
- And response content type will be text/plain
197
- And response body will be CRLF ended lines
198
- """
199
- key: 'abc' path: 'hello/world'
200
- """
201
-
202
- @request-matching @query-string-options
203
- Scenario: URI query string key-value pairs should always be available as query_string_options variable
204
- When I do GET request http://localhost:3000/query/options/hello/world?foo=hello&bar=world
205
- Then response status will be 200
206
- And response content type will be text/plain
207
- And response body will be CRLF ended lines
208
- """
209
- query_string_options: 'bar:world,foo:hello' path: 'hello/world'
210
- """
211
-