summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/controllers/attachments_controller.rb2
-rw-r--r--config/initializers/10-patches.rb14
-rw-r--r--test/integration/api_test/attachments_test.rb22
3 files changed, 37 insertions, 1 deletions
diff --git a/app/controllers/attachments_controller.rb b/app/controllers/attachments_controller.rb
index 4a880793e..c2f6481f3 100644
--- a/app/controllers/attachments_controller.rb
+++ b/app/controllers/attachments_controller.rb
@@ -101,7 +101,7 @@ class AttachmentsController < ApplicationController
return
end
- @attachment = Attachment.new(:file => request.raw_post)
+ @attachment = Attachment.new(:file => request.body)
@attachment.author = User.current
@attachment.filename = params[:filename].presence || Redmine::Utils.random_hex(16)
@attachment.content_type = params[:content_type].presence
diff --git a/config/initializers/10-patches.rb b/config/initializers/10-patches.rb
index 9af59563e..204caba9a 100644
--- a/config/initializers/10-patches.rb
+++ b/config/initializers/10-patches.rb
@@ -213,3 +213,17 @@ module ActionView
end
end
end
+
+# https://github.com/rack/rack/pull/1703
+# TODO: remove this when Rack is updated to 3.0.0
+require 'rack'
+module Rack
+ class RewindableInput
+ unless method_defined?(:size)
+ def size
+ make_rewindable unless @rewindable_io
+ @rewindable_io.size
+ end
+ end
+ end
+end
diff --git a/test/integration/api_test/attachments_test.rb b/test/integration/api_test/attachments_test.rb
index f63c2b057..7b4d60b80 100644
--- a/test/integration/api_test/attachments_test.rb
+++ b/test/integration/api_test/attachments_test.rb
@@ -229,4 +229,26 @@ class Redmine::ApiTest::AttachmentsTest < Redmine::ApiTest::Base
assert attachment.digest.present?
assert File.exist? attachment.diskfile
end
+
+ test "POST /uploads.json should be compatible with an fcgi's input" do
+ set_tmp_attachments_directory
+ assert_difference 'Attachment.count' do
+ post(
+ '/uploads.json',
+ :headers => {
+ "CONTENT_TYPE" => 'application/octet-stream',
+ "CONTENT_LENGTH" => '12',
+ "rack.input" => Rack::RewindableInput.new(StringIO.new('File content'))
+ }.merge(credentials('jsmith'))
+ )
+ assert_response :created
+ end
+ json = ActiveSupport::JSON.decode(response.body)
+ assert_kind_of Hash, json['upload']
+ token = json['upload']['token']
+ assert token.present?
+ assert attachment = Attachment.find_by_token(token)
+ assert_equal 12, attachment.filesize
+ assert File.exist? attachment.diskfile
+ end
end