rack-raw-upload 1.0.6 → 1.0.7
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/lib/rack/raw_upload.rb +32 -13
- data/test/raw_upload_test.rb +18 -10
- metadata +82 -55
data/lib/rack/raw_upload.rb
CHANGED
@@ -3,7 +3,7 @@ require 'tmpdir' # Needed in 1.8.7 to access Dir::tmpdir
|
|
3
3
|
module Rack
|
4
4
|
class RawUpload
|
5
5
|
|
6
|
-
VERSION = '1.0.
|
6
|
+
VERSION = '1.0.7'
|
7
7
|
|
8
8
|
def initialize(app, opts = {})
|
9
9
|
@app = app
|
@@ -29,19 +29,15 @@ module Rack
|
|
29
29
|
private
|
30
30
|
|
31
31
|
def convert_and_pass_on(env)
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
tempfile.
|
40
|
-
tempfile = tempfile2
|
32
|
+
if env['rack.input'].kind_of?(Tempfile)
|
33
|
+
env['rack.input'].extend(EqlFix)
|
34
|
+
tempfile = env['rack.input']
|
35
|
+
else
|
36
|
+
tempfile = create_tempfile
|
37
|
+
tempfile << env['rack.input'].read
|
38
|
+
tempfile.flush
|
39
|
+
tempfile.rewind
|
41
40
|
end
|
42
|
-
tempfile << env['rack.input'].read
|
43
|
-
tempfile.flush
|
44
|
-
tempfile.rewind
|
45
41
|
fake_file = {
|
46
42
|
:filename => env['HTTP_X_FILE_NAME'],
|
47
43
|
:type => env['CONTENT_TYPE'],
|
@@ -92,6 +88,18 @@ module Rack
|
|
92
88
|
end
|
93
89
|
end
|
94
90
|
|
91
|
+
def create_tempfile
|
92
|
+
tempfile = Tempfile.new('raw-upload.', @tmpdir)
|
93
|
+
|
94
|
+
# If the GC runs, it may unlink the tempfile.
|
95
|
+
# To avoid this, I create another version of it
|
96
|
+
# (a hard link to the same file). If the original
|
97
|
+
# is unlinked, we'll still have this other link.
|
98
|
+
ret = relink_file(tempfile)
|
99
|
+
tempfile.close
|
100
|
+
ret
|
101
|
+
end
|
102
|
+
|
95
103
|
def relink_file(file)
|
96
104
|
new_name = file.path + random_string
|
97
105
|
::File.link(file.path, new_name)
|
@@ -107,4 +115,15 @@ module Rack
|
|
107
115
|
(0...8).map{65.+(rand(25)).chr}.join
|
108
116
|
end
|
109
117
|
end
|
118
|
+
|
119
|
+
|
120
|
+
module EqlFix
|
121
|
+
def eql_with_fix?(o)
|
122
|
+
self.object_id.eql?(o.object_id) || self.eql_without_fix?(o)
|
123
|
+
end
|
124
|
+
|
125
|
+
alias_method :eql_without_fix?, :eql?
|
126
|
+
alias_method :eql?, :eql_with_fix?
|
127
|
+
end
|
128
|
+
|
110
129
|
end
|
data/test/raw_upload_test.rb
CHANGED
@@ -54,7 +54,7 @@ class RawUploadTest < Test::Unit::TestCase
|
|
54
54
|
end
|
55
55
|
|
56
56
|
should "work with Content-Type 'application/octet-stream'" do
|
57
|
-
upload
|
57
|
+
upload
|
58
58
|
assert_file_uploaded_as 'application/octet-stream'
|
59
59
|
end
|
60
60
|
|
@@ -69,7 +69,7 @@ class RawUploadTest < Test::Unit::TestCase
|
|
69
69
|
end
|
70
70
|
|
71
71
|
should "not work with Content-Type 'multipart/form-data'" do
|
72
|
-
post
|
72
|
+
post
|
73
73
|
assert_successful_non_upload
|
74
74
|
end
|
75
75
|
|
@@ -79,6 +79,14 @@ class RawUploadTest < Test::Unit::TestCase
|
|
79
79
|
post('CONTENT_TYPE' => 'multipart/form-data; stuff')
|
80
80
|
assert_successful_non_upload
|
81
81
|
end
|
82
|
+
|
83
|
+
should "work when the input is a Tempfile" do
|
84
|
+
tempfile = Tempfile.new('rack-raw-upload-test-')
|
85
|
+
tempfile << @file.read
|
86
|
+
tempfile.rewind
|
87
|
+
upload('rack.input' => tempfile)
|
88
|
+
assert_file_uploaded
|
89
|
+
end
|
82
90
|
|
83
91
|
should "be forced to perform a file upload if `X-File-Upload: true`" do
|
84
92
|
upload('CONTENT_TYPE' => 'multipart/form-data', 'HTTP_X_FILE_UPLOAD' => 'true')
|
@@ -90,8 +98,8 @@ class RawUploadTest < Test::Unit::TestCase
|
|
90
98
|
assert_successful_non_upload
|
91
99
|
end
|
92
100
|
|
93
|
-
should "
|
94
|
-
upload
|
101
|
+
should "ensure the uploaded file exists after garbage collection (Ruby 1.9)" do
|
102
|
+
upload
|
95
103
|
received = last_request.POST["file"]
|
96
104
|
GC.start
|
97
105
|
assert File.exists?(received[:tempfile].path)
|
@@ -99,7 +107,7 @@ class RawUploadTest < Test::Unit::TestCase
|
|
99
107
|
|
100
108
|
context "with X-File-Upload: smart" do
|
101
109
|
should "perform a file upload if appropriate" do
|
102
|
-
post('
|
110
|
+
post('HTTP_X_FILE_UPLOAD' => 'smart')
|
103
111
|
assert_successful_non_upload
|
104
112
|
end
|
105
113
|
|
@@ -130,7 +138,7 @@ class RawUploadTest < Test::Unit::TestCase
|
|
130
138
|
end
|
131
139
|
|
132
140
|
should "stay put when `X-File-Upload: smart` and the request is not an upload" do
|
133
|
-
post('
|
141
|
+
post('HTTP_X_FILE_UPLOAD' => 'smart')
|
134
142
|
assert_successful_non_upload
|
135
143
|
end
|
136
144
|
end
|
@@ -206,7 +214,7 @@ class RawUploadTest < Test::Unit::TestCase
|
|
206
214
|
|
207
215
|
def assert_file_uploaded
|
208
216
|
file = File.open(@path)
|
209
|
-
received = last_request.POST["file"]
|
217
|
+
assert received = last_request.POST["file"], "No file received"
|
210
218
|
assert_files_equal file, received[:tempfile]
|
211
219
|
assert last_response.ok?
|
212
220
|
end
|
@@ -225,8 +233,8 @@ class RawUploadTest < Test::Unit::TestCase
|
|
225
233
|
end
|
226
234
|
|
227
235
|
def assert_files_equal(f1, f2)
|
228
|
-
f1.
|
229
|
-
f2.
|
230
|
-
assert_equal
|
236
|
+
expected = Digest::MD5.hexdigest(IO.read(f1.path))
|
237
|
+
actual = Digest::MD5.hexdigest(IO.read(f2.path))
|
238
|
+
assert_equal expected, actual
|
231
239
|
end
|
232
240
|
end
|
metadata
CHANGED
@@ -1,70 +1,88 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-raw-upload
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 25
|
5
5
|
prerelease:
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
- 7
|
10
|
+
version: 1.0.7
|
6
11
|
platform: ruby
|
7
|
-
authors:
|
12
|
+
authors:
|
8
13
|
- Pablo Brasero
|
9
14
|
autorequire:
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
17
|
+
|
18
|
+
date: 2011-08-20 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
15
21
|
name: json
|
16
|
-
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
17
24
|
none: false
|
18
|
-
requirements:
|
19
|
-
- -
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 3
|
29
|
+
segments:
|
30
|
+
- 0
|
31
|
+
version: "0"
|
22
32
|
type: :runtime
|
23
|
-
|
24
|
-
|
25
|
-
- !ruby/object:Gem::Dependency
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
26
35
|
name: rake
|
27
|
-
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
28
38
|
none: false
|
29
|
-
requirements:
|
30
|
-
- -
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
hash: 3
|
43
|
+
segments:
|
44
|
+
- 0
|
45
|
+
version: "0"
|
33
46
|
type: :development
|
34
|
-
|
35
|
-
|
36
|
-
- !ruby/object:Gem::Dependency
|
47
|
+
version_requirements: *id002
|
48
|
+
- !ruby/object:Gem::Dependency
|
37
49
|
name: rack-test
|
38
|
-
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
39
52
|
none: false
|
40
|
-
requirements:
|
41
|
-
- -
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
hash: 3
|
57
|
+
segments:
|
58
|
+
- 0
|
59
|
+
version: "0"
|
44
60
|
type: :development
|
45
|
-
|
46
|
-
|
47
|
-
- !ruby/object:Gem::Dependency
|
61
|
+
version_requirements: *id003
|
62
|
+
- !ruby/object:Gem::Dependency
|
48
63
|
name: shoulda
|
49
|
-
|
64
|
+
prerelease: false
|
65
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
50
66
|
none: false
|
51
|
-
requirements:
|
52
|
-
- -
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
hash: 3
|
71
|
+
segments:
|
72
|
+
- 0
|
73
|
+
version: "0"
|
55
74
|
type: :development
|
56
|
-
|
57
|
-
|
58
|
-
description: Middleware that converts files uploaded with mimetype application/octet-stream
|
59
|
-
into normal form input, so Rack applications can read these as normal, rather than
|
60
|
-
as raw input.
|
75
|
+
version_requirements: *id004
|
76
|
+
description: Middleware that converts files uploaded with mimetype application/octet-stream into normal form input, so Rack applications can read these as normal, rather than as raw input.
|
61
77
|
email: pablobm@gmail.com
|
62
78
|
executables: []
|
79
|
+
|
63
80
|
extensions: []
|
64
|
-
|
81
|
+
|
82
|
+
extra_rdoc_files:
|
65
83
|
- LICENSE
|
66
84
|
- README.md
|
67
|
-
files:
|
85
|
+
files:
|
68
86
|
- lib/rack/raw_upload.rb
|
69
87
|
- lib/rack-raw-upload.rb
|
70
88
|
- test/raw_upload_test.rb
|
@@ -74,29 +92,38 @@ files:
|
|
74
92
|
- Gemfile.lock
|
75
93
|
homepage: https://github.com/newbamboo/rack-raw-upload
|
76
94
|
licenses: []
|
95
|
+
|
77
96
|
post_install_message:
|
78
|
-
rdoc_options:
|
97
|
+
rdoc_options:
|
79
98
|
- --charset=UTF-8
|
80
99
|
- --main
|
81
100
|
- README.rdoc
|
82
|
-
require_paths:
|
101
|
+
require_paths:
|
83
102
|
- lib
|
84
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
103
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
85
104
|
none: false
|
86
|
-
requirements:
|
87
|
-
- -
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
|
90
|
-
|
105
|
+
requirements:
|
106
|
+
- - ">="
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
hash: 3
|
109
|
+
segments:
|
110
|
+
- 0
|
111
|
+
version: "0"
|
112
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
91
113
|
none: false
|
92
|
-
requirements:
|
93
|
-
- -
|
94
|
-
- !ruby/object:Gem::Version
|
95
|
-
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
hash: 3
|
118
|
+
segments:
|
119
|
+
- 0
|
120
|
+
version: "0"
|
96
121
|
requirements: []
|
122
|
+
|
97
123
|
rubyforge_project:
|
98
124
|
rubygems_version: 1.8.6
|
99
125
|
signing_key:
|
100
126
|
specification_version: 3
|
101
127
|
summary: Rack Raw Upload middleware
|
102
128
|
test_files: []
|
129
|
+
|