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