multipart-post 1.1.2 → 1.1.3

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.
@@ -11,7 +11,7 @@
11
11
  #
12
12
  # crio = CompositeReadIO.new(StringIO.new('one'), StringIO.new('two'), StringIO.new('three'))
13
13
  # puts crio.read # => "onetwothree"
14
- #
14
+ #
15
15
  class CompositeReadIO
16
16
  # Create a new composite-read IO from the arguments, all of which should
17
17
  # respond to #read in a manner consistent with IO.
@@ -54,15 +54,21 @@ class UploadIO
54
54
  # Net::HTTP::Post::Multipart.
55
55
  #
56
56
  # Can take two forms. The first accepts a filename and content type, and
57
- # opens the file for reading (to be closed by finalizer). The second accepts
58
- # an already-open IO, but also requires a third argument, the filename from
59
- # which it was opened.
57
+ # opens the file for reading (to be closed by finalizer).
58
+ #
59
+ # The second accepts an already-open IO, but also requires a third argument,
60
+ # the filename from which it was opened (particularly useful/recommended if
61
+ # uploading directly from a form in a framework, which often save the file to
62
+ # an arbitrarily named RackMultipart file in /tmp).
63
+ #
64
+ # Usage:
60
65
  #
61
66
  # UploadIO.new("file.txt", "text/plain")
62
67
  # UploadIO.new(file_io, "text/plain", "file.txt")
63
- attr_reader :content_type, :original_filename, :local_path, :io
68
+ #
69
+ attr_reader :content_type, :original_filename, :local_path, :io, :opts
64
70
 
65
- def initialize(filename_or_io, content_type, filename = nil)
71
+ def initialize(filename_or_io, content_type, filename = nil, opts = {})
66
72
  io = filename_or_io
67
73
  local_path = ""
68
74
  if io.respond_to? :read
@@ -79,6 +85,7 @@ class UploadIO
79
85
  @original_filename = File.basename(filename)
80
86
  @local_path = local_path
81
87
  @io = io
88
+ @opts = opts
82
89
  end
83
90
 
84
91
  def self.convert!(io, content_type, original_filename, local_path)
@@ -6,7 +6,8 @@ require 'parts'
6
6
  parts = params.map {|k,v| Parts::Part.new(boundary, k, v)}
7
7
  parts << Parts::EpiloguePart.new(boundary)
8
8
  ios = parts.map{|p| p.to_io }
9
- self.set_content_type("multipart/form-data", { "boundary" => boundary })
9
+ self.set_content_type(headers["Content-Type"] || "multipart/form-data",
10
+ { "boundary" => boundary })
10
11
  self.content_length = parts.inject(0) {|sum,i| sum + i.length }
11
12
  self.body_stream = CompositeReadIO.new(*ios)
12
13
  end
@@ -39,19 +39,26 @@ module Parts
39
39
  attr_reader :length
40
40
  def initialize(boundary, name, io)
41
41
  file_length = io.respond_to?(:length) ? io.length : File.size(io.local_path)
42
- @head = build_head(boundary, name, io.original_filename, io.content_type, file_length)
42
+ @head = build_head(boundary, name, io.original_filename, io.content_type, file_length,
43
+ io.respond_to?(:opts) ? io.opts : {})
43
44
  @foot = "\r\n"
44
45
  @length = @head.length + file_length + @foot.length
45
46
  @io = CompositeReadIO.new(StringIO.new(@head), io, StringIO.new(@foot))
46
47
  end
47
48
 
48
- def build_head(boundary, name, filename, type, content_len)
49
+ def build_head(boundary, name, filename, type, content_len, opts = {})
50
+ trans_encoding = opts["Content-Transfer-Encoding"] || "binary"
51
+ content_disposition = opts["Content-Disposition"] || "form-data"
52
+
49
53
  part = ''
50
54
  part << "--#{boundary}\r\n"
51
- part << "Content-Disposition: form-data; name=\"#{name.to_s}\"; filename=\"#{filename}\"\r\n"
55
+ part << "Content-Disposition: #{content_disposition}; name=\"#{name.to_s}\"; filename=\"#{filename}\"\r\n"
52
56
  part << "Content-Length: #{content_len}\r\n"
57
+ if content_id = opts["Content-ID"]
58
+ part << "Content-ID: #{content_id}\r\n"
59
+ end
53
60
  part << "Content-Type: #{type}\r\n"
54
- part << "Content-Transfer-Encoding: binary\r\n"
61
+ part << "Content-Transfer-Encoding: #{trans_encoding}\r\n"
55
62
  part << "\r\n"
56
63
  end
57
64
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: multipart-post
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 1.1.2
5
+ version: 1.1.3
6
6
  platform: ruby
7
7
  authors:
8
8
  - Nick Sieger
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-05-24 00:00:00 Z
13
+ date: 2011-07-25 00:00:00 Z
14
14
  dependencies: []
15
15
 
16
16
  description: "Use with Net::HTTP to do multipart form posts. IO values that have #content_type, #original_filename, and #local_path will be posted as a binary file."
@@ -47,7 +47,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
47
47
  requirements:
48
48
  - - ">="
49
49
  - !ruby/object:Gem::Version
50
- hash: 2078343466590708221
50
+ hash: 1793835851156969378
51
51
  segments:
52
52
  - 0
53
53
  version: "0"