multipart-post 2.0.0 → 2.2.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.
data/lib/parts.rb CHANGED
@@ -1,96 +1,2 @@
1
- #--
2
- # Copyright (c) 2007-2013 Nick Sieger.
3
- # See the file README.txt included with the distribution for
4
- # software license details.
5
- #++
6
-
7
- module Parts
8
- module Part #:nodoc:
9
- def self.new(boundary, name, value, headers = {})
10
- headers ||= {} # avoid nil values
11
- if file?(value)
12
- FilePart.new(boundary, name, value, headers)
13
- else
14
- ParamPart.new(boundary, name, value, headers)
15
- end
16
- end
17
-
18
- def self.file?(value)
19
- value.respond_to?(:content_type) && value.respond_to?(:original_filename)
20
- end
21
-
22
- def length
23
- @part.length
24
- end
25
-
26
- def to_io
27
- @io
28
- end
29
- end
30
-
31
- class ParamPart
32
- include Part
33
- def initialize(boundary, name, value, headers = {})
34
- @part = build_part(boundary, name, value, headers)
35
- @io = StringIO.new(@part)
36
- end
37
-
38
- def length
39
- @part.bytesize
40
- end
41
-
42
- def build_part(boundary, name, value, headers = {})
43
- part = ''
44
- part << "--#{boundary}\r\n"
45
- part << "Content-Disposition: form-data; name=\"#{name.to_s}\"\r\n"
46
- part << "Content-Type: #{headers["Content-Type"]}\r\n" if headers["Content-Type"]
47
- part << "\r\n"
48
- part << "#{value}\r\n"
49
- end
50
- end
51
-
52
- # Represents a part to be filled from file IO.
53
- class FilePart
54
- include Part
55
- attr_reader :length
56
- def initialize(boundary, name, io, headers = {})
57
- file_length = io.respond_to?(:length) ? io.length : File.size(io.local_path)
58
- @head = build_head(boundary, name, io.original_filename, io.content_type, file_length,
59
- io.respond_to?(:opts) ? io.opts.merge(headers) : headers)
60
- @foot = "\r\n"
61
- @length = @head.bytesize + file_length + @foot.length
62
- @io = CompositeReadIO.new(StringIO.new(@head), io, StringIO.new(@foot))
63
- end
64
-
65
- def build_head(boundary, name, filename, type, content_len, opts = {}, headers = {})
66
- trans_encoding = opts["Content-Transfer-Encoding"] || "binary"
67
- content_disposition = opts["Content-Disposition"] || "form-data"
68
-
69
- part = ''
70
- part << "--#{boundary}\r\n"
71
- part << "Content-Disposition: #{content_disposition}; name=\"#{name.to_s}\"; filename=\"#{filename}\"\r\n"
72
- part << "Content-Length: #{content_len}\r\n"
73
- if content_id = opts["Content-ID"]
74
- part << "Content-ID: #{content_id}\r\n"
75
- end
76
-
77
- if headers["Content-Type"] != nil
78
- part << "Content-Type: " + headers["Content-Type"] + "\r\n"
79
- else
80
- part << "Content-Type: #{type}\r\n"
81
- end
82
-
83
- part << "Content-Transfer-Encoding: #{trans_encoding}\r\n"
84
- part << "\r\n"
85
- end
86
- end
87
-
88
- # Represents the epilogue or closing boundary.
89
- class EpiloguePart
90
- include Part
91
- def initialize(boundary)
92
- @part = "--#{boundary}--\r\n\r\n"
93
- @io = StringIO.new(@part)
94
- end
95
- end
96
- end
1
+ warn "Top level ::Parts is deprecated, require 'multipart/post' and use `Multipart::Post::Parts` instead!"
2
+ require_relative 'multipart/post'
data.tar.gz.sig ADDED
Binary file
metadata CHANGED
@@ -1,79 +1,144 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: multipart-post
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
5
- prerelease:
4
+ version: 2.2.3
6
5
  platform: ruby
7
6
  authors:
8
7
  - Nick Sieger
