From 5b730aa631c626a7feb4005f26722ec9ec8ebb79 Mon Sep 17 00:00:00 2001 From: Go MAEDA Date: Wed, 12 May 2021 02:34:16 +0000 Subject: [PATCH] Merged r20993 from trunk to 4.2-stable (#33752). git-svn-id: http://svn.redmine.org/redmine/branches/4.2-stable@20994 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/controllers/attachments_controller.rb | 2 +- config/initializers/10-patches.rb | 14 ++++++++++++ test/integration/api_test/attachments_test.rb | 22 +++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/app/controllers/attachments_controller.rb b/app/controllers/attachments_controller.rb index 1956f01e3..8e28194a3 100644 --- a/app/controllers/attachments_controller.rb +++ b/app/controllers/attachments_controller.rb @@ -105,7 +105,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 545dd81f2..538649950 100644 --- a/test/integration/api_test/attachments_test.rb +++ b/test/integration/api_test/attachments_test.rb @@ -250,4 +250,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 -- 2.39.5