diff --git a/lib/context_dev/file_part.rb b/lib/context_dev/file_part.rb index 58d885e4..36f6fb12 100644 --- a/lib/context_dev/file_part.rb +++ b/lib/context_dev/file_part.rb @@ -1,5 +1,7 @@ # frozen_string_literal: true +require "pathname" + module ContextDev class FilePart # @return [Pathname, StringIO, IO, String] @@ -49,7 +51,7 @@ def initialize(content, filename: nil, content_type: nil) in [nil, Pathname] content.basename.to_path in [nil, IO] - content.to_path + content.to_path&.then { ::File.basename(_1) } else filename end diff --git a/lib/context_dev/internal/util.rb b/lib/context_dev/internal/util.rb index 1c922103..3650540a 100644 --- a/lib/context_dev/internal/util.rb +++ b/lib/context_dev/internal/util.rb @@ -592,7 +592,10 @@ def encode_query_params(query) in ContextDev::FilePart unless val.filename.nil? filename = encode_path(val.filename) y << "; filename=\"#{filename}\"" - in Pathname | IO + in Pathname + filename = encode_path(::File.basename(val.to_path)) + y << "; filename=\"#{filename}\"" + in IO unless val.to_path.nil? filename = encode_path(::File.basename(val.to_path)) y << "; filename=\"#{filename}\"" else diff --git a/test/context_dev/file_part_test.rb b/test/context_dev/file_part_test.rb index a922b3d2..63fcea59 100644 --- a/test/context_dev/file_part_test.rb +++ b/test/context_dev/file_part_test.rb @@ -10,4 +10,19 @@ def test_to_json assert_equal(text.to_json, filepart.to_json) assert_equal(text.to_yaml, filepart.to_yaml) end + + def test_filename_basename_for_io + file = File.open(__FILE__) + filepart = ContextDev::FilePart.new(file) + assert_equal(File.basename(__FILE__), filepart.filename) + file.close + end + + def test_pathless_io + r, w = IO.pipe + filepart = ContextDev::FilePart.new(r) + assert_nil(filepart.filename) + r.close + w.close + end end diff --git a/test/context_dev/internal/util_test.rb b/test/context_dev/internal/util_test.rb index 1dfca4d2..226c076b 100644 --- a/test/context_dev/internal/util_test.rb +++ b/test/context_dev/internal/util_test.rb @@ -259,6 +259,21 @@ def test_file_encode end end + def test_pathless_io_encode + r, w = IO.pipe + w.write("streamed data") + w.close + headers = {"content-type" => "multipart/form-data"} + encoded = ContextDev::Internal::Util.encode_content(headers, r) + cgi = FakeCGI.new(*encoded) + io = cgi[""] + assert_pattern do + io.original_filename => "" + io.read => "streamed data" + end + r.close + end + def test_hash_encode headers = {"content-type" => "multipart/form-data"} cases = {