9
- autorequire:
8
+ - Samuel Williams
9
+ - Olle Jonsson
10
+ - McClain Looney
11
+ - Lewis Cowles
12
+ - Gustav Ernberg
13
+ - Patrick Davey
14
+ - Steven Davidovitz
15
+ - Alex Koppel
16
+ - Ethan Turkeltaub
17
+ - Jagtesh Chadha
18
+ - Jason York
19
+ - Nick
20
+ - VincWebwag
21
+ - hasimo
22
+ - hexfet
23
+ - Christine Yen
24
+ - David Moles
25
+ - Eric Hutzelman
26
+ - Feuda Nan
27
+ - Gerrit Riessen
28
+ - Jan Piotrowski
29
+ - Jan-Joost Spanjers
30
+ - Jason Moore
31
+ - Jeff Hodges
32
+ - Johannes Wagener
33
+ - Jordi Massaguer Pla
34
+ - Lachlan Priest
35
+ - Leo Cassarani
36
+ - Lonre Wang
37
+ - Luke Redpath
38
+ - Matt Colyer
39
+ - Mislav Marohnić
40
+ - Socrates Vicente
41
+ - Steffen Grunwald
42
+ - Tim Barkley
43
+ autorequire:
10
44
  bindir: bin
11
- cert_chain: []
12
- date: 2013-12-21 00:00:00.000000000 Z
13
- dependencies: []
14
- description: ! 'Use with Net::HTTP to do multipart form posts. IO values that have
15
- #content_type, #original_filename, and #local_path will be posted as a binary file.'
45
+ cert_chain:
46
+ - |
47
+ -----BEGIN CERTIFICATE-----
48
+ MIIEhDCCAuygAwIBAgIBATANBgkqhkiG9w0BAQsFADA3MTUwMwYDVQQDDCxzYW11
49
+ ZWwud2lsbGlhbXMvREM9b3Jpb250cmFuc2Zlci9EQz1jby9EQz1uejAeFw0yMTA4
50
+ MTYwNjMzNDRaFw0yMjA4MTYwNjMzNDRaMDcxNTAzBgNVBAMMLHNhbXVlbC53aWxs
51
+ aWFtcy9EQz1vcmlvbnRyYW5zZmVyL0RDPWNvL0RDPW56MIIBojANBgkqhkiG9w0B
52
+ AQEFAAOCAY8AMIIBigKCAYEAyXLSS/cw+fXJ5e7hi+U/TeChPWeYdwJojDsFY1xr
53
+ xvtqbTTL8gbLHz5LW3QD2nfwCv3qTlw0qI3Ie7a9VMJMbSvgVEGEfQirqIgJXWMj
54
+ eNMDgKsMJtC7u/43abRKx7TCURW3iWyR19NRngsJJmaR51yGGGm2Kfsr+JtKKLtL
55
+ L188Wm3f13KAx7QJU8qyuBnj1/gWem076hzdA7xi1DbrZrch9GCRz62xymJlrJHn
56
+ 9iZEZ7AxrS7vokhMlzSr/XMUihx/8aFKtk+tMLClqxZSmBWIErWdicCGTULXCBNb
57
+ E/mljo4zEVKhlTWpJklMIhr55ZRrSarKFuW7en0+tpJrfsYiAmXMJNi4XAYJH7uL
58
+ rgJuJwSaa/dMz+VmUoo7VKtSfCoOI+6v5/z0sK3oT6sG6ZwyI47DBq2XqNC6tnAj
59
+ w+XmCywiTQrFzMMAvcA7rPI4F0nU1rZId51rOvvfxaONp+wgTi4P8owZLw0/j0m4
60
+ 8C20DYi6EYx4AHDXiLpElWh3AgMBAAGjgZowgZcwCQYDVR0TBAIwADALBgNVHQ8E
61
+ BAMCBLAwHQYDVR0OBBYEFB6ZaeWKxQjGTI+pmz7cKRmMIywwMC4GA1UdEQQnMCWB
62
+ I3NhbXVlbC53aWxsaWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56MC4GA1UdEgQnMCWB
63
+ I3NhbXVlbC53aWxsaWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56MA0GCSqGSIb3DQEB
64
+ CwUAA4IBgQBVoM+pu3dpdUhZM1w051iw5GfiqclAr1Psypf16Tiod/ho//4oAu6T
65
+ 9fj3DPX/acWV9P/FScvqo4Qgv6g4VWO5ZU7z2JmPoTXZtYMunRAmQPFL/gSUc6aK
66
+ vszMHIyhtyzRc6DnfW2AiVOjMBjaYv8xXZc9bduniRVPrLR4J7ozmGLh4o4uJp7w
67
+ x9KCFaR8Lvn/r0oJWJOqb/DMAYI83YeN2Dlt3jpwrsmsONrtC5S3gOUle5afSGos
68
+ bYt5ocnEpKSomR9ZtnCGljds/aeO1Xgpn2r9HHcjwnH346iNrnHmMlC7BtHUFPDg
69
+ Ts92S47PTOXzwPBDsrFiq3VLbRjHSwf8rpqybQBH9MfzxGGxTaETQYOd6b4e4Ag6
70
+ y92abGna0bmIEb4+Tx9rQ10Uijh1POzvr/VTH4bbIPy9FbKrRsIQ24qDbNJRtOpE
71
+ RAOsIl+HOBTb252nx1kIRN5hqQx272AJCbCjKx8egcUQKffFVVCI0nye09v5CK+a
72
+ HiLJ8VOFx6w=
73
+ -----END CERTIFICATE-----
74
+ date: 2022-06-10 00:00:00.000000000 Z
75
+ dependencies:
76
+ - !ruby/object:Gem::Dependency
77
+ name: bundler
78
+ requirement: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ type: :development
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ - !ruby/object:Gem::Dependency
91
+ name: rspec
92
+ requirement: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.4'
97
+ type: :development
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '3.4'
104
+ description:
16
105
  email:
