class Motion::HTTP::Adapter::Request

Constants

HTTPBody
HTTPMethod

Public Class Methods

new(request) click to toggle source
# File lib/cocoa/adapter.rb, line 9
def initialize(request)
  @request = request
  @session = NSURLSession.sessionWithConfiguration(NSURLSessionConfiguration.defaultSessionConfiguration, delegate: self, delegateQueue: nil)
end

Public Instance Methods

URLSession(session, task: task, willPerformHTTPRedirection: response, newRequest: request, completionHandler: completion_handler) click to toggle source

NSURLSessionTaskDelegate methods

# File lib/cocoa/adapter.rb, line 52
def URLSession(session, task: task, willPerformHTTPRedirection: response, newRequest: request, completionHandler: completion_handler)
  if @request.options[:follow_redirects] == false
    completion_handler.call(nil)
  else
    completion_handler.call(request)
  end
end
build_ns_url_request() click to toggle source
# File lib/cocoa/adapter.rb, line 31
def build_ns_url_request
  ns_url_request = NSMutableURLRequest.alloc.initWithURL(NSURL.URLWithString(@request.url))
  ns_url_request.HTTPMethod = @request.http_method.to_s.upcase
  @request.headers.each do |key, value|
    if value.is_a? Array
      value.each {|v2| ns_url_request.addValue(v2, forHTTPHeaderField: key) }
    else
      ns_url_request.setValue(value, forHTTPHeaderField: key)
    end
  end

  if @request.body
    ns_url_request.HTTPBody = NSString.alloc.initWithString(@request.body).dataUsingEncoding(NSUTF8StringEncoding)
  end

  # TODO: add other headers
  ns_url_request
end
perform(&callback) click to toggle source
# File lib/cocoa/adapter.rb, line 14
def perform(&callback)
  # TODO: dataTask is good for general HTTP requests but not for file downloads
  ns_url_request = build_ns_url_request
  task = @session.dataTaskWithRequest(ns_url_request, completionHandler: -> (data, response, error) {
    if error
      error_message = "#{error.localizedDescription} #{error.userInfo['NSLocalizedDescriptionKey']}"
      Motion::HTTP.logger.error("Error while requesting #{@request.url}: #{error_message}")
      response = Response.new(@request, response&.statusCode, Headers.new(response&.allHeaderFields), error_message)
    else
      response = Response.new(@request, response.statusCode, Headers.new(response.allHeaderFields), data.to_s)
      Motion::HTTP.logger.log_response(response)
    end
    callback.call(response) if callback
  })
  task.resume
end