rack-multipart_related 0.1.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +25 -0
- data/README.md +53 -44
- data/lib/rack/multipart_related.rb +7 -3
- data/lib/rack/multipart_related/version.rb +3 -8
- data/test/rack/multipart_related_test.rb +38 -0
- metadata +74 -97
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 3cf1427a6afbd52d0afc85982e1db8d496e7582d
|
4
|
+
data.tar.gz: e0c6a2fba01f073d2081635d5e7a86942fc4f4c3
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2dfbb39f9c1f2558c3373667584957c562c345d82d4b7f940afaf232b0fef389f5a38287ca36e81d74056e2cd04625fa890693a9c92383d630e01741aae3474d
|
7
|
+
data.tar.gz: cbeb9237a57029ac2c28abb465b565a4d988b1b94853ace760100b1d2401edcfbaf2b54f8db0f5ed41693a624f9035e5035cce5ce57de2339492bbbcf945655e
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
rack-multipart_related (1.0.0)
|
5
|
+
json (>= 1.0)
|
6
|
+
rack (>= 1.0)
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: http://www.rubygems.org/
|
10
|
+
specs:
|
11
|
+
json (1.8.1)
|
12
|
+
metaclass (0.0.4)
|
13
|
+
mocha (1.0.0)
|
14
|
+
metaclass (~> 0.0.1)
|
15
|
+
rack (1.5.2)
|
16
|
+
rack-test (0.6.2)
|
17
|
+
rack (>= 1.0)
|
18
|
+
|
19
|
+
PLATFORMS
|
20
|
+
ruby
|
21
|
+
|
22
|
+
DEPENDENCIES
|
23
|
+
mocha
|
24
|
+
rack-multipart_related!
|
25
|
+
rack-test
|
data/README.md
CHANGED
@@ -6,69 +6,78 @@ Rack::MultipartRelated it's a **rack middleware** to parse **multipart/related**
|
|
6
6
|
|
7
7
|
When a ruby webserver receives a multipart/related request:
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
{"user":{"name": "Jhon", "avatar": "cid:avatar_image" }}
|
17
|
-
--the_boundary
|
18
|
-
Content-Type: image/png
|
19
|
-
Content-Disposition: inline; name="avatar_image"; filename="avatar.png"
|
20
|
-
|
21
|
-
<the binary content of image comes here>
|
22
|
-
--the_boundary--
|
9
|
+
```bash
|
10
|
+
POST /users HTTP/1.1
|
11
|
+
Content-Type: multipart/related; boundary="the_boundary"; type="application/json"; start="json"
|
12
|
+
|
13
|
+
--the_boundary
|
14
|
+
Content-Type: application/json; charset=UTF-8
|
15
|
+
Content-Disposition: inline; name="json"\r
|
23
16
|
|
17
|
+
{"user":{"name": "Jhon", "avatar": "cid:avatar_image" }}
|
18
|
+
--the_boundary
|
19
|
+
Content-Type: image/png
|
20
|
+
Content-Disposition: inline; name="avatar_image"; filename="avatar.png"
|
24
21
|
|
22
|
+
<the binary content of image comes here>
|
23
|
+
--the_boundary--
|
24
|
+
```
|
25
25
|
|
26
26
|
The parameters hash arrives like this:
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
28
|
+
```ruby
|
29
|
+
{
|
30
|
+
"json" => {
|
31
|
+
:type => "application/json; charset=UTF-8",
|
32
|
+
:tempfile => <File:/var/folders/Iu/IuwHUNlZE8OaYMACfwiapE+++TI/-Tmp-/RackMultipart20101217-30578-l17vkd-0>, # The json content
|
33
|
+
:head => "Content-Type: application/json; charset=UTF-8\r\nContent-Disposition: inline; name=\"json\"\r\n",
|
34
|
+
:name => "json"
|
35
|
+
},
|
36
|
+
"avatar_image" => {
|
37
|
+
:type => "image/png",
|
38
|
+
:filename =>"image.png",
|
39
|
+
:tempfile => <File:/var/folders/Iu/IuwHUNlZE8OaYMACfwiapE+++TI/-Tmp-/RackMultipart20101217-30578-bt18q9-0>, # The binary content of image
|
40
|
+
:head => "Content-Type: image/gif\r\nContent-Disposition: inline; name=\"avatar_image\"; filename=\"image.png\"\r\n",
|
41
|
+
:name =>"avatar_image"
|
42
|
+
}
|
43
|
+
}
|
44
|
+
```
|
43
45
|
|
44
46
|
Pay attention that the second part of the 'request' (in our example, "avatar\_image") needs to be referenced in the first part (in the example, "json") as "cid:REFERENCE\_NAME\_OF\_THE\_SECOND\_PART"
|
45
47
|
|
46
48
|
Using this middleware, the hash above is parsed and rebuilt like the code below:
|
47
49
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
}
|
50
|
+
```ruby
|
51
|
+
{
|
52
|
+
"user" => {
|
53
|
+
"name" => "Jhon",
|
54
|
+
"avatar" => {
|
55
|
+
:type => "image/png",
|
56
|
+
:filename =>"image.png",
|
57
|
+
:tempfile => <File:/var/folders/Iu/IuwHUNlZE8OaYMACfwiapE+++TI/-Tmp-/RackMultipart20101217-30578-bt18q9-0>, # The binary content of image
|
58
|
+
:head => "Content-Type: image/gif\r\nContent-Disposition: inline; name=\"avatar_image\"; filename=\"image.png\"\r\n",
|
59
|
+
:name =>"avatar_image"
|
59
60
|
}
|
61
|
+
}
|
62
|
+
}
|
63
|
+
```
|
60
64
|
|
61
65
|
## Usage
|
62
66
|
|
63
67
|
### Rails apps
|
64
68
|
|
65
69
|
In your Gemfile:
|
66
|
-
|
67
|
-
|
70
|
+
|
71
|
+
```bash
|
72
|
+
gem 'rack-multipart_related'
|
73
|
+
```
|
74
|
+
|
68
75
|
In your environment.rb:
|
69
76
|
|
70
|
-
|
71
|
-
|
77
|
+
```ruby
|
78
|
+
require 'rack/multipart_related'
|
79
|
+
config.middleware.use Rack::MultipartRelated
|
80
|
+
```
|
72
81
|
|
73
82
|
### Non-Rails apps
|
74
83
|
|
@@ -20,9 +20,13 @@ module Rack
|
|
20
20
|
|
21
21
|
params = env["rack.request.form_hash"]
|
22
22
|
start_part_attribute = get_attribute(params, start_part)
|
23
|
-
|
24
|
-
|
25
|
-
|
23
|
+
if start_part_attribute.is_a? String then
|
24
|
+
json_data = ::JSON.parse(start_part_attribute)
|
25
|
+
else
|
26
|
+
json_data = ::JSON.parse(start_part_attribute[:tempfile].read)
|
27
|
+
start_part_attribute[:tempfile].rewind
|
28
|
+
env['START_CONTENT_TYPE'] ||= start_part_attribute[:type]
|
29
|
+
end
|
26
30
|
|
27
31
|
new_params = handle_atributtes_with_part_refs(json_data, params)
|
28
32
|
env["rack.request.form_hash"] = new_params
|
@@ -1,12 +1,7 @@
|
|
1
1
|
module Rack
|
2
2
|
class MultipartRelated
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
require "step-up"
|
7
|
-
version = StepUp::Driver::Git.last_version
|
8
|
-
end
|
9
|
-
version = "0.0.0" if version.nil?
|
10
|
-
VERSION = version.gsub(/^v?([^\+]+)\+?\d*$/, '\1')
|
3
|
+
|
4
|
+
VERSION = "1.0.0"
|
5
|
+
|
11
6
|
end
|
12
7
|
end
|
@@ -73,6 +73,44 @@ class MultipartRelatedTest < Test::Unit::TestCase
|
|
73
73
|
assert last_response.ok?
|
74
74
|
assert_equal last_request.env["rack.request.form_hash"], expected_request_form_hash_after_middleware
|
75
75
|
end
|
76
|
+
|
77
|
+
def test_multipart_related_with_json_notin_tempfile
|
78
|
+
request_form_hash = {
|
79
|
+
"json" => '{"user": {"name": "Jhon", "avatar": "cid:avatar_image"} }',
|
80
|
+
"avatar_image" => {
|
81
|
+
:type => "image/png",
|
82
|
+
:filename =>"image.png",
|
83
|
+
:tempfile => imagefile,
|
84
|
+
:head => "Content-Type: image/gif\r\nContent-Disposition: inline; name=\"avatar_image\"; filename=\"image.png\"\r\n",
|
85
|
+
:name =>"avatar_image"
|
86
|
+
}
|
87
|
+
}
|
88
|
+
|
89
|
+
expected_request_form_hash_after_middleware = {
|
90
|
+
"user" => {
|
91
|
+
"name" => "Jhon",
|
92
|
+
"avatar" => {
|
93
|
+
:type => "image/png",
|
94
|
+
:filename =>"image.png",
|
95
|
+
:tempfile => imagefile,
|
96
|
+
:head => "Content-Type: image/gif\r\nContent-Disposition: inline; name=\"avatar_image\"; filename=\"image.png\"\r\n",
|
97
|
+
:name =>"avatar_image"
|
98
|
+
}
|
99
|
+
}
|
100
|
+
}
|
101
|
+
|
102
|
+
env = {
|
103
|
+
'REQUEST_METHOD' => 'POST',
|
104
|
+
'CONTENT_TYPE' => 'multipart/related; boundary="the_boundary"; type=application/json; start=json',
|
105
|
+
'PATH_INFO' => '/some/path',
|
106
|
+
'rack.request.form_hash' => request_form_hash
|
107
|
+
}
|
108
|
+
|
109
|
+
request(env['PATH_INFO'], env)
|
110
|
+
|
111
|
+
assert last_response.ok?
|
112
|
+
assert_equal last_request.env["rack.request.form_hash"], expected_request_form_hash_after_middleware
|
113
|
+
end
|
76
114
|
|
77
115
|
def test_multipart_related_with_start_and_type_without_quotes
|
78
116
|
jsonfile = make_tempfile("json", '{"user": {"name": "Jhon", "avatar": "cid:avatar_image"} }')
|
metadata
CHANGED
@@ -1,93 +1,83 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-multipart_related
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease: false
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 1
|
9
|
-
- 0
|
10
|
-
version: 0.1.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
11
5
|
platform: ruby
|
12
|
-
authors:
|
6
|
+
authors:
|
13
7
|
- Lucas Fais
|
14
8
|
- Marcelo Manzan
|
15
9
|
autorequire:
|
16
10
|
bindir: bin
|
17
11
|
cert_chain: []
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
dependencies:
|
22
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2014-03-28 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
23
15
|
name: rack
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
- !ruby/object:Gem::Version
|
30
|
-
hash: 15
|
31
|
-
segments:
|
32
|
-
- 1
|
33
|
-
- 0
|
34
|
-
version: "1.0"
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - '>='
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '1.0'
|
35
21
|
type: :runtime
|
36
|
-
version_requirements: *id001
|
37
|
-
- !ruby/object:Gem::Dependency
|
38
|
-
name: json
|
39
22
|
prerelease: false
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - '>='
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '1.0'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: json
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - '>='
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '1.0'
|
50
35
|
type: :runtime
|
51
|
-
version_requirements: *id002
|
52
|
-
- !ruby/object:Gem::Dependency
|
53
|
-
name: step-up
|
54
36
|
prerelease: false
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
segments:
|
62
|
-
- 0
|
63
|
-
version: "0"
|
64
|
-
type: :development
|
65
|
-
version_requirements: *id003
|
66
|
-
- !ruby/object:Gem::Dependency
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - '>='
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '1.0'
|
42
|
+
- !ruby/object:Gem::Dependency
|
67
43
|
name: mocha
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - '>='
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
type: :development
|
68
50
|
prerelease: false
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: rack-test
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
78
63
|
type: :development
|
79
|
-
|
80
|
-
|
81
|
-
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
description: It's a rack middleware to parse multipart/related requests and rebuild
|
71
|
+
a simple/merged parameters hash.
|
72
|
+
email:
|
82
73
|
- lucasfais@gmail.com
|
83
74
|
- manzan@gmail.com
|
84
75
|
executables: []
|
85
|
-
|
86
76
|
extensions: []
|
87
|
-
|
88
77
|
extra_rdoc_files: []
|
89
|
-
|
90
|
-
|
78
|
+
files:
|
79
|
+
- Gemfile
|
80
|
+
- Gemfile.lock
|
91
81
|
- README.md
|
92
82
|
- Rakefile
|
93
83
|
- lib/rack/multipart_related.rb
|
@@ -95,43 +85,30 @@ files:
|
|
95
85
|
- test/rack/multipart_related_test.rb
|
96
86
|
- test/resources/image.png
|
97
87
|
- test/test_helper.rb
|
98
|
-
has_rdoc: true
|
99
88
|
homepage: https://github.com/lucasfais/rack-multipart_related
|
100
89
|
licenses: []
|
101
|
-
|
90
|
+
metadata: {}
|
102
91
|
post_install_message:
|
103
92
|
rdoc_options: []
|
104
|
-
|
105
|
-
require_paths:
|
93
|
+
require_paths:
|
106
94
|
- lib
|
107
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
117
|
-
none: false
|
118
|
-
requirements:
|
119
|
-
- - ">="
|
120
|
-
- !ruby/object:Gem::Version
|
121
|
-
hash: 23
|
122
|
-
segments:
|
123
|
-
- 1
|
124
|
-
- 3
|
125
|
-
- 6
|
95
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - '>='
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
100
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - '>='
|
103
|
+
- !ruby/object:Gem::Version
|
126
104
|
version: 1.3.6
|
127
105
|
requirements: []
|
128
|
-
|
129
106
|
rubyforge_project: rack-multipart_related
|
130
|
-
rubygems_version:
|
107
|
+
rubygems_version: 2.0.3
|
131
108
|
signing_key:
|
132
|
-
specification_version:
|
109
|
+
specification_version: 4
|
133
110
|
summary: Makes easy to handle mutipart/related requests.
|
134
|
-
test_files:
|
111
|
+
test_files:
|
135
112
|
- test/rack/multipart_related_test.rb
|
136
113
|
- test/resources/image.png
|
137
114
|
- test/test_helper.rb
|