Skip to content

Commit 9de7c78

Browse files
committed
Remove uploaded data from multipart request body
See #39
1 parent fe8bf36 commit 9de7c78

File tree

5 files changed

+113
-0
lines changed

5 files changed

+113
-0
lines changed

features/fixtures/file.png

150 Bytes
Loading
+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
Given /^I move the sample image into the workspace$/ do
2+
FileUtils.cp("features/fixtures/file.png", current_dir)
3+
end
4+
5+
Then /^the generated documentation should be encoded correctly$/ do
6+
file = File.read(File.join(current_dir, "doc", "api", "foobars", "uploading_a_file.html"))
7+
file.should =~ /file\.png/
8+
end

features/upload_file.feature

+85
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
Feature: Uploading a file
2+
Background:
3+
Given a file named "app.rb" with:
4+
"""
5+
require 'rack'
6+
7+
class App
8+
def self.call(env)
9+
request = Rack::Request.new(env)
10+
[200, {}, [request.params["file"][:filename]]]
11+
end
12+
end
13+
"""
14+
15+
Scenario: Uploading a text file
16+
Given a file named "file.txt" with:
17+
"""
18+
a file to upload
19+
"""
20+
And a file named "app_spec.rb" with:
21+
"""
22+
require "rspec_api_documentation"
23+
require "rspec_api_documentation/dsl"
24+
require "rack/test"
25+
26+
RspecApiDocumentation.configure do |config|
27+
config.app = App
28+
end
29+
30+
resource "FooBars" do
31+
post "/foobar" do
32+
parameter :name, "Name of file"
33+
parameter :file, "File to upload"
34+
35+
let(:name) { "my-new-file.txt" }
36+
let(:file) do
37+
Rack::Test::UploadedFile.new("file.txt", "text/plain")
38+
end
39+
40+
example_request "Uploading a file" do
41+
response_body.should == "file.txt"
42+
end
43+
end
44+
end
45+
"""
46+
47+
When I run `rspec app_spec.rb --require ./app.rb --format RspecApiDocumentation::ApiFormatter`
48+
49+
Then the output should contain "1 example, 0 failures"
50+
And the exit status should be 0
51+
52+
Scenario: Uploading an image file
53+
Given I move the sample image into the workspace
54+
And a file named "app_spec.rb" with:
55+
"""
56+
require "rspec_api_documentation"
57+
require "rspec_api_documentation/dsl"
58+
require "rack/test"
59+
60+
RspecApiDocumentation.configure do |config|
61+
config.app = App
62+
end
63+
64+
resource "FooBars" do
65+
post "/foobar" do
66+
parameter :name, "Name of file"
67+
parameter :file, "File to upload"
68+
69+
let(:name) { "my-new-file.txt" }
70+
let(:file) do
71+
Rack::Test::UploadedFile.new("file.png", "image/png")
72+
end
73+
74+
example_request "Uploading a file" do
75+
response_body.should == "file.png"
76+
end
77+
end
78+
end
79+
"""
80+
81+
When I run `rspec app_spec.rb --require ./app.rb --format RspecApiDocumentation::ApiFormatter`
82+
83+
Then the output should contain "1 example, 0 failures"
84+
And the exit status should be 0
85+
And the generated documentation should be encoded correctly

lib/rspec_api_documentation/client_base.rb

+4
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ def document_example(method, path)
4949

5050
request_metadata = {}
5151

52+
if request_content_type =~ /multipart\/form-data/ && respond_to?(:handle_multipart_body, true)
53+
request_body = handle_multipart_body(request_headers, request_body)
54+
end
55+
5256
request_metadata[:request_method] = method
5357
request_metadata[:request_path] = path
5458
request_metadata[:request_body] = request_body.empty? ? nil : request_body

lib/rspec_api_documentation/rack_test_client.rb

+16
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,22 @@ def headers(*args)
4242
headers_to_env(super)
4343
end
4444

45+
def handle_multipart_body(request_headers, request_body)
46+
parsed_parameters = Rack::Request.new({
47+
"CONTENT_TYPE" => request_headers["Content-Type"],
48+
"rack.input" => StringIO.new(request_body)
49+
}).params
50+
51+
parsed_parameters.each do |_, value|
52+
if value.is_a?(Hash) && value.has_key?(:tempfile)
53+
data = value[:tempfile].read
54+
request_body = request_body.gsub(data, "[uploaded data]")
55+
end
56+
end
57+
58+
request_body
59+
end
60+
4561
private
4662

4763
def rack_test_session

0 commit comments

Comments
 (0)