build_request_from_options

in lib/twurl/oauth_client.rb [128:182]


    def build_request_from_options(options, &block)
      request_class = METHODS.fetch(options.request_method.to_sym)
      request = request_class.new(options.path, options.headers)

      if options.upload && options.upload['file'].count > 0
        boundary = "00Twurl" + rand(1000000000000000000).to_s + "lruwT99"
        multipart_body = []
        file_field = options.upload['filefield'] ? options.upload['filefield'] : 'media[]'

        options.data.each {|key, value|
          multipart_body << "--#{boundary}\r\n"
          multipart_body << "Content-Disposition: form-data; name=\"#{key}\"\r\n"
          multipart_body << "\r\n"
          multipart_body << value
          multipart_body << "\r\n"
        }

        options.upload['file'].each {|filename|
          multipart_body << "--#{boundary}\r\n"
          multipart_body << "Content-Disposition: form-data; name=\"#{file_field}\"; filename=\"#{File.basename(filename)}\"\r\n"
          multipart_body << "Content-Type: application/octet-stream\r\n"
          multipart_body << "Content-Transfer-Encoding: base64\r\n" if options.upload['base64']
          multipart_body << "\r\n"

          if options.upload['base64']
            enc = Base64.encode64(File.binread(filename))
            multipart_body << enc
          else
            multipart_body << File.binread(filename)
          end
        }

        multipart_body << "\r\n--#{boundary}--\r\n"

        request.body = multipart_body.join
        request.content_type = "multipart/form-data, boundary=\"#{boundary}\""
      elsif options.json_data
        request.body = options.data
      elsif options.data
        request.content_type = "application/x-www-form-urlencoded" unless request.content_type
        if options.raw_data
          request.body = options.data
        else
          begin
            request.body = options.data.map do |key, value|
              "#{key}" + (value.nil? ? "" : "=#{CGI.escape(value)}")
            end.join("&")
          rescue
            raise Exception, "ERROR: failed to parse POST request body"
          end
        end
      end
      request
    end