Class: Elevate::HTTP::Request
- Inherits:
-
Object
- Object
- Elevate::HTTP::Request
- Defined in:
- lib/elevate/http/request.rb
Overview
Encapsulates a HTTP request.
NSURLConnection is responsible for fulfilling the request. The response is buffered in memory as it is received, and made available through the response method.
Constant Summary collapse
- METHODS =
[:get, :post, :put, :delete, :patch, :head, :options].freeze
Instance Method Summary collapse
-
#cancel ⇒ void
Cancels an in-flight request.
-
#initialize(method, url, options = {}) ⇒ Request
constructor
Initializes a HTTP request with the specified parameters.
-
#response ⇒ Elevate::HTTP::Response?
Returns a response to this request, sending it if necessary.
-
#send ⇒ void
Sends this request.
-
#sent? ⇒ Boolean
Returns true if this request is in-flight.
Constructor Details
#initialize(method, url, options = {}) ⇒ Request
Initializes a HTTP request with the specified parameters.
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
# File 'lib/elevate/http/request.rb', line 44 def initialize(method, url, ={}) raise ArgumentError, "invalid HTTP method" unless METHODS.include? method.downcase raise ArgumentError, "invalid URL" unless url.start_with? "http" raise ArgumentError, "invalid body type; must be NSData" if [:body] && ! [:body].is_a?(NSData) unless .fetch(:query, {}).empty? url += "?" + URI.encode_query([:query]) end [:headers] ||= {} if root = .delete(:json) [:body] = NSJSONSerialization.dataWithJSONObject(root, options: 0, error: nil) [:headers]["Content-Type"] = "application/json" elsif root = .delete(:form) [:body] = URI.encode_www_form(root).dataUsingEncoding(NSASCIIStringEncoding) [:headers]["Content-Type"] ||= "application/x-www-form-urlencoded" end @request = NSMutableURLRequest.alloc.init @request.CachePolicy = NSURLRequestReloadIgnoringLocalCacheData @request.HTTPBody = [:body] @request.HTTPMethod = method @request.URL = NSURL.URLWithString(url) headers = .fetch(:headers, {}) if credentials = [:credentials] headers["Authorization"] = (credentials) end headers.each do |key, value| @request.setValue(value.to_s, forHTTPHeaderField:key.to_s) end @response = Response.new @response.url = url @connection = nil @promise = Promise.new end |
Instance Method Details
#cancel ⇒ void
This method returns an undefined value.
Cancels an in-flight request.
This method is safe to call from any thread.
93 94 95 96 97 98 99 100 |
# File 'lib/elevate/http/request.rb', line 93 def cancel return unless sent? NetworkThread.cancel(@connection) ActivityIndicator.instance.hide @promise.fulfill(nil) end |
#response ⇒ Elevate::HTTP::Response?
Returns a response to this request, sending it if necessary
This method blocks the calling thread, unless interrupted.
110 111 112 113 114 115 116 |
# File 'lib/elevate/http/request.rb', line 110 def response unless sent? send end @promise.value end |
#send ⇒ void
This method returns an undefined value.
Sends this request. The caller is not blocked.
123 124 125 126 127 128 |
# File 'lib/elevate/http/request.rb', line 123 def send @connection = NSURLConnection.alloc.initWithRequest(@request, delegate:self, startImmediately:false) NetworkThread.start(@connection) ActivityIndicator.instance.show end |
#sent? ⇒ Boolean
Returns true if this request is in-flight
136 137 138 |
# File 'lib/elevate/http/request.rb', line 136 def sent? @connection != nil end |