class RestClient::Payload::Multipart
Constants
- EOL
Public Instance Methods
boundary()
click to toggle source
# File lib/restclient/payload.rb, line 201 def boundary return @boundary if defined?(@boundary) && @boundary # Use the same algorithm used by WebKit: generate 16 random # alphanumeric characters, replacing `+` `/` with `A` `B` (included in # the list twice) to round out the set of 64. s = SecureRandom.base64(12) s.tr!('+/', 'AB') @boundary = '----RubyFormBoundary' + s end
build_stream(params)
click to toggle source
# File lib/restclient/payload.rb, line 144 def build_stream(params) b = '--' + boundary @stream = Tempfile.new('rest-client.multipart.') @stream.binmode @stream.write(b + EOL) case params when Hash, ParamsArray x = Utils.flatten_params(params) else x = params end last_index = x.length - 1 x.each_with_index do |a, index| k, v = * a if v.respond_to?(:read) && v.respond_to?(:path) create_file_field(@stream, k, v) else create_regular_field(@stream, k, v) end @stream.write(EOL + b) @stream.write(EOL) unless last_index == index end @stream.write('--') @stream.write(EOL) @stream.seek(0) end
close()
click to toggle source
# File lib/restclient/payload.rb, line 229 def close @stream.close! end
create_file_field(s, k, v)
click to toggle source
# File lib/restclient/payload.rb, line 181 def create_file_field(s, k, v) begin s.write("Content-Disposition: form-data;") s.write(" name=\"#{k}\";") unless (k.nil? || k=='') s.write(" filename=\"#{v.respond_to?(:original_filename) ? v.original_filename : File.basename(v.path)}\"#{EOL}") s.write("Content-Type: #{v.respond_to?(:content_type) ? v.content_type : mime_for(v.path)}#{EOL}") s.write(EOL) while (data = v.read(8124)) s.write(data) end ensure v.close if v.respond_to?(:close) end end
create_regular_field(s, k, v)
click to toggle source
# File lib/restclient/payload.rb, line 174 def create_regular_field(s, k, v) s.write("Content-Disposition: form-data; name=\"#{k}\"") s.write(EOL) s.write(EOL) s.write(v) end
handle_key(key)
click to toggle source
for Multipart
do not escape the keys
Ostensibly multipart keys MAY be percent encoded per RFC 7578, but in practice no major browser that I'm aware of uses percent encoding.
Further discussion of multipart encoding: github.com/rest-client/rest-client/pull/403#issuecomment-156976930
# File lib/restclient/payload.rb, line 221 def handle_key key key end
headers()
click to toggle source
Calls superclass method
RestClient::Payload::Base#headers
# File lib/restclient/payload.rb, line 225 def headers super.merge({'Content-Type' => %Q{multipart/form-data; boundary=#{boundary}}}) end
mime_for(path)
click to toggle source
# File lib/restclient/payload.rb, line 196 def mime_for(path) mime = MIME::Types.type_for path mime.empty? ? 'text/plain' : mime[0].content_type end