- self.media = options[:media]
- upload_type = self.parameters.find { |(k, _)| ['uploadType', 'upload_type'].include?(k) }.last
- case upload_type
- when "media"
- if options[:body] || options[:body_object]
- raise ArgumentError,
- "Can not specify body & body object for simple uploads."
- end
- self.headers['Content-Type'] ||= self.media.content_type
- self.body = self.media
- when "multipart"
- unless options[:body_object]
- raise ArgumentError, "Multipart requested but no body object."
- end
- # This is all a bit of a hack due to Signet requiring body to be a
- # string. Ideally, update Signet to delay serialization so we can
- # just pass streams all the way down through to the HTTP library.
- metadata = StringIO.new(serialize_body(options[:body_object]))
- env = {
- :request_headers => {
- 'Content-Type' =>
- "multipart/related;boundary=#{MULTIPART_BOUNDARY}"
- },
- :request => {:boundary => MULTIPART_BOUNDARY}
- }
- multipart = Faraday::Request::Multipart.new
- self.body = multipart.create_multipart(env, [
- [nil, Faraday::UploadIO.new(
- metadata, 'application/json', 'file.json'
- )],
- [nil, self.media]])
- self.headers.update(env[:request_headers])
- when "resumable"
- file_length = self.media.length
- self.headers['X-Upload-Content-Type'] = self.media.content_type
- self.headers['X-Upload-Content-Length'] = file_length.to_s
- if options[:body_object]
- self.headers['Content-Type'] ||= 'application/json'
- self.body = serialize_body(options[:body_object])
- else
- self.body = ''
- end
- else
- raise ArgumentError, "Invalid uploadType for media."
- end