Class: Motion::HTTP::Adapter::Request

Inherits:
Object
  • Object
show all
Defined in:
lib/cocoa/adapter.rb

Instance Method Summary collapse

Constructor Details

#initialize(request) ⇒ Request

Returns a new instance of Request.



9
10
11
12
# File 'lib/cocoa/adapter.rb', line 9

def initialize(request)
  @request = request
  @session = NSURLSession.sessionWithConfiguration(NSURLSessionConfiguration.defaultSessionConfiguration, delegate: self, delegateQueue: nil)
end

Instance Method Details

#build_ns_url_requestObject



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# 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
    if @request.body.is_a?(NSData)
      body_data = @request.body
    else
      body_data = NSString.alloc.initWithString(@request.body).dataUsingEncoding(NSUTF8StringEncoding)
    end
    ns_url_request.HTTPBody = body_data
  end

  # TODO: add other headers
  ns_url_request
end

#perform(&callback) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 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

#URLSession(session, task: task, willPerformHTTPRedirection: response, newRequest: request, completionHandler: completion_handler) ⇒ Object

NSURLSessionTaskDelegate methods



57
58
59
60
61
62
63
# File 'lib/cocoa/adapter.rb', line 57

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