Class: Motion::HTTP::Adapter::Request
Instance Method Summary collapse
- #build_ns_url_request ⇒ Object
- #error_description(error) ⇒ Object
-
#initialize(request) ⇒ Request
constructor
A new instance of Request.
- #log_error(message, error = nil) ⇒ Object
- #perform(&callback) ⇒ Object
- #perform_download_request(ns_url_request, &callback) ⇒ Object
- #perform_normal_http_request(ns_url_request, &callback) ⇒ Object
-
#URLSession(session, task: task, willPerformHTTPRedirection: response, newRequest: request, completionHandler: completion_handler) ⇒ Object
NSURLSessionTaskDelegate methods.
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_request ⇒ Object
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/cocoa/adapter.rb', line 68 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 |
#error_description(error) ⇒ Object
96 97 98 |
# File 'lib/cocoa/adapter.rb', line 96 def error_description(error) "#{error.localizedDescription} #{error.userInfo['NSLocalizedDescriptionKey']}" end |
#log_error(message, error = nil) ⇒ Object
92 93 94 |
# File 'lib/cocoa/adapter.rb', line 92 def log_error(, error = nil) Motion::HTTP.logger.error() end |
#perform(&callback) ⇒ Object
14 15 16 17 18 19 20 21 22 |
# 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 if @request.[:download] perform_download_request(ns_url_request, &callback) else perform_normal_http_request(ns_url_request, &callback) end end |
#perform_download_request(ns_url_request, &callback) ⇒ Object
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/cocoa/adapter.rb', line 24 def perform_download_request(ns_url_request, &callback) # TODO: need to set up delegate methods when using a background session # @background_session = NSURLSession.sessionWithConfiguration(NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("motion-http")) # task = @background_session.downloadTaskWithRequest(ns_url_request, completionHandler: -> (location, response, error) { task = @session.downloadTaskWithRequest(ns_url_request, completionHandler: -> (location, response, error) { if error log_error "Error while requesting #{@request.url}: #{error_description(error)}" response = Response.new(@request, response&.statusCode, Headers.new(response&.allHeaderFields), error_description(error)) else if @request.[:to] error_ptr = Pointer.new(:object) file_data = NSFileManager.defaultManager.contentsAtPath(location) file_data.writeToFile(@request.[:to], options: NSDataWritingAtomic, error: error_ptr) if error_ptr[0] log_error "Error while saving downloaded file: #{error_description(error_ptr[0])}" response = Response.new(@request, response.statusCode, Headers.new(response.allHeaderFields), error_description(error_ptr[0])) else response = Response.new(@request, response.statusCode, Headers.new(response.allHeaderFields), nil) end else log_error "No local save path specified." end Motion::HTTP.logger.log_response(response) end callback.call(response) if callback }) task.resume end |
#perform_normal_http_request(ns_url_request, &callback) ⇒ Object
54 55 56 57 58 59 60 61 62 63 64 65 66 |
# File 'lib/cocoa/adapter.rb', line 54 def perform_normal_http_request(ns_url_request, &callback) task = @session.dataTaskWithRequest(ns_url_request, completionHandler: -> (data, response, error) { if error log_error "Error while requesting #{@request.url}: #{error_description(error)}" response = Response.new(@request, response&.statusCode, Headers.new(response&.allHeaderFields), error_description(error)) 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
102 103 104 105 106 107 108 |
# File 'lib/cocoa/adapter.rb', line 102 def URLSession(session, task: task, willPerformHTTPRedirection: response, newRequest: request, completionHandler: completion_handler) if @request.[:follow_redirects] == false completion_handler.call(nil) else completion_handler.call(request) end end |