httpimagestore 1.8.1 → 1.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/Gemfile +7 -7
- data/Gemfile.lock +20 -20
- data/README.md +165 -37
- data/Rakefile +7 -2
- data/VERSION +1 -1
- data/bin/httpimagestore +74 -41
- data/lib/httpimagestore/configuration/file.rb +20 -11
- data/lib/httpimagestore/configuration/handler.rb +96 -257
- data/lib/httpimagestore/configuration/handler/source_store_base.rb +37 -0
- data/lib/httpimagestore/configuration/handler/statement.rb +114 -0
- data/lib/httpimagestore/configuration/identify.rb +17 -9
- data/lib/httpimagestore/configuration/output.rb +33 -61
- data/lib/httpimagestore/configuration/path.rb +2 -2
- data/lib/httpimagestore/configuration/request_state.rb +131 -0
- data/lib/httpimagestore/configuration/s3.rb +41 -29
- data/lib/httpimagestore/configuration/thumbnailer.rb +189 -96
- data/lib/httpimagestore/configuration/validate_hmac.rb +170 -0
- data/lib/httpimagestore/error_reporter.rb +6 -1
- data/lib/httpimagestore/ruby_string_template.rb +10 -19
- metadata +40 -102
- data/.rspec +0 -1
- data/features/cache-control.feature +0 -41
- data/features/compatibility.feature +0 -165
- data/features/data-uri.feature +0 -55
- data/features/encoding.feature +0 -103
- data/features/error-reporting.feature +0 -281
- data/features/flexi.feature +0 -259
- data/features/health-check.feature +0 -29
- data/features/request-matching.feature +0 -211
- data/features/rewrite.feature +0 -122
- data/features/s3-store-and-thumbnail.feature +0 -82
- data/features/source-failover.feature +0 -71
- data/features/step_definitions/httpimagestore_steps.rb +0 -203
- data/features/storage.feature +0 -198
- data/features/support/env.rb +0 -116
- data/features/support/test-large.jpg +0 -0
- data/features/support/test.empty +0 -0
- data/features/support/test.jpg +0 -0
- data/features/support/test.png +0 -0
- data/features/support/test.txt +0 -1
- data/features/support/tiny.png +0 -0
- data/features/xid-forwarding.feature +0 -49
- data/httpimagestore.gemspec +0 -145
- data/load_test/load_test.1k.23a022f6e.m1.small-comp.csv +0 -3
- data/load_test/load_test.1k.ec9bde794.m1.small.csv +0 -4
- data/load_test/load_test.jmx +0 -317
- data/load_test/thumbnail_specs.csv +0 -11
- data/load_test/thumbnail_specs_v2.csv +0 -10
- data/spec/configuration_file_spec.rb +0 -333
- data/spec/configuration_handler_spec.rb +0 -255
- data/spec/configuration_identify_spec.rb +0 -67
- data/spec/configuration_output_spec.rb +0 -821
- data/spec/configuration_path_spec.rb +0 -138
- data/spec/configuration_s3_spec.rb +0 -911
- data/spec/configuration_source_failover_spec.rb +0 -101
- data/spec/configuration_spec.rb +0 -90
- data/spec/configuration_thumbnailer_spec.rb +0 -483
- data/spec/ruby_string_template_spec.rb +0 -61
- data/spec/spec_helper.rb +0 -89
- data/spec/support/compute.jpg +0 -0
- data/spec/support/cuba_response_env.rb +0 -40
- data/spec/support/full.cfg +0 -183
- data/spec/support/utf_string.txt +0 -1
data/.rspec
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
--color
|
@@ -1,41 +0,0 @@
|
|
1
|
-
Feature: S3 object Cache-Control header settings
|
2
|
-
S3 objects can have Cache-Control header set during storage.
|
3
|
-
|
4
|
-
Background:
|
5
|
-
Given S3 settings in AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY and AWS_S3_TEST_BUCKET environment variables
|
6
|
-
Given httpthumbnailer server is running at http://localhost:3100/health_check
|
7
|
-
Given httpimagestore server is running at http://localhost:3000/health_check with the following configuration
|
8
|
-
"""
|
9
|
-
s3 key="@AWS_ACCESS_KEY_ID@" secret="@AWS_SECRET_ACCESS_KEY@" ssl=false
|
10
|
-
|
11
|
-
path "hash" "#{input_digest}.#{image_mime_extension}"
|
12
|
-
path "hash-name" "#{input_digest}-#{image_name}.#{image_mime_extension}"
|
13
|
-
|
14
|
-
put "thumbnail" {
|
15
|
-
thumbnail "input" {
|
16
|
-
"no-cache" operation="crop" width=128 height=128 format="jpeg"
|
17
|
-
"cache" operation="crop" width=256 height=256 format="jpeg"
|
18
|
-
}
|
19
|
-
|
20
|
-
store_s3 "input" bucket="@AWS_S3_TEST_BUCKET@" public=true path="hash"
|
21
|
-
store_s3 "no-cache" bucket="@AWS_S3_TEST_BUCKET@" public=true path="hash-name"
|
22
|
-
store_s3 "cache" bucket="@AWS_S3_TEST_BUCKET@" public=true path="hash-name" cache-control="public, max-age=31557600, s-maxage=0"
|
23
|
-
}
|
24
|
-
"""
|
25
|
-
|
26
|
-
@cache-control
|
27
|
-
Scenario: Image files get don't get Cache-Control header by default
|
28
|
-
Given there is no 4006450256177f4a.jpg file in S3 bucket
|
29
|
-
And there is no 4006450256177f4a-no-cache.jpg file in S3 bucket
|
30
|
-
And there is no 4006450256177f4a-cache.jpg file in S3 bucket
|
31
|
-
Given test.jpg file content as request body
|
32
|
-
When I do PUT request http://localhost:3000/thumbnail
|
33
|
-
Then response status will be 200
|
34
|
-
And response content type will be text/plain
|
35
|
-
And response body will be CRLF ended lines
|
36
|
-
"""
|
37
|
-
OK
|
38
|
-
"""
|
39
|
-
And http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/4006450256177f4a.jpg Cache-Control header will not be set
|
40
|
-
And http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/4006450256177f4a-no-cache.jpg Cache-Control header will not be set
|
41
|
-
And http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/4006450256177f4a-cache.jpg Cache-Control header will be public, max-age=31557600, s-maxage=0
|
@@ -1,165 +0,0 @@
|
|
1
|
-
Feature: Image list based thumbnailing and S3 storage
|
2
|
-
Storage based on URL specified image names to be generated and stored using two different path formats.
|
3
|
-
This configuration should be mostly compatible with pre v1.0 release.
|
4
|
-
|
5
|
-
Background:
|
6
|
-
Given S3 settings in AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY and AWS_S3_TEST_BUCKET environment variables
|
7
|
-
Given httpthumbnailer server is running at http://localhost:3100/health_check
|
8
|
-
Given httpimagestore server is running at http://localhost:3000/health_check with the following configuration
|
9
|
-
"""
|
10
|
-
s3 key="@AWS_ACCESS_KEY_ID@" secret="@AWS_SECRET_ACCESS_KEY@" ssl=false
|
11
|
-
|
12
|
-
path "hash" "#{input_digest}.#{image_mime_extension}"
|
13
|
-
path "hash-name" "#{input_digest}/#{image_name}.#{image_mime_extension}"
|
14
|
-
path "structured" "#{dirname}/#{input_digest}/#{basename}.#{image_mime_extension}"
|
15
|
-
path "structured-name" "#{dirname}/#{input_digest}/#{basename}-#{image_name}.#{image_mime_extension}"
|
16
|
-
path "flexi-original" "#{hash}.jpg"
|
17
|
-
|
18
|
-
put "thumbnail" ":name_list" ":path/.+/" {
|
19
|
-
thumbnail "input" {
|
20
|
-
"small" operation="crop" width=128 height=128 format="jpeg" if-image-name-on="#{name_list}"
|
21
|
-
"tiny_png" operation="crop" width=32 height=32 format="png" if-image-name-on="#{name_list}"
|
22
|
-
"bad" operation="crop" width=0 height=0 if-image-name-on="#{name_list}"
|
23
|
-
}
|
24
|
-
|
25
|
-
store_s3 "input" bucket="@AWS_S3_TEST_BUCKET@" path="structured" public=true
|
26
|
-
store_s3 "small" bucket="@AWS_S3_TEST_BUCKET@" path="structured-name" public=true if-image-name-on="#{name_list}"
|
27
|
-
store_s3 "tiny_png" bucket="@AWS_S3_TEST_BUCKET@" path="structured-name" public=true if-image-name-on="#{name_list}"
|
28
|
-
|
29
|
-
output_store_url {
|
30
|
-
"input"
|
31
|
-
"small" if-image-name-on="#{name_list}"
|
32
|
-
"tiny_png" if-image-name-on="#{name_list}"
|
33
|
-
}
|
34
|
-
}
|
35
|
-
|
36
|
-
put "thumbnail" ":name_list" {
|
37
|
-
thumbnail "input" {
|
38
|
-
"small" operation="crop" width=128 height=128 format="jpeg" if-image-name-on="#{name_list}"
|
39
|
-
"tiny_png" operation="crop" width=32 height=32 format="png" if-image-name-on="#{name_list}"
|
40
|
-
}
|
41
|
-
|
42
|
-
store_s3 "input" bucket="@AWS_S3_TEST_BUCKET@" path="hash" public=true
|
43
|
-
store_s3 "small" bucket="@AWS_S3_TEST_BUCKET@" path="hash-name" public=true if-image-name-on="#{name_list}"
|
44
|
-
store_s3 "tiny_png" bucket="@AWS_S3_TEST_BUCKET@" path="hash-name" public=true if-image-name-on="#{name_list}"
|
45
|
-
|
46
|
-
output_store_url {
|
47
|
-
"input"
|
48
|
-
"small" if-image-name-on="#{name_list}"
|
49
|
-
"tiny_png" if-image-name-on="#{name_list}"
|
50
|
-
"bad" if-image-name-on="#{name_list}"
|
51
|
-
}
|
52
|
-
}
|
53
|
-
|
54
|
-
# Forward compatible getting of thumbnails
|
55
|
-
get "thumbnail" ":hash/[0-f]{16}/" ":type/.*-square.jpg/" {
|
56
|
-
source_s3 "original" bucket="@AWS_S3_TEST_BUCKET@" path="flexi-original"
|
57
|
-
thumbnail "original" "thumbnail" operation="crop" width="50" height="50"
|
58
|
-
output_image "thumbnail" cache-control="public, max-age=31557600, s-maxage=0"
|
59
|
-
}
|
60
|
-
|
61
|
-
get "thumbnail" ":hash/[0-f]{16}/" ":type/.*-normal.jpg/" {
|
62
|
-
source_s3 "original" bucket="@AWS_S3_TEST_BUCKET@" path="flexi-original"
|
63
|
-
thumbnail "original" "thumbnail" operation="fit" width="100" height="2000"
|
64
|
-
output_image "thumbnail" cache-control="public, max-age=31557600, s-maxage=0"
|
65
|
-
}
|
66
|
-
"""
|
67
|
-
|
68
|
-
@compatibility
|
69
|
-
Scenario: Putting original and its thumbnails to S3 bucket
|
70
|
-
Given there is no 4006450256177f4a.jpg file in S3 bucket
|
71
|
-
And there is no 4006450256177f4a/small.jpg file in S3 bucket
|
72
|
-
And there is no 4006450256177f4a/tiny_png.png file in S3 bucket
|
73
|
-
Given test.jpg file content as request body
|
74
|
-
When I do PUT request http://localhost:3000/thumbnail/small,tiny_png
|
75
|
-
Then response status will be 200
|
76
|
-
And response content type will be text/uri-list
|
77
|
-
And response body will be CRLF ended lines
|
78
|
-
"""
|
79
|
-
http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/4006450256177f4a.jpg
|
80
|
-
http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/4006450256177f4a/small.jpg
|
81
|
-
http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/4006450256177f4a/tiny_png.png
|
82
|
-
"""
|
83
|
-
Then http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/4006450256177f4a.jpg will contain JPEG image of size 509x719
|
84
|
-
And http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/4006450256177f4a.jpg content type will be image/jpeg
|
85
|
-
Then http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/4006450256177f4a/small.jpg will contain JPEG image of size 128x128
|
86
|
-
And http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/4006450256177f4a/small.jpg content type will be image/jpeg
|
87
|
-
Then http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/4006450256177f4a/tiny_png.png will contain PNG image of size 32x32
|
88
|
-
And http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/4006450256177f4a/tiny_png.png content type will be image/png
|
89
|
-
|
90
|
-
@compatibility
|
91
|
-
Scenario: Putting original and its thumbnails to S3 bucket under custom path
|
92
|
-
Given there is no test/image/4006450256177f4a/test.jpg file in S3 bucket
|
93
|
-
And there is no test/image/4006450256177f4a/test-small.jpg file in S3 bucket
|
94
|
-
And there is no test/image/4006450256177f4a/test-tiny_png.png file in S3 bucket
|
95
|
-
Given test.jpg file content as request body
|
96
|
-
When I do PUT request http://localhost:3000/thumbnail/small,tiny_png/test/image/test
|
97
|
-
Then response status will be 200
|
98
|
-
And response content type will be text/uri-list
|
99
|
-
And response body will be CRLF ended lines
|
100
|
-
"""
|
101
|
-
http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/test/image/4006450256177f4a/test.jpg
|
102
|
-
http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/test/image/4006450256177f4a/test-small.jpg
|
103
|
-
http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/test/image/4006450256177f4a/test-tiny_png.png
|
104
|
-
"""
|
105
|
-
Then http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/test/image/4006450256177f4a/test.jpg will contain JPEG image of size 509x719
|
106
|
-
And http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/test/image/4006450256177f4a/test.jpg content type will be image/jpeg
|
107
|
-
Then http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/test/image/4006450256177f4a/test-small.jpg will contain JPEG image of size 128x128
|
108
|
-
And http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/test/image/4006450256177f4a/test-small.jpg content type will be image/jpeg
|
109
|
-
Then http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/test/image/4006450256177f4a/test-tiny_png.png will contain PNG image of size 32x32
|
110
|
-
And http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/test/image/4006450256177f4a/test-tiny_png.png content type will be image/png
|
111
|
-
|
112
|
-
@compatibility
|
113
|
-
Scenario: Input file extension should be based on content detected mime type and not on provided path
|
114
|
-
Given there is no test/image/4006450256177f4a/test.jpg file in S3 bucket
|
115
|
-
And there is no test/image/4006450256177f4a/test-tiny_png.jpg file in S3 bucket
|
116
|
-
Given test.jpg file content as request body
|
117
|
-
When I do PUT request http://localhost:3000/thumbnail/tiny_png/test/image/test.gif
|
118
|
-
Then response status will be 200
|
119
|
-
And response content type will be text/uri-list
|
120
|
-
And response body will be CRLF ended lines
|
121
|
-
"""
|
122
|
-
http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/test/image/4006450256177f4a/test.jpg
|
123
|
-
http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/test/image/4006450256177f4a/test-tiny_png.png
|
124
|
-
"""
|
125
|
-
And http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/test/image/4006450256177f4a/test.jpg content type will be image/jpeg
|
126
|
-
And http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/test/image/4006450256177f4a/test-tiny_png.png content type will be image/png
|
127
|
-
|
128
|
-
@compatibility
|
129
|
-
Scenario: Custom path name encoding when UTF-8 characters can be used
|
130
|
-
Given there is no test/图像/4006450256177f4a/测试.jpg file in S3 bucket
|
131
|
-
And there is no test/图像/4006450256177f4a/测试-small.jpg file in S3 bucket
|
132
|
-
Given test.jpg file content as request body
|
133
|
-
When I do PUT request with encoded URL http://localhost:3000/thumbnail/small/test/图像/测试
|
134
|
-
Then response status will be 200
|
135
|
-
And response content type will be text/uri-list
|
136
|
-
And response body will be CRLF ended lines
|
137
|
-
"""
|
138
|
-
http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/test/%E5%9B%BE%E5%83%8F/4006450256177f4a/%E6%B5%8B%E8%AF%95.jpg
|
139
|
-
http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/test/%E5%9B%BE%E5%83%8F/4006450256177f4a/%E6%B5%8B%E8%AF%95-small.jpg
|
140
|
-
"""
|
141
|
-
And Encoded URL http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/test/图像/4006450256177f4a/测试.jpg will contain JPEG image of size 509x719
|
142
|
-
And Encoded URL http://@AWS_S3_TEST_BUCKET@.s3.amazonaws.com/test/图像/4006450256177f4a/测试-small.jpg will contain JPEG image of size 128x128
|
143
|
-
|
144
|
-
@compatibility @forward @test
|
145
|
-
Scenario: Getting thumbanils requested with compatibility API from flexi bucket
|
146
|
-
Given test.jpg file content is stored in S3 under 1234567890123456.jpg
|
147
|
-
When I do GET request http://localhost:3000/thumbnail/1234567890123456/foobar-blah-square.jpg
|
148
|
-
Then response status will be 200
|
149
|
-
And response content type will be image/jpeg
|
150
|
-
Then response body will contain JPEG image of size 50x50
|
151
|
-
When I do GET request http://localhost:3000/thumbnail/1234567890123456/foobar-blah-normal.jpg
|
152
|
-
Then response status will be 200
|
153
|
-
And response content type will be image/jpeg
|
154
|
-
Then response body will contain JPEG image of size 100x141
|
155
|
-
|
156
|
-
@compatibility
|
157
|
-
Scenario: Input file extension should be based on content detected mime type and not on provided path
|
158
|
-
Given test.jpg file content as request body
|
159
|
-
When I do PUT request http://localhost:3000/thumbnail/blah/test/image/test.gif
|
160
|
-
Then response status will be 400
|
161
|
-
And response content type will be text/plain
|
162
|
-
And response body will be CRLF ended lines
|
163
|
-
"""
|
164
|
-
no thumbnailing specs were selected, please use at least one of: small, tiny_png, bad
|
165
|
-
"""
|
data/features/data-uri.feature
DELETED
@@ -1,55 +0,0 @@
|
|
1
|
-
Feature: Data URI style image output
|
2
|
-
HTTP Image Store can provide images base64 encoded in data URI format so they can be included directly in HTML pages.
|
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/ with the following configuration
|
7
|
-
"""
|
8
|
-
post "data-uri" "no-identify" {
|
9
|
-
output_data_uri_image "input"
|
10
|
-
}
|
11
|
-
|
12
|
-
post "data-uri" "cache-control" {
|
13
|
-
identify "input"
|
14
|
-
output_data_uri_image "input" cache-control="public, max-age=31557600, s-maxage=0"
|
15
|
-
}
|
16
|
-
|
17
|
-
post "data-uri" {
|
18
|
-
identify "input"
|
19
|
-
output_data_uri_image "input"
|
20
|
-
}
|
21
|
-
"""
|
22
|
-
|
23
|
-
@data-uri
|
24
|
-
Scenario: Getting image encoded in data URI scheme with base64 encoding
|
25
|
-
Given tiny.png file content as request body
|
26
|
-
When I do POST request http://localhost:3000/data-uri
|
27
|
-
Then response status will be 200
|
28
|
-
And response content type will be text/uri-list
|
29
|
-
And response body will be
|
30
|
-
"""
|
31
|
-
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAgUlEQVQI10XNsQ2CUBhF4XOTfwJeog0U2kLJNlZOxQ4swBLGwkhhY6MNRkic4Fq8ENqTLznqhuvlOY2v5f6egaYs6iq1x30YAENdJskgEBAYUFMlYSMw2CYk2sMOkTFgI6Fp/mEpt7Ua69Sf2TRgLESMt8dW5bwE4vtZvOK8xkj8Ac8BL8dFQipPAAAAAElFTkSuQmCC
|
32
|
-
"""
|
33
|
-
|
34
|
-
@data-uri
|
35
|
-
Scenario: Getting image encoded in data URI scheme with base64 encoding - cache-control should be supported
|
36
|
-
Given tiny.png file content as request body
|
37
|
-
When I do POST request http://localhost:3000/data-uri/cache-control
|
38
|
-
Then response status will be 200
|
39
|
-
And response content type will be text/uri-list
|
40
|
-
And response Cache-Control will be public, max-age=31557600, s-maxage=0
|
41
|
-
And response body will be
|
42
|
-
"""
|
43
|
-
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAgUlEQVQI10XNsQ2CUBhF4XOTfwJeog0U2kLJNlZOxQ4swBLGwkhhY6MNRkic4Fq8ENqTLznqhuvlOY2v5f6egaYs6iq1x30YAENdJskgEBAYUFMlYSMw2CYk2sMOkTFgI6Fp/mEpt7Ua69Sf2TRgLESMt8dW5bwE4vtZvOK8xkj8Ac8BL8dFQipPAAAAAElFTkSuQmCC
|
44
|
-
"""
|
45
|
-
|
46
|
-
@data-uri
|
47
|
-
Scenario: Error 500 served when data URI output is used on unidentified image
|
48
|
-
Given tiny.png file content as request body
|
49
|
-
When I do POST request http://localhost:3000/data-uri/no-identify
|
50
|
-
Then response status will be 500
|
51
|
-
And response content type will be text/plain
|
52
|
-
And response body will be CRLF ended lines
|
53
|
-
"""
|
54
|
-
image 'input' needs to be identified first to be used in data URI output
|
55
|
-
"""
|
data/features/encoding.feature
DELETED
@@ -1,103 +0,0 @@
|
|
1
|
-
Feature: Encoded UTF-8 URI support
|
2
|
-
HTTP Image Store should be able to decode UTF-8 characters form URI using URI decode and also support JavaScript encode() format.
|
3
|
-
|
4
|
-
Background:
|
5
|
-
Given S3 settings in AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY and AWS_S3_TEST_BUCKET environment variables
|
6
|
-
Given httpthumbnailer server is running at http://localhost:3100/health_check
|
7
|
-
Given httpimagestore server is running at http://localhost:3000/health_check with the following configuration
|
8
|
-
"""
|
9
|
-
s3 key="@AWS_ACCESS_KEY_ID@" secret="@AWS_SECRET_ACCESS_KEY@" ssl=false
|
10
|
-
path "path" "#{path}"
|
11
|
-
|
12
|
-
post "file" "encoding" "encoded" {
|
13
|
-
store_file "input" root="/tmp" path="path"
|
14
|
-
output_store_uri "input" path="path"
|
15
|
-
}
|
16
|
-
|
17
|
-
post "file" "encoding" "decoded" {
|
18
|
-
store_file "input" root="/tmp" path="path"
|
19
|
-
output_store_path "input" path="path"
|
20
|
-
}
|
21
|
-
|
22
|
-
post "s3" "encoding" "encoded" {
|
23
|
-
store_s3 "input" bucket="@AWS_S3_TEST_BUCKET@" path="path"
|
24
|
-
output_store_uri "input" path="path"
|
25
|
-
}
|
26
|
-
|
27
|
-
post "s3" "encoding" "decoded" {
|
28
|
-
store_s3 "input" bucket="@AWS_S3_TEST_BUCKET@" path="path"
|
29
|
-
output_store_path "input" path="path"
|
30
|
-
}
|
31
|
-
"""
|
32
|
-
|
33
|
-
Scenario: JavaScript encode() + URL encoded variable decoding and URL encoding for file based storage
|
34
|
-
Given test.png file content as request body
|
35
|
-
When I do POST request http://localhost:3000/file/encoding/encoded/triple%20kro%25u0301l.png
|
36
|
-
And response content type will be text/uri-list
|
37
|
-
And response body will be CRLF ended lines
|
38
|
-
"""
|
39
|
-
/triple%20kr%C3%B3l.png
|
40
|
-
"""
|
41
|
-
|
42
|
-
Scenario: JavaScript encode() + URL encoded variable decoding and URL encoding for S3 based storage
|
43
|
-
Given test.png file content as request body
|
44
|
-
When I do POST request http://localhost:3000/s3/encoding/encoded/triple%20kro%25u0301l.png
|
45
|
-
And response content type will be text/uri-list
|
46
|
-
And response body will be CRLF ended lines
|
47
|
-
"""
|
48
|
-
/triple%20kr%C3%B3l.png
|
49
|
-
"""
|
50
|
-
|
51
|
-
Scenario: URL encoded variable decoding and URL encoding with ? for file based storage
|
52
|
-
Given test.png file content as request body
|
53
|
-
When I do POST request http://localhost:3000/file/encoding/encoded/hello%3Fworld.png
|
54
|
-
And response content type will be text/uri-list
|
55
|
-
And response body will be CRLF ended lines
|
56
|
-
"""
|
57
|
-
/hello%3Fworld.png
|
58
|
-
"""
|
59
|
-
|
60
|
-
Scenario: URL encoded variable decoding and URL encoding with ? for S3 based storage
|
61
|
-
Given test.png file content as request body
|
62
|
-
When I do POST request http://localhost:3000/s3/encoding/encoded/hello%3Fworld.png
|
63
|
-
And response content type will be text/uri-list
|
64
|
-
And response body will be CRLF ended lines
|
65
|
-
"""
|
66
|
-
/hello%3Fworld.png
|
67
|
-
"""
|
68
|
-
|
69
|
-
Scenario: URL encoded variable decoding for file based storage
|
70
|
-
Given test.png file content as request body
|
71
|
-
When I do POST request http://localhost:3000/file/encoding/decoded/triple%20kr%C3%B3l.png
|
72
|
-
And response content type will be text/plain
|
73
|
-
And response body will be CRLF ended lines
|
74
|
-
"""
|
75
|
-
triple król.png
|
76
|
-
"""
|
77
|
-
|
78
|
-
Scenario: URL encoded variable decoding for S3 based storage
|
79
|
-
Given test.png file content as request body
|
80
|
-
When I do POST request http://localhost:3000/s3/encoding/decoded/triple%20kr%C3%B3l.png
|
81
|
-
And response content type will be text/plain
|
82
|
-
And response body will be CRLF ended lines
|
83
|
-
"""
|
84
|
-
triple król.png
|
85
|
-
"""
|
86
|
-
|
87
|
-
Scenario: URL path normalization with ? for file based storage
|
88
|
-
Given test.png file content as request body
|
89
|
-
When I do POST request http://localhost:3000/file/encoding/decoded/hello%3Fworld.png
|
90
|
-
And response content type will be text/plain
|
91
|
-
And response body will be CRLF ended lines
|
92
|
-
"""
|
93
|
-
hello?world.png
|
94
|
-
"""
|
95
|
-
|
96
|
-
Scenario: URL path normalization with ? S3 file based storage
|
97
|
-
Given test.png file content as request body
|
98
|
-
When I do POST request http://localhost:3000/s3/encoding/decoded/hello%3Fworld.png
|
99
|
-
And response content type will be text/plain
|
100
|
-
And response body will be CRLF ended lines
|
101
|
-
"""
|
102
|
-
hello?world.png
|
103
|
-
"""
|
@@ -1,281 +0,0 @@
|
|
1
|
-
Feature: Error handling
|
2
|
-
API should provide different status codes with text/plain description body for different error modes.
|
3
|
-
|
4
|
-
Background:
|
5
|
-
Given S3 settings in AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY and AWS_S3_TEST_BUCKET environment variables
|
6
|
-
Given httpthumbnailer server is running at http://localhost:3100/health_check
|
7
|
-
Given httpimagestore server is running at http://localhost:3000/health_check with the following configuration
|
8
|
-
"""
|
9
|
-
s3 key="@AWS_ACCESS_KEY_ID@" secret="@AWS_SECRET_ACCESS_KEY@" ssl=false
|
10
|
-
|
11
|
-
path "uri_part" "/thumbnails/#{input_digest}/#{name}.#{image_mime_extension}"
|
12
|
-
path "structured-name" "#{dirname}/#{input_digest}/#{basename}-#{image_name}.#{image_mime_extension}"
|
13
|
-
path "missing" "blah"
|
14
|
-
path "zero" "zero"
|
15
|
-
path "hash" "#{input_digest}"
|
16
|
-
|
17
|
-
put "multipart" ":name_list" {
|
18
|
-
thumbnail "input" {
|
19
|
-
"small" operation="crop" width=128 height=128 if-image-name-on="#{name_list}"
|
20
|
-
"bad" operation="crop" width=0 height=0 if-image-name-on="#{name_list}"
|
21
|
-
"bad_dim" operation="crop" width="128x" height=128 if-image-name-on="#{name_list}"
|
22
|
-
"superlarge" operation="crop" width=16000 height=16000 if-image-name-on="#{name_list}"
|
23
|
-
"large_png" operation="crop" width=7000 height=7000 format="png" if-image-name-on="#{name_list}"
|
24
|
-
"bad_opts" operation="crop" width=128 height=128 options="foo=bar" if-image-name-on="#{name_list}"
|
25
|
-
}
|
26
|
-
}
|
27
|
-
|
28
|
-
put "singlepart" ":name_list" {
|
29
|
-
thumbnail "input" "small" operation="crop" width=128 height=128 if-image-name-on="#{name_list}"
|
30
|
-
thumbnail "input" "bad" operation="crop" width=0 height=0 if-image-name-on="#{name_list}"
|
31
|
-
thumbnail "input" "bad_dim" operation="crop" width="128x" height=128 if-image-name-on="#{name_list}"
|
32
|
-
thumbnail "input" "superlarge" operation="crop" width=16000 height=16000 if-image-name-on="#{name_list}"
|
33
|
-
thumbnail "input" "large_png" operation="crop" width=7000 height=7000 format="png" if-image-name-on="#{name_list}"
|
34
|
-
thumbnail "input" "bad_opts" operation="crop" width=128 height=128 options="foo=bar" if-image-name-on="#{name_list}"
|
35
|
-
}
|
36
|
-
|
37
|
-
post "filename" "/(?<name>.+?)(\\.[^\\.]+)?$/" {
|
38
|
-
identify "input"
|
39
|
-
store_s3 "input" bucket="@AWS_S3_TEST_BUCKET@" path="hash" cache-root="/tmp"
|
40
|
-
output_store_path "input" path="uri_part"
|
41
|
-
}
|
42
|
-
|
43
|
-
get "s3" {
|
44
|
-
source_s3 "original" bucket="@AWS_S3_TEST_BUCKET@" path="missing"
|
45
|
-
}
|
46
|
-
|
47
|
-
get "file" {
|
48
|
-
source_file "original" root="/tmp" path="missing"
|
49
|
-
}
|
50
|
-
|
51
|
-
get "zero" {
|
52
|
-
source_file "original" root="/dev" path="zero"
|
53
|
-
}
|
54
|
-
|
55
|
-
path "not_defined" "#{bogous}"
|
56
|
-
get "not_defined" {
|
57
|
-
source_file "original" root="/tmp" path="not_defined"
|
58
|
-
}
|
59
|
-
|
60
|
-
path "body" "#{input_digest}"
|
61
|
-
get "body" {
|
62
|
-
source_file "original" root="/tmp" path="body"
|
63
|
-
}
|
64
|
-
|
65
|
-
path "no_image_meta" "#{image_mime_extension}"
|
66
|
-
put "no_image_meta" {
|
67
|
-
store_file "input" root="/tmp" path="no_image_meta"
|
68
|
-
}
|
69
|
-
"""
|
70
|
-
|
71
|
-
@error-reporting
|
72
|
-
Scenario: Reporting of missing resource
|
73
|
-
When I do GET request http://localhost:3000/blah
|
74
|
-
Then response status will be 404
|
75
|
-
And response content type will be text/plain
|
76
|
-
And response body will be CRLF ended lines
|
77
|
-
"""
|
78
|
-
request for URI '/blah' was not handled by the server
|
79
|
-
"""
|
80
|
-
|
81
|
-
@error-reporting
|
82
|
-
Scenario: Reporting of missing S3 resource
|
83
|
-
When I do GET request http://localhost:3000/s3
|
84
|
-
Then response status will be 404
|
85
|
-
And response content type will be text/plain
|
86
|
-
And response body will be CRLF ended lines
|
87
|
-
"""
|
88
|
-
S3 bucket 'httpimagestoretest' does not contain key 'blah'
|
89
|
-
"""
|
90
|
-
|
91
|
-
@error-reporting
|
92
|
-
Scenario: Reporting of missing file resource
|
93
|
-
When I do GET request http://localhost:3000/file
|
94
|
-
Then response status will be 404
|
95
|
-
And response content type will be text/plain
|
96
|
-
And response body will be CRLF ended lines
|
97
|
-
"""
|
98
|
-
error while processing image 'original': file 'blah' not found
|
99
|
-
"""
|
100
|
-
|
101
|
-
@error-reporting
|
102
|
-
Scenario: Reporting of unsupported media type
|
103
|
-
Given test.txt file content as request body
|
104
|
-
When I do PUT request http://localhost:3000/multipart/small,tiny
|
105
|
-
Then response status will be 415
|
106
|
-
And response content type will be text/plain
|
107
|
-
And response body will be CRLF ended lines like
|
108
|
-
"""
|
109
|
-
thumbnailing of 'input' failed: unsupported media type: no decode delegate for this image format
|
110
|
-
"""
|
111
|
-
When I do PUT request http://localhost:3000/singlepart/small,tiny
|
112
|
-
Then response status will be 415
|
113
|
-
And response content type will be text/plain
|
114
|
-
And response body will be CRLF ended lines like
|
115
|
-
"""
|
116
|
-
thumbnailing of 'input' into 'small' failed: unsupported media type: no decode delegate for this image format
|
117
|
-
"""
|
118
|
-
|
119
|
-
@error-reporting
|
120
|
-
Scenario: Reporting and handling of thumbnailing errors
|
121
|
-
Given test.jpg file content as request body
|
122
|
-
When I do PUT request http://localhost:3000/multipart/small,bad
|
123
|
-
Then response status will be 400
|
124
|
-
And response content type will be text/plain
|
125
|
-
And response body will be CRLF ended lines like
|
126
|
-
"""
|
127
|
-
thumbnailing of 'input' into 'bad' failed: at least one image dimension is zero: 0x0
|
128
|
-
"""
|
129
|
-
When I do PUT request http://localhost:3000/singlepart/small,bad
|
130
|
-
Then response status will be 400
|
131
|
-
And response content type will be text/plain
|
132
|
-
And response body will be CRLF ended lines like
|
133
|
-
"""
|
134
|
-
thumbnailing of 'input' into 'bad' failed: at least one image dimension is zero: 0x0
|
135
|
-
"""
|
136
|
-
|
137
|
-
@error-reporting
|
138
|
-
Scenario: Reporting and handling of thumbnailing errors - bad options format
|
139
|
-
Given test.jpg file content as request body
|
140
|
-
When I do PUT request http://localhost:3000/multipart/small,bad_opts
|
141
|
-
Then response status will be 400
|
142
|
-
And response content type will be text/plain
|
143
|
-
And response body will be CRLF ended lines
|
144
|
-
"""
|
145
|
-
thumbnailing of 'input' into 'bad_opts' failed: missing option value for key 'foo=bar'
|
146
|
-
"""
|
147
|
-
When I do PUT request http://localhost:3000/singlepart/small,bad_opts
|
148
|
-
Then response status will be 400
|
149
|
-
And response content type will be text/plain
|
150
|
-
And response body will be CRLF ended lines
|
151
|
-
"""
|
152
|
-
thumbnailing of 'input' into 'bad_opts' failed: missing option value for key 'foo=bar'
|
153
|
-
"""
|
154
|
-
|
155
|
-
@error-reporting @test
|
156
|
-
Scenario: Bad dimension
|
157
|
-
Given test.jpg file content as request body
|
158
|
-
When I do PUT request http://localhost:3000/multipart/bad_dim
|
159
|
-
Then response status will be 400
|
160
|
-
And response content type will be text/plain
|
161
|
-
And response body will be CRLF ended lines like
|
162
|
-
"""
|
163
|
-
thumbnailing of 'input' into 'bad_dim' failed: bad dimension value: 128x
|
164
|
-
"""
|
165
|
-
When I do PUT request http://localhost:3000/singlepart/bad_dim
|
166
|
-
Then response status will be 400
|
167
|
-
And response content type will be text/plain
|
168
|
-
And response body will be CRLF ended lines like
|
169
|
-
"""
|
170
|
-
thumbnailing of 'input' into 'bad_dim' failed: bad dimension value: 128x
|
171
|
-
"""
|
172
|
-
|
173
|
-
@error-reporting @413 @load
|
174
|
-
Scenario: Too large image - uploaded image too big to fit in memory limit
|
175
|
-
Given test-large.jpg file content as request body
|
176
|
-
When I do PUT request http://localhost:3000/multipart/large_png
|
177
|
-
Then response status will be 413
|
178
|
-
And response content type will be text/plain
|
179
|
-
And response body will be CRLF ended lines like
|
180
|
-
"""
|
181
|
-
thumbnailing of 'input' failed: image too large: cache resources exhausted
|
182
|
-
"""
|
183
|
-
When I do PUT request http://localhost:3000/singlepart/large_png
|
184
|
-
Then response status will be 413
|
185
|
-
And response content type will be text/plain
|
186
|
-
And response body will be CRLF ended lines like
|
187
|
-
"""
|
188
|
-
thumbnailing of 'input' into 'large_png' failed: image too large: cache resources exhausted
|
189
|
-
"""
|
190
|
-
|
191
|
-
@error-reporting @413 @thumbnail
|
192
|
-
Scenario: Too large image - memory exhausted when thmbnailing
|
193
|
-
Given test.jpg file content as request body
|
194
|
-
When I do PUT request http://localhost:3000/multipart/superlarge
|
195
|
-
Then response status will be 413
|
196
|
-
And response content type will be text/plain
|
197
|
-
And response body will be CRLF ended lines like
|
198
|
-
"""
|
199
|
-
thumbnailing of 'input' into 'superlarge' failed: image too large: cache resources exhausted
|
200
|
-
"""
|
201
|
-
When I do PUT request http://localhost:3000/singlepart/superlarge
|
202
|
-
Then response status will be 413
|
203
|
-
And response content type will be text/plain
|
204
|
-
And response body will be CRLF ended lines like
|
205
|
-
"""
|
206
|
-
thumbnailing of 'input' into 'superlarge' failed: image too large: cache resources exhausted
|
207
|
-
"""
|
208
|
-
|
209
|
-
@error-reporting
|
210
|
-
Scenario: Bad URI encoding
|
211
|
-
Given test.jpg file content as request body
|
212
|
-
When I do POST request http://localhost:3000/filename/hello%e9world.jpg
|
213
|
-
Then response status will be 400
|
214
|
-
And response content type will be text/plain
|
215
|
-
And response body will be CRLF ended lines like
|
216
|
-
"""
|
217
|
-
invalid UTF-8 encoding in URI: "hello\\xE9world"
|
218
|
-
"""
|
219
|
-
|
220
|
-
@error-reporting
|
221
|
-
Scenario: Bad URI encoding + JavaScript encode
|
222
|
-
Given test.jpg file content as request body
|
223
|
-
When I do POST request http://localhost:3000/filename/triple%20kro%25udfcfl.png
|
224
|
-
Then response status will be 400
|
225
|
-
And response content type will be text/plain
|
226
|
-
And response body will be CRLF ended lines like
|
227
|
-
"""
|
228
|
-
invalid UTF-8 encoding in URI: "triple kro\\xED\\xBF\\x8Fl"
|
229
|
-
"""
|
230
|
-
|
231
|
-
@error-reporting
|
232
|
-
Scenario: Zero body length
|
233
|
-
Given test.empty file content as request body
|
234
|
-
When I do PUT request http://localhost:3000/multipart/small
|
235
|
-
Then response status will be 400
|
236
|
-
And response content type will be text/plain
|
237
|
-
And response body will be CRLF ended lines like
|
238
|
-
"""
|
239
|
-
empty body - expected image data
|
240
|
-
"""
|
241
|
-
|
242
|
-
@error-reporting
|
243
|
-
Scenario: Memory limit exceeded
|
244
|
-
When I do GET request http://localhost:3000/zero
|
245
|
-
Then response status will be 413
|
246
|
-
And response content type will be text/plain
|
247
|
-
And response body will be CRLF ended lines like
|
248
|
-
"""
|
249
|
-
memory limit exceeded
|
250
|
-
"""
|
251
|
-
|
252
|
-
@error-reporting @variables
|
253
|
-
Scenario: Bad variable use - not defined
|
254
|
-
When I do GET request http://localhost:3000/not_defined
|
255
|
-
Then response status will be 500
|
256
|
-
And response content type will be text/plain
|
257
|
-
And response body will be CRLF ended lines like
|
258
|
-
"""
|
259
|
-
cannot generate path 'not_defined' from template '\#{bogous}': variable 'bogous' not defined
|
260
|
-
"""
|
261
|
-
|
262
|
-
@error-reporting @variables
|
263
|
-
Scenario: Bad variable use - no body
|
264
|
-
When I do GET request http://localhost:3000/body
|
265
|
-
Then response status will be 500
|
266
|
-
And response content type will be text/plain
|
267
|
-
And response body will be CRLF ended lines like
|
268
|
-
"""
|
269
|
-
cannot generate path 'body' from template '#{input_digest}': need not empty request body to generate value for 'input_digest'
|
270
|
-
"""
|
271
|
-
|
272
|
-
@error-reporting @variables
|
273
|
-
Scenario: Bad variable use - no image meta
|
274
|
-
Given test.jpg file content as request body
|
275
|
-
When I do PUT request http://localhost:3000/no_image_meta
|
276
|
-
Then response status will be 500
|
277
|
-
And response content type will be text/plain
|
278
|
-
And response body will be CRLF ended lines like
|
279
|
-
"""
|
280
|
-
cannot generate path 'no_image_meta' from template '#{image_mime_extension}': image 'input' does not have data for variable 'image_mime_extension'
|
281
|
-
"""
|