httpimagestore 1.4.1 → 1.5.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.
- data/.idea/.name +1 -0
- data/.idea/.rakeTasks +7 -0
- data/.idea/codeStyleSettings.xml +13 -0
- data/.idea/dictionaries/wcc.xml +8 -0
- data/.idea/encodings.xml +5 -0
- data/.idea/httpimagestore.iml +69 -0
- data/.idea/jenkinsSettings.xml +9 -0
- data/.idea/misc.xml +5 -0
- data/.idea/modules.xml +9 -0
- data/.idea/scopes/scope_settings.xml +5 -0
- data/.idea/vcs.xml +7 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +4 -4
- data/README.md +55 -33
- data/VERSION +1 -1
- data/bin/httpimagestore +19 -5
- data/features/cache-control.feature +8 -9
- data/features/compatibility.feature +46 -21
- data/features/error-reporting.feature +15 -16
- data/features/flexi.feature +4 -5
- data/features/health-check.feature +1 -2
- data/features/request-matching.feature +211 -0
- data/features/s3-store-and-thumbnail.feature +3 -10
- data/features/storage.feature +7 -9
- data/httpimagestore.gemspec +17 -5
- data/lib/httpimagestore/configuration/handler.rb +55 -30
- data/lib/httpimagestore/configuration/output.rb +51 -2
- data/spec/configuration_handler_spec.rb +4 -22
- data/spec/configuration_output_spec.rb +86 -2
- metadata +17 -5
data/.idea/.name
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
httpimagestore
|
data/.idea/.rakeTasks
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<Settings><!--This file was automatically generated by Ruby plugin.
|
|
3
|
+
You are allowed to:
|
|
4
|
+
1. Remove rake task
|
|
5
|
+
2. Add existing rake tasks
|
|
6
|
+
To add existing rake tasks automatically delete this file and reload the project.
|
|
7
|
+
--><RakeGroup description="" fullCmd="" taksId="rake"><RakeTask description="Build gem into pkg/" fullCmd="build" taksId="build" /><RakeTask description="Remove any temporary products" fullCmd="clean" taksId="clean" /><RakeTask description="Remove any generated file" fullCmd="clobber" taksId="clobber" /><RakeTask description="Remove RDoc HTML files" fullCmd="clobber_rdoc" taksId="clobber_rdoc" /><RakeTask description="Start IRB with all runtime dependencies loaded" fullCmd="console[script]" taksId="console[script]" /><RakeTask description="Run Cucumber features" fullCmd="features" taksId="features" /><RakeGroup description="" fullCmd="" taksId="gemcutter"><RakeTask description="Release gem to Gemcutter" fullCmd="gemcutter:release" taksId="release" /></RakeGroup><RakeTask description="Generate and validate gemspec" fullCmd="gemspec" taksId="gemspec" /><RakeGroup description="" fullCmd="" taksId="gemspec"><RakeTask description="Display the gemspec for debugging purposes, as jeweler knows it (not from the filesystem)" fullCmd="gemspec:debug" taksId="debug" /><RakeTask description="Regenerate the gemspec on the filesystem" fullCmd="gemspec:generate" taksId="generate" /><RakeTask description="Regenerate and validate gemspec, and then commits and pushes to git" fullCmd="gemspec:release" taksId="release" /><RakeTask description="Validates the gemspec on the filesystem" fullCmd="gemspec:validate" taksId="validate" /></RakeGroup><RakeGroup description="" fullCmd="" taksId="git"><RakeTask description="Tag and push release to git" fullCmd="git:release" taksId="release" /></RakeGroup><RakeTask description="Build and install gem using `gem install`" fullCmd="install" taksId="install" /><RakeTask description="Run RSpec code examples" fullCmd="rcov" taksId="rcov" /><RakeTask description="Build RDoc HTML files" fullCmd="rdoc" taksId="rdoc" /><RakeTask description="Release gem" fullCmd="release" taksId="release" /><RakeTask description="Rebuild RDoc HTML files" fullCmd="rerdoc" taksId="rerdoc" /><RakeTask description="Run RSpec code examples" fullCmd="spec" taksId="spec" /><RakeTask description="Displays the current version" fullCmd="version" taksId="version" /><RakeGroup description="" fullCmd="" taksId="version"><RakeGroup description="" fullCmd="" taksId="bump"><RakeTask description="Bump the major version by 1" fullCmd="version:bump:major" taksId="major" /><RakeTask description="Bump the a minor version by 1" fullCmd="version:bump:minor" taksId="minor" /><RakeTask description="Bump the patch version by 1" fullCmd="version:bump:patch" taksId="patch" /></RakeGroup><RakeTask description="Writes out an explicit version" fullCmd="version:write" taksId="write" /></RakeGroup><RakeTask description="" fullCmd="console" taksId="console" /><RakeTask description="" fullCmd="default" taksId="default" /><RakeTask description="" fullCmd="gemspec_required" taksId="gemspec_required" /><RakeTask description="" fullCmd="rdoc/index.html" taksId="rdoc/index.html" /><RakeTask description="" fullCmd="version_required" taksId="version_required" /></RakeGroup></Settings>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<project version="4">
|
|
3
|
+
<component name="ProjectCodeStyleSettingsManager">
|
|
4
|
+
<option name="PER_PROJECT_SETTINGS">
|
|
5
|
+
<value>
|
|
6
|
+
<XML>
|
|
7
|
+
<option name="XML_LEGACY_SETTINGS_IMPORTED" value="true" />
|
|
8
|
+
</XML>
|
|
9
|
+
</value>
|
|
10
|
+
</option>
|
|
11
|
+
</component>
|
|
12
|
+
</project>
|
|
13
|
+
|
data/.idea/encodings.xml
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<module type="RUBY_MODULE" version="4">
|
|
3
|
+
<component name="FacetManager">
|
|
4
|
+
<facet type="gem" name="Gem">
|
|
5
|
+
<configuration>
|
|
6
|
+
<option name="GEM_APP_ROOT_PATH" value="$MODULE_DIR$" />
|
|
7
|
+
<option name="GEM_APP_TEST_PATH" value="" />
|
|
8
|
+
<option name="GEM_APP_LIB_PATH" value="$MODULE_DIR$/lib" />
|
|
9
|
+
</configuration>
|
|
10
|
+
</facet>
|
|
11
|
+
</component>
|
|
12
|
+
<component name="NewModuleRootManager">
|
|
13
|
+
<content url="file://$MODULE_DIR$" />
|
|
14
|
+
<orderEntry type="inheritedJdk" />
|
|
15
|
+
<orderEntry type="sourceFolder" forTests="false" />
|
|
16
|
+
<orderEntry type="library" scope="PROVIDED" name="addressable (v2.3.5, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
17
|
+
<orderEntry type="library" scope="PROVIDED" name="aws-sdk (v1.18.0, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
18
|
+
<orderEntry type="library" scope="PROVIDED" name="builder (v3.2.2, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
19
|
+
<orderEntry type="library" scope="PROVIDED" name="bundler (v1.3.5, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
20
|
+
<orderEntry type="library" scope="PROVIDED" name="cli (v1.3.1, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
21
|
+
<orderEntry type="library" scope="PROVIDED" name="cuba (v3.1.0, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
22
|
+
<orderEntry type="library" scope="PROVIDED" name="cucumber (v1.3.8, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
23
|
+
<orderEntry type="library" scope="PROVIDED" name="daemon (v1.1.0, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
24
|
+
<orderEntry type="library" scope="PROVIDED" name="diff-lcs (v1.2.4, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
25
|
+
<orderEntry type="library" scope="PROVIDED" name="facter (v1.6.18, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
26
|
+
<orderEntry type="library" scope="PROVIDED" name="faraday (v0.8.8, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
27
|
+
<orderEntry type="library" scope="PROVIDED" name="gherkin (v2.12.1, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
28
|
+
<orderEntry type="library" scope="PROVIDED" name="git (v1.2.6, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
29
|
+
<orderEntry type="library" scope="PROVIDED" name="github_api (v0.10.1, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
30
|
+
<orderEntry type="library" scope="PROVIDED" name="hashie (v2.0.5, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
31
|
+
<orderEntry type="library" scope="PROVIDED" name="highline (v1.6.19, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
32
|
+
<orderEntry type="library" scope="PROVIDED" name="httpauth (v0.2.0, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
33
|
+
<orderEntry type="library" scope="PROVIDED" name="httpclient (v2.3.4.1, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
34
|
+
<orderEntry type="library" scope="PROVIDED" name="httpthumbnailer (v1.1.1, /Users/wcc/Documents/httpthumbnailer) [path][gem]" level="application" />
|
|
35
|
+
<orderEntry type="library" scope="PROVIDED" name="httpthumbnailer-client (v1.1.1, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
36
|
+
<orderEntry type="library" scope="PROVIDED" name="jeweler (v1.8.7, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
37
|
+
<orderEntry type="library" scope="PROVIDED" name="json (v1.8.0, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
38
|
+
<orderEntry type="library" scope="PROVIDED" name="jwt (v0.1.8, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
39
|
+
<orderEntry type="library" scope="PROVIDED" name="kgio (v2.8.1, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
40
|
+
<orderEntry type="library" scope="PROVIDED" name="mime-types (v1.25, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
41
|
+
<orderEntry type="library" scope="PROVIDED" name="msgpack (v0.5.5, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
42
|
+
<orderEntry type="library" scope="PROVIDED" name="multi_json (v1.8.0, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
43
|
+
<orderEntry type="library" scope="PROVIDED" name="multi_test (v0.0.2, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
44
|
+
<orderEntry type="library" scope="PROVIDED" name="multi_xml (v0.5.5, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
45
|
+
<orderEntry type="library" scope="PROVIDED" name="multipart-parser (v0.1.1, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
46
|
+
<orderEntry type="library" scope="PROVIDED" name="multipart-post (v1.2.0, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
47
|
+
<orderEntry type="library" scope="PROVIDED" name="nokogiri (v1.5.10, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
48
|
+
<orderEntry type="library" scope="PROVIDED" name="oauth2 (v0.9.2, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
49
|
+
<orderEntry type="library" scope="PROVIDED" name="prawn (v0.8.4, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
50
|
+
<orderEntry type="library" scope="PROVIDED" name="prawn-core (v0.8.4, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
51
|
+
<orderEntry type="library" scope="PROVIDED" name="prawn-layout (v0.8.4, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
52
|
+
<orderEntry type="library" scope="PROVIDED" name="prawn-security (v0.8.4, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
53
|
+
<orderEntry type="library" scope="PROVIDED" name="rack (v1.5.2, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
54
|
+
<orderEntry type="library" scope="PROVIDED" name="raindrops (v0.12.0, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
55
|
+
<orderEntry type="library" scope="PROVIDED" name="rake (v10.1.0, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
56
|
+
<orderEntry type="library" scope="PROVIDED" name="rdoc (v3.12.2, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
57
|
+
<orderEntry type="library" scope="PROVIDED" name="rmagick (v2.13.2, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
58
|
+
<orderEntry type="library" scope="PROVIDED" name="rspec (v2.14.1, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
59
|
+
<orderEntry type="library" scope="PROVIDED" name="rspec-core (v2.14.5, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
60
|
+
<orderEntry type="library" scope="PROVIDED" name="rspec-expectations (v2.14.2, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
61
|
+
<orderEntry type="library" scope="PROVIDED" name="rspec-mocks (v2.14.3, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
62
|
+
<orderEntry type="library" scope="PROVIDED" name="ruby-ip (v0.9.1, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
63
|
+
<orderEntry type="library" scope="PROVIDED" name="sdl4r (v0.9.11, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
64
|
+
<orderEntry type="library" scope="PROVIDED" name="unicorn (v4.6.3, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
65
|
+
<orderEntry type="library" scope="PROVIDED" name="unicorn-cuba-base (v1.1.1, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
66
|
+
<orderEntry type="library" scope="PROVIDED" name="uuidtools (v2.1.4, RVM: ruby-1.9.3-p429) [gem]" level="application" />
|
|
67
|
+
</component>
|
|
68
|
+
</module>
|
|
69
|
+
|
data/.idea/misc.xml
ADDED
data/.idea/modules.xml
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<project version="4">
|
|
3
|
+
<component name="ProjectModuleManager">
|
|
4
|
+
<modules>
|
|
5
|
+
<module fileurl="file://$PROJECT_DIR$/.idea/httpimagestore.iml" filepath="$PROJECT_DIR$/.idea/httpimagestore.iml" />
|
|
6
|
+
</modules>
|
|
7
|
+
</component>
|
|
8
|
+
</project>
|
|
9
|
+
|
data/.idea/vcs.xml
ADDED
data/Gemfile
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
source "http://rubygems.org"
|
|
2
2
|
ruby "1.9.3"
|
|
3
3
|
|
|
4
|
-
gem "unicorn-cuba-base", "~> 1.1.
|
|
4
|
+
gem "unicorn-cuba-base", "~> 1.1.2"
|
|
5
5
|
#gem "unicorn-cuba-base", path: "../unicorn-cuba-base"
|
|
6
6
|
gem "httpthumbnailer-client", "~> 1.1.1"
|
|
7
7
|
#gem "httpthumbnailer-client", path: "../httpthumbnailer-client"
|
data/Gemfile.lock
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: ../httpthumbnailer
|
|
3
3
|
specs:
|
|
4
|
-
httpthumbnailer (1.1.
|
|
4
|
+
httpthumbnailer (1.1.1)
|
|
5
5
|
rmagick (~> 2)
|
|
6
|
-
unicorn-cuba-base (~> 1.1)
|
|
6
|
+
unicorn-cuba-base (~> 1.1.1)
|
|
7
7
|
|
|
8
8
|
GEM
|
|
9
9
|
remote: http://rubygems.org/
|
|
@@ -101,7 +101,7 @@ GEM
|
|
|
101
101
|
kgio (~> 2.6)
|
|
102
102
|
rack
|
|
103
103
|
raindrops (~> 0.7)
|
|
104
|
-
unicorn-cuba-base (1.1.
|
|
104
|
+
unicorn-cuba-base (1.1.2)
|
|
105
105
|
cli (~> 1.3)
|
|
106
106
|
cuba (~> 3.0)
|
|
107
107
|
facter (~> 1.6.11)
|
|
@@ -127,4 +127,4 @@ DEPENDENCIES
|
|
|
127
127
|
rdoc (~> 3.9)
|
|
128
128
|
rspec (~> 2.13)
|
|
129
129
|
sdl4r (~> 0.9)
|
|
130
|
-
unicorn-cuba-base (~> 1.1.
|
|
130
|
+
unicorn-cuba-base (~> 1.1.2)
|
data/README.md
CHANGED
|
@@ -17,6 +17,11 @@ It is using [HTTP Thumbnailer](https://github.com/jpastuszek/httpthumbnailer) as
|
|
|
17
17
|
|
|
18
18
|
## Changelog
|
|
19
19
|
|
|
20
|
+
### 1.5.0
|
|
21
|
+
* `output_ok` and `output_text` support
|
|
22
|
+
* named captures regexp matcher support
|
|
23
|
+
* better matcher debugging
|
|
24
|
+
|
|
20
25
|
### 1.4.0
|
|
21
26
|
* read-through and write-through S3 object cache support
|
|
22
27
|
|
|
@@ -32,7 +37,7 @@ It is using [HTTP Thumbnailer](https://github.com/jpastuszek/httpthumbnailer) as
|
|
|
32
37
|
* matching for query string key and value
|
|
33
38
|
* getting query string key value into variable
|
|
34
39
|
* optional query string matchers with default value
|
|
35
|
-
* default values for optional
|
|
40
|
+
* default values for optional segment matchers
|
|
36
41
|
* S3 storage prefix support
|
|
37
42
|
|
|
38
43
|
### 1.1.0
|
|
@@ -152,27 +157,26 @@ Each endpoint can have one or more operation defined that will be performed on r
|
|
|
152
157
|
|
|
153
158
|
Endpoints will be evaluated in order of definition until one is matched.
|
|
154
159
|
|
|
155
|
-
Statement should start with one of the following HTTP verbs in lowercase: `get`, `post`, `put`, `delete`, followed by list of URI
|
|
160
|
+
Statement should start with one of the following HTTP verbs in lowercase: `get`, `post`, `put`, `delete`, followed by list of URI segment matchers:
|
|
156
161
|
|
|
157
|
-
* `<string>` - `<string>` literally match against URI
|
|
158
|
-
* `:<symbol>` - match any URI
|
|
159
|
-
* `:<symbol>?[defalut]` - optionally match URI
|
|
160
|
-
* `:<symbol>/<regexp>/` - match URI
|
|
161
|
-
*
|
|
162
|
+
* `<string>` - `<string>` literally match against URI segment in that position for the endpoint to be evaluated
|
|
163
|
+
* `:<symbol>` - match any URI segment in that position and store matched segment value in variable named `<symbol>`
|
|
164
|
+
* `:<symbol>?[defalut]` - optionally match URI segment in that position and store matched segment value in variable named `<symbol>`; request URI may not contain segment in that position (usually at the end of URI) to be matched for this endpoint to be evaluated; if `[default]` value is specified it will be used when no value was found in the URI, otherwise empty string will be used
|
|
165
|
+
* `:<symbol>/<regexp>/` - match remaining URI using `/` surrounded [regular expression](http://rubular.com) and store matched segments in variable named `<symbol>`
|
|
166
|
+
* `/<regexp>/` - match remaining URI using `/` surrounded [regular expression](http://rubular.com) and store zero or more named captures in variable named as corresponding capture name; e.g. `/(?<my_number>[0-9]+)/` - match a number and store it in `my_number` variable
|
|
167
|
+
* `&<key>=<value>` - match this endpoint when query string contains key `<key>` with value of `<value>` and store the `<value>` in variable named `<key>`
|
|
162
168
|
* `&:<key>` - match query string parameter of key `<key>` and store it's value in variable named `<key>`
|
|
163
169
|
* `&:<key>?[default]` - optionally match query string parameter of key `<key>`; when `[default]` is specified it will be used as variable value, otherwise empty string will be used
|
|
164
170
|
|
|
165
|
-
Note that any remaining unmatched URI is stored in `path` variable.
|
|
166
|
-
|
|
167
|
-
Additionally `query_string_options` variable is build from query string parameters and can be used to specify options to [HTTP Thumbnailer](https://github.com/jpastuszek/httpthumbnailer).
|
|
171
|
+
Note that any remaining unmatched URI part is stored in `path` variable.
|
|
172
|
+
Variable `query_string_options` is build from all query string parameters and can be used to specify options to [HTTP Thumbnailer](https://github.com/jpastuszek/httpthumbnailer).
|
|
168
173
|
|
|
169
174
|
Note that variables can get overwritten in order of evaluation:
|
|
170
|
-
1.
|
|
171
|
-
2.
|
|
172
|
-
3.
|
|
173
|
-
4. `query_string_options` variable value
|
|
175
|
+
1. `path` variable value
|
|
176
|
+
2. all matched URI components and query string parameters in order of specification from left to right
|
|
177
|
+
3. `query_string_options` variable value
|
|
174
178
|
|
|
175
|
-
Note that URI components are URI decoded after they are matched.
|
|
179
|
+
Note that URI components are URI decoded after they are matched.
|
|
176
180
|
Query string parameter values are URI decoded before they are matched.
|
|
177
181
|
|
|
178
182
|
Example:
|
|
@@ -386,9 +390,27 @@ Putting image data to `/store/hello.jpg` will store two copies of the image unde
|
|
|
386
390
|
|
|
387
391
|
### API endpoint output operations
|
|
388
392
|
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
If
|
|
393
|
+
After all images are stored the output statement is processed.
|
|
394
|
+
It is responsible for generating HTTP response for the API endpoint.
|
|
395
|
+
If no output statement is specified the server will respond with `200 OK` and `OK` in response body.
|
|
396
|
+
|
|
397
|
+
#### output_text
|
|
398
|
+
|
|
399
|
+
This statement will produce custom `text/plain` response.
|
|
400
|
+
|
|
401
|
+
Arguments:
|
|
402
|
+
|
|
403
|
+
1. text - text to be provided in response body; you can use `#{variable}` expansion
|
|
404
|
+
|
|
405
|
+
Options:
|
|
406
|
+
|
|
407
|
+
* `status` - numerical value for HTTP response status; default: 200
|
|
408
|
+
* `cache-control` - value for the `Cache-Control` response header
|
|
409
|
+
|
|
410
|
+
#### output_ok
|
|
411
|
+
|
|
412
|
+
This is the default output if none is specified.
|
|
413
|
+
It will always produce `200` status HTTP response with `OK` in it's body.
|
|
392
414
|
|
|
393
415
|
#### output_image
|
|
394
416
|
|
|
@@ -474,7 +496,7 @@ Each output URL is `\r\n` ended.
|
|
|
474
496
|
|
|
475
497
|
Arguments:
|
|
476
498
|
|
|
477
|
-
1. image names - names of images
|
|
499
|
+
1. image names - names of images
|
|
478
500
|
|
|
479
501
|
Example:
|
|
480
502
|
|
|
@@ -686,7 +708,7 @@ put "thumbnail" ":name_list" {
|
|
|
686
708
|
# Save input image for future reprocessing
|
|
687
709
|
store_s3 "input" bucket="mybucket" path="compat-hash" public=true
|
|
688
710
|
|
|
689
|
-
# Backend classe
|
|
711
|
+
# Backend classe
|
|
690
712
|
store_s3 "original" bucket="mybucket" path="compat-hash-name" public=true cache-control="public, max-age=31557600, s-maxage=0" if-image-name-on="#{name_list}"
|
|
691
713
|
store_s3 "search" bucket="mybucket" path="compat-hash-name" public=true cache-control="public, max-age=31557600, s-maxage=0" if-image-name-on="#{name_list}"
|
|
692
714
|
store_s3 "brochure" bucket="mybucket" path="compat-hash-name" public=true cache-control="public, max-age=31557600, s-maxage=0" if-image-name-on="#{name_list}"
|
|
@@ -699,7 +721,7 @@ put "thumbnail" ":name_list" {
|
|
|
699
721
|
}
|
|
700
722
|
}
|
|
701
723
|
|
|
702
|
-
# Thumbnail on demand API
|
|
724
|
+
# Thumbnail on demand API
|
|
703
725
|
path "hash" "#{input_digest}.#{image_mime_extension}"
|
|
704
726
|
path "path" "#{path}"
|
|
705
727
|
|
|
@@ -732,7 +754,7 @@ Compatibility API example:
|
|
|
732
754
|
|
|
733
755
|
```bash
|
|
734
756
|
# Uploading image and thumbnailing to 'original' and 'brochure' classes
|
|
735
|
-
$ curl -X PUT 10.1.1.24:3000/thumbnail/original,brochure -q --data-binary @Pictures/compute.jpg
|
|
757
|
+
$ curl -X PUT 10.1.1.24:3000/thumbnail/original,brochure -q --data-binary @Pictures/compute.jpg
|
|
736
758
|
http://s3-eu-west-1.amazonaws.com/test.my.bucket/4006450256177f4a.jpg
|
|
737
759
|
http://s3-eu-west-1.amazonaws.com/test.my.bucket/4006450256177f4a/original.jpg
|
|
738
760
|
http://s3-eu-west-1.amazonaws.com/test.my.bucket/4006450256177f4a/brochure.jpg
|
|
@@ -745,7 +767,7 @@ $ curl http://s3-eu-west-1.amazonaws.com/test.my.bucket/4006450256177f4a/brochur
|
|
|
745
767
|
> User-Agent: curl/7.22.0 (x86_64-apple-darwin10.8.0) libcurl/7.22.0 OpenSSL/1.0.1c zlib/1.2.7 libidn/1.25
|
|
746
768
|
> Host: s3-eu-west-1.amazonaws.com
|
|
747
769
|
> Accept: */*
|
|
748
|
-
>
|
|
770
|
+
>
|
|
749
771
|
< HTTP/1.1 200 OK
|
|
750
772
|
< x-amz-id-2: ZXJSWlUBthbIoUXztc9GkSu7mhpGK5HK+sVXWPdbCX9+a3nVkr4A6pclH1kdKjM9
|
|
751
773
|
< x-amz-request-id: 3DD4C96B6B55B4ED
|
|
@@ -757,7 +779,7 @@ $ curl http://s3-eu-west-1.amazonaws.com/test.my.bucket/4006450256177f4a/brochur
|
|
|
757
779
|
< Content-Type: image/jpeg
|
|
758
780
|
< Content-Length: 39458
|
|
759
781
|
< Server: AmazonS3
|
|
760
|
-
<
|
|
782
|
+
<
|
|
761
783
|
{ [data not shown]
|
|
762
784
|
* Connection #0 to host s3-eu-west-1.amazonaws.com left intact
|
|
763
785
|
* Closing connection #0
|
|
@@ -770,7 +792,7 @@ On demand API example:
|
|
|
770
792
|
|
|
771
793
|
```bash
|
|
772
794
|
# Uploading image
|
|
773
|
-
$ curl -X PUT 10.1.1.24:3000/v1/original -q --data-binary @Pictures/compute.jpg
|
|
795
|
+
$ curl -X PUT 10.1.1.24:3000/v1/original -q --data-binary @Pictures/compute.jpg
|
|
774
796
|
4006450256177f4a.jpg
|
|
775
797
|
|
|
776
798
|
# Getting fit operation 100x1000 thumbnail to /tmp/test.jpg
|
|
@@ -781,7 +803,7 @@ $ curl 10.1.1.24:3000/v1/thumbnail/4006450256177f4a.jpg/fit/100/1000 -v -s -o /t
|
|
|
781
803
|
> User-Agent: curl/7.22.0 (x86_64-apple-darwin10.8.0) libcurl/7.22.0 OpenSSL/1.0.1c zlib/1.2.7 libidn/1.25
|
|
782
804
|
> Host: 10.1.1.24:3000
|
|
783
805
|
> Accept: */*
|
|
784
|
-
>
|
|
806
|
+
>
|
|
785
807
|
< HTTP/1.1 200 OK
|
|
786
808
|
< Server: nginx/1.2.9
|
|
787
809
|
< Date: Thu, 11 Jul 2013 11:26:15 GMT
|
|
@@ -790,7 +812,7 @@ $ curl 10.1.1.24:3000/v1/thumbnail/4006450256177f4a.jpg/fit/100/1000 -v -s -o /t
|
|
|
790
812
|
< Connection: keep-alive
|
|
791
813
|
< Status: 200 OK
|
|
792
814
|
< Cache-Control: public, max-age=31557600, s-maxage=0
|
|
793
|
-
<
|
|
815
|
+
<
|
|
794
816
|
{ [data not shown]
|
|
795
817
|
* Connection #0 to host 10.1.1.24 left intact
|
|
796
818
|
* Closing connection #0
|
|
@@ -806,7 +828,7 @@ $ curl 10.1.1.24:3000/v2/thumbnail/pad/100/100/4006450256177f4a.jpg?background-c
|
|
|
806
828
|
> User-Agent: curl/7.22.0 (x86_64-apple-darwin10.8.0) libcurl/7.22.0 OpenSSL/1.0.1c zlib/1.2.7 libidn/1.25
|
|
807
829
|
> Host: 10.1.1.24:3000
|
|
808
830
|
> Accept: */*
|
|
809
|
-
>
|
|
831
|
+
>
|
|
810
832
|
< HTTP/1.1 200 OK
|
|
811
833
|
< Server: nginx/1.2.9
|
|
812
834
|
< Date: Wed, 24 Jul 2013 11:38:39 GMT
|
|
@@ -815,7 +837,7 @@ $ curl 10.1.1.24:3000/v2/thumbnail/pad/100/100/4006450256177f4a.jpg?background-c
|
|
|
815
837
|
< Connection: keep-alive
|
|
816
838
|
< Status: 200 OK
|
|
817
839
|
< Cache-Control: public, max-age=31557600, s-maxage=0
|
|
818
|
-
<
|
|
840
|
+
<
|
|
819
841
|
{ [data not shown]
|
|
820
842
|
* Connection #0 to host 10.1.1.24 left intact
|
|
821
843
|
* Closing connection #0
|
|
@@ -826,7 +848,7 @@ $ identify /tmp/test.jpg
|
|
|
826
848
|
|
|
827
849
|
## Usage
|
|
828
850
|
|
|
829
|
-
After installation of the gem the `httpimagestore` executable is installed in **PATH**.
|
|
851
|
+
After installation of the gem the `httpimagestore` executable is installed in **PATH**.
|
|
830
852
|
This executable is used to start HTTP Image Service with given configuration file path as it's last argument.
|
|
831
853
|
|
|
832
854
|
### Stand alone
|
|
@@ -936,7 +958,7 @@ http {
|
|
|
936
958
|
|
|
937
959
|
client_body_buffer_size 16m;
|
|
938
960
|
client_max_body_size 128m;
|
|
939
|
-
|
|
961
|
+
|
|
940
962
|
proxy_buffering on;
|
|
941
963
|
proxy_buffer_size 64k;
|
|
942
964
|
proxy_buffers 256 64k;
|
|
@@ -978,7 +1000,7 @@ If all goes well `200 OK` will be returned otherwise:
|
|
|
978
1000
|
* uploaded image is too big to fit in memory
|
|
979
1001
|
* request body is too long
|
|
980
1002
|
* too much image data is loaded in memory
|
|
981
|
-
* memory or pixel cache limit in the thumbnailer backend has been exhausted
|
|
1003
|
+
* memory or pixel cache limit in the thumbnailer backend has been exhausted
|
|
982
1004
|
|
|
983
1005
|
### 415
|
|
984
1006
|
|
|
@@ -1025,7 +1047,7 @@ $ curl 10.1.1.24:3000/stats/total_s3_source
|
|
|
1025
1047
|
```
|
|
1026
1048
|
|
|
1027
1049
|
## Contributing to HTTP Image Store
|
|
1028
|
-
|
|
1050
|
+
|
|
1029
1051
|
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
|
|
1030
1052
|
* Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
|
|
1031
1053
|
* Fork the project
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.
|
|
1
|
+
1.5.0
|
data/bin/httpimagestore
CHANGED
|
@@ -24,8 +24,8 @@ Application.new('httpimagestore', port: 3000, processor_count_factor: 2) do
|
|
|
24
24
|
extend Stats
|
|
25
25
|
def_stats(
|
|
26
26
|
:workers,
|
|
27
|
-
:total_requests,
|
|
28
|
-
:total_errors
|
|
27
|
+
:total_requests,
|
|
28
|
+
:total_errors
|
|
29
29
|
)
|
|
30
30
|
|
|
31
31
|
raindrops_stats = Raindrops::Middleware::Stats.new
|
|
@@ -66,11 +66,25 @@ Application.new('httpimagestore', port: 3000, processor_count_factor: 2) do
|
|
|
66
66
|
write_plain 200, 'HTTP Image Store OK'
|
|
67
67
|
end
|
|
68
68
|
|
|
69
|
+
log.debug{"got request: #{env["REQUEST_METHOD"]} #{env["REQUEST_URI"]}"}
|
|
69
70
|
env['app.configuration'].handlers.each do |handler|
|
|
71
|
+
log.debug{"trying handler: #{handler.http_method}, #{handler.uri_matchers.join(', ')}"}
|
|
70
72
|
on eval(handler.http_method), *handler.uri_matchers.map{|m| instance_eval(&m.matcher)} do |*args|
|
|
71
|
-
|
|
73
|
+
log.debug{"matched handler: #{handler.http_method}, #{handler.uri_matchers.join(', ')}"}
|
|
74
|
+
# map and decode matched URI segments
|
|
72
75
|
matches = {}
|
|
73
|
-
|
|
76
|
+
names = handler.uri_matchers
|
|
77
|
+
.map do |matcher|
|
|
78
|
+
matcher.names
|
|
79
|
+
end
|
|
80
|
+
.flatten
|
|
81
|
+
|
|
82
|
+
fail "matched more arguments than named (#{args.length} for #{names.length})" if args.length > names.length
|
|
83
|
+
fail "matched less arguments than named (#{args.length} for #{names.length})" if args.length < names.length
|
|
84
|
+
|
|
85
|
+
names.zip(args)
|
|
86
|
+
.each do |name, value|
|
|
87
|
+
fail "name should be a symbol" unless name.is_a? Symbol
|
|
74
88
|
matches[name] = URI.decode(value).force_encoding('UTF-8')
|
|
75
89
|
end
|
|
76
90
|
|
|
@@ -79,7 +93,7 @@ Application.new('httpimagestore', port: 3000, processor_count_factor: 2) do
|
|
|
79
93
|
URI.decode(part).force_encoding('UTF-8')
|
|
80
94
|
end.join('/')
|
|
81
95
|
|
|
82
|
-
# query string already
|
|
96
|
+
# query string already decoded by Rack
|
|
83
97
|
query_string = req.GET
|
|
84
98
|
|
|
85
99
|
state = Configuration::RequestState.new(req.body.read, matches, path, query_string, memory_limit)
|