17
- - nick@nicksieger.com
18
106
  executables: []
19
107
  extensions: []
20
108
  extra_rdoc_files: []
21
109
  files:
22
- - .gitignore
23
- - .travis.yml
24
- - Gemfile
25
- - History.txt
26
- - Manifest.txt
27
- - README.md
28
- - Rakefile
29
110
  - lib/composite_io.rb
111
+ - lib/multipart/post.rb
112
+ - lib/multipart/post/composite_read_io.rb
113
+ - lib/multipart/post/multipartable.rb
114
+ - lib/multipart/post/parts.rb
115
+ - lib/multipart/post/upload_io.rb
116
+ - lib/multipart/post/version.rb
30
117
  - lib/multipart_post.rb
31
118
  - lib/multipartable.rb
32
119
  - lib/net/http/post/multipart.rb
33
120
  - lib/parts.rb
34
- - multipart-post.gemspec
35
- - test/multibyte.txt
36
- - test/net/http/post/test_multipart.rb
37
- - test/test_composite_io.rb
38
- - test/test_parts.rb
39
- homepage: https://github.com/nicksieger/multipart-post
121
+ homepage: https://github.com/socketry/multipart-post
40
122
  licenses:
41
123
  - MIT
42
- post_install_message:
43
- rdoc_options:
44
- - --main
45
- - README.md
46
- - -SHN
47
- - -f
48
- - darkfish
124
+ metadata: {}
125
+ post_install_message:
126
+ rdoc_options: []
49
127
  require_paths:
50
128
  - lib
51
129
  required_ruby_version: !ruby/object:Gem::Requirement
52
- none: false
53
130
  requirements:
54
- - - ! '>='
131
+ - - ">="
55
132
  - !ruby/object:Gem::Version
56
- version: '0'
57
- segments:
58
- - 0
59
- hash: 3851181222699685043
133
+ version: 2.3.0
60
134
  required_rubygems_version: !ruby/object:Gem::Requirement
61
- none: false
62
135
  requirements:
63
- - - ! '>='
136
+ - - ">="
64
137
  - !ruby/object:Gem::Version
65
138
  version: '0'
66
- segments:
67
- - 0
68
- hash: 3851181222699685043
69
139
  requirements: []
70
- rubyforge_project: caldersphere
71
- rubygems_version: 1.8.23
72
- signing_key:
73
- specification_version: 3
140
+ rubygems_version: 3.1.6
141
+ signing_key:
142
+ specification_version: 4
74
143
  summary: A multipart form post accessory for Net::HTTP.
75
- test_files:
76
- - test/multibyte.txt
77
- - test/net/http/post/test_multipart.rb
78
- - test/test_composite_io.rb
79
- - test/test_parts.rb
144
+ test_files: []
metadata.gz.sig ADDED
Binary file
data/.gitignore DELETED
@@ -1,6 +0,0 @@
1
- doc
2
- pkg
3
- *~
4
- *.swo
5
- *.swp
6
- /Gemfile.lock
data/.travis.yml DELETED
@@ -1,7 +0,0 @@
1
- rvm:
2
- - 1.9.3
3
- - 2.0.0
4
- - jruby
5
- branches:
6
- only:
7
- - master
data/Gemfile DELETED
@@ -1,14 +0,0 @@
1
- source 'https://rubygems.org'
2
- gemspec
3
-
4
- platforms :mri_19 do
5
- gem 'ruby-debug19'
6
- end
7
-
8
- platforms :mri_18 do
9
- gem 'ruby-debug'
10
- end
11
-
12
- group :development, :test do
13
- gem 'rake'
14
- end
data/History.txt DELETED
@@ -1,60 +0,0 @@
1
- === 2.0.0 / 2013-12-21
2
-
3
- - Drop Ruby 1.8 compatibility
4
- - GH #21: Fix FilePart length calculation for Ruby 1.9 when filename contains
5
- multibyte characters (hexfet)
6
- - GH #20: Ensure upload responds to both #content_type and #original_filename
7
- (Steven Davidovitz)
8
- - GH #31: Support setting headers on any part of the request (Socrates Vicente)
9
- - GH #30: Support array values for params (Gustav Ernberg)
10
- - GH #32: Fix respond_to? signature (Leo Cassarani)
11
- - GH #33: Update README to markdown (Jagtesh Chadha)
12
- - GH #35: Improved handling of array-type parameters (Steffen Grunwald)
13
-
14
- === 1.2.0 / 2013-02-25
15
-
16
- - #25: Ruby 2 compatibility (thanks mislav)
17
-
18
- === 1.1.5 / 2012-02-12
19
-
20
- - Fix length/bytesize of parts in 1.9 (#7, #14) (Jason Moore)
21
- - Allow CompositeIO objects to be re-read by rewinding, like other IO
22
- objects. (Luke Redpath)
23
-
24
- === 1.1.4 / 2011-11-23
25
-
26
- - Non-functional changes in release (switch to Bundler gem tasks)
27
-
28
- === 1.1.3 / 2011-07-25
29
-
30
- - More configurable header specification for parts (Gerrit Riessen)
31
-
32
- === 1.1.2 / 2011-05-24
33
-
34
- - Fix CRLF file part miscalculation (Johannes Wagener)
35
- - Fix Epilogue CRLF issue (suggestion by Neil Spring)
36
-
37
- === 1.1.1 / 2011-05-13
38
-
39
- - GH# 9: Fixed Ruby 1.9.2 StringIO bug (thanks Alex Koppel)
40
-
41
- === 1.1.0 / 2011-01-11
42
-
43
- - API CHANGE: UploadIO.convert! removed in favor of UploadIO.new
44
- (Jeff Hodges)
45
-
46
- === 1.0.1 / 2010-04-27
47
-
48
- - Doc updates, make gemspec based on more modern Rubygems
49
-
50
- === 1.0 / 2009-02-12
51
-
52
- - Many fixes from mlooney, seems to work now. Putting the 0.9 seal of
53
- approval on it.
54
-
55
- === 0.1 / 2008-08-12
56
-
57
- * 1 major enhancement
58
-
59
- * Birthday!
60
-
data/Manifest.txt DELETED
@@ -1,9 +0,0 @@
1
- lib/composite_io.rb
2
- lib/multipartable.rb
3
- lib/parts.rb
4
- lib/net/http/post/multipart.rb
5
- Manifest.txt
6
- Rakefile
7
- README.txt
8
- test/test_composite_io.rb
9
- test/net/http/post/test_multipart.rb
data/README.md DELETED
@@ -1,77 +0,0 @@
1
- ## multipart-post
2
-
3
- * http://github.com/nicksieger/multipart-post
4
-
5
- ![build status](https://travis-ci.org/nicksieger/multipart-post.png)
6
-
7
- #### DESCRIPTION:
8
-
9
- Adds a streamy multipart form post capability to Net::HTTP. Also
10
- supports other methods besides POST.
11
-
12
- #### FEATURES/PROBLEMS:
13
-
14
- * Appears to actually work. A good feature to have.
15
- * Encapsulates posting of file/binary parts and name/value parameter parts, similar to
16
- most browsers' file upload forms.
17
- * Provides an UploadIO helper class to prepare IO objects for inclusion in the params
18
- hash of the multipart post object.
19
-
20
- #### SYNOPSIS:
21
-
22
- require 'net/http/post/multipart'
23
-
24
- url = URI.parse('http://www.example.com/upload')
25
- File.open("./image.jpg") do |jpg|
26
- req = Net::HTTP::Post::Multipart.new url.path,
27
- "file" => UploadIO.new(jpg, "image/jpeg", "image.jpg")
28
- res = Net::HTTP.start(url.host, url.port) do |http|
29
- http.request(req)
30
- end
31
- end
32
-
33
- To post multiple files or attachments, simply include multiple parameters with
34
- UploadIO values:
35
-
36
- require 'net/http/post/multipart'
37
-
38
- url = URI.parse('http://www.example.com/upload')
39
- req = Net::HTTP::Post::Multipart.new url.path,
40
- "file1" => UploadIO.new(File.new("./image.jpg"), "image/jpeg", "image.jpg"),
41
- "file2" => UploadIO.new(File.new("./image2.jpg"), "image/jpeg", "image2.jpg")
42
- res = Net::HTTP.start(url.host, url.port) do |http|
43
- http.request(req)
44
- end
45
-
46
- #### REQUIREMENTS:
47
-
48
- None
49
-
50
- #### INSTALL:
51
-
52
- gem install multipart-post
53
-
54
- #### LICENSE:
55
-
56
- (The MIT License)
57
-
58
- Copyright (c) 2007-2013 Nick Sieger <nick@nicksieger.com>
59
-
60
- Permission is hereby granted, free of charge, to any person obtaining
61
- a copy of this software and associated documentation files (the
62
- 'Software'), to deal in the Software without restriction, including
63
- without limitation the rights to use, copy, modify, merge, publish,
64
- distribute, sublicense, and/or sell copies of the Software, and to
65
- permit persons to whom the Software is furnished to do so, subject to
66
- the following conditions:
67
-
68
- The above copyright notice and this permission notice shall be
69
- included in all copies or substantial portions of the Software.
70
-
71
- THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
72
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
73
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
74
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
75
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
76
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
77
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile DELETED
@@ -1,9 +0,0 @@
1
- require "bundler/gem_tasks"
2
-
3
- task :default => :test
4
-
5
- require 'rake/testtask'
6
- Rake::TestTask.new do |t|
7
- t.libs << "test"
8
- t.test_files = FileList['test/**/test*.rb']
9
- end
@@ -1,22 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "multipart_post"
4
-
5
- Gem::Specification.new do |s|
6
- s.name = "multipart-post"
7
- s.version = MultipartPost::VERSION
8
- s.authors = ["Nick Sieger"]
9
- s.email = ["nick@nicksieger.com"]
10
- s.homepage = "https://github.com/nicksieger/multipart-post"
11
- s.summary = %q{A multipart form post accessory for Net::HTTP.}
12
- s.license = "MIT"
13
- s.description = %q{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.}
14
-
15
- s.rubyforge_project = "caldersphere"
16
-
17
- s.files = `git ls-files`.split("\n")
18
- s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
- s.rdoc_options = ["--main", "README.md", "-SHN", "-f", "darkfish"]
21
- s.require_paths = ["lib"]
22
- end
data/test/multibyte.txt DELETED
@@ -1 +0,0 @@
1
- ファイル
@@ -1,110 +0,0 @@
1
- #--
2
- # Copyright (c) 2007-2013 Nick Sieger.
3
- # See the file README.txt included with the distribution for
4
- # software license details.
5
- #++
6
-
7
- require 'net/http/post/multipart'
8
- require 'test/unit'
9
-
10
- class Net::HTTP::Post::MultiPartTest < Test::Unit::TestCase
11
- TEMP_FILE = "temp.txt"
12
-
13
- HTTPPost = Struct.new("HTTPPost", :content_length, :body_stream, :content_type)
14
- HTTPPost.module_eval do
15
- def set_content_type(type, params = {})
16
- self.content_type = type + params.map{|k,v|"; #{k}=#{v}"}.join('')
17
- end
18
- end
19
-
20
- def teardown
21
- File.delete(TEMP_FILE) rescue nil
22
- end
23
-
24
- def test_form_multipart_body
25
- File.open(TEMP_FILE, "w") {|f| f << "1234567890"}
26
- @io = File.open(TEMP_FILE)
27
- @io = UploadIO.new @io, "text/plain", TEMP_FILE
28
- assert_results Net::HTTP::Post::Multipart.new("/foo/bar", :foo => 'bar', :file => @io)
29
- end
30
- def test_form_multipart_body_put
31
- File.open(TEMP_FILE, "w") {|f| f << "1234567890"}
32
- @io = File.open(TEMP_FILE)
33
- @io = UploadIO.new @io, "text/plain", TEMP_FILE
34
- assert_results Net::HTTP::Put::Multipart.new("/foo/bar", :foo => 'bar', :file => @io)
35
- end
36
-
37
- def test_form_multipart_body_with_stringio
38
- @io = StringIO.new("1234567890")
39
- @io = UploadIO.new @io, "text/plain", TEMP_FILE
40
- assert_results Net::HTTP::Post::Multipart.new("/foo/bar", :foo => 'bar', :file => @io)
41
- end
42
-
43
- def test_form_multiparty_body_with_parts_headers
44
- @io = StringIO.new("1234567890")
45
- @io = UploadIO.new @io, "text/plain", TEMP_FILE
46
- parts = { :text => 'bar', :file => @io }
47
- headers = {
48
- :parts => {
49
- :text => { "Content-Type" => "part/type" },
50
- :file => { "Content-Transfer-Encoding" => "part-encoding" }
51
- }
52
- }
53
-
54
- request = Net::HTTP::Post::Multipart.new("/foo/bar", parts, headers)
55
- assert_results request
56
- assert_additional_headers_added(request, headers[:parts])
57
- end
58
-
59
- def test_form_multipart_body_with_array_value
60
- File.open(TEMP_FILE, "w") {|f| f << "1234567890"}
61
- @io = File.open(TEMP_FILE)
62
- @io = UploadIO.new @io, "text/plain", TEMP_FILE
63
- params = {:foo => ['bar', 'quux'], :file => @io}
64
- headers = { :parts => {
65
- :foo => { "Content-Type" => "application/json; charset=UTF-8" } } }
66
- post = Net::HTTP::Post::Multipart.new("/foo/bar", params, headers,
67
- Net::HTTP::Post::Multipart::DEFAULT_BOUNDARY)
68
-
69
- assert post.content_length && post.content_length > 0
70
- assert post.body_stream
71
-
72
- body = post.body_stream.read
73
- assert_equal 2, body.lines.grep(/name="foo"/).length
74
- assert body =~ /Content-Type: application\/json; charset=UTF-8/, body
75
- end
76
-
77
- def test_form_multipart_body_with_arrayparam
78
- File.open(TEMP_FILE, "w") {|f| f << "1234567890"}
79
- @io = File.open(TEMP_FILE)
80
- @io = UploadIO.new @io, "text/plain", TEMP_FILE
81
- assert_results Net::HTTP::Post::Multipart.new("/foo/bar", :multivalueParam => ['bar','bah'], :file => @io)
82
- end
83
-
84
- def assert_results(post)
85
- assert post.content_length && post.content_length > 0
86
- assert post.body_stream
87
- assert_equal "multipart/form-data; boundary=#{Multipartable::DEFAULT_BOUNDARY}", post['content-type']
88
- body = post.body_stream.read
89
- boundary_regex = Regexp.quote Multipartable::DEFAULT_BOUNDARY
90
- assert body =~ /1234567890/
91
- # ensure there is at least one boundary
92
- assert body =~ /^--#{boundary_regex}\r\n/
93
- # ensure there is an epilogue
94
- assert body =~ /^--#{boundary_regex}--\r\n/
95
- assert body =~ /text\/plain/
96
- if (body =~ /multivalueParam/)
97
- assert_equal 2, body.scan(/^.*multivalueParam.*$/).size
98
- end
99
- end
100
-
101
- def assert_additional_headers_added(post, parts_headers)
102
- post.body_stream.rewind
103
- body = post.body_stream.read
104
- parts_headers.each do |part, headers|
105
- headers.each do |k,v|
106
- assert body =~ /#{k}: #{v}/
107
- end
108
- end
109
- end
110
- end