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 85 |
# 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 #@cache = self.class.cache @response = Response.new @response.url = url @connection = nil @future = Future.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.
94 95 96 97 98 99 100 101 |
# File 'lib/elevate/http/request.rb', line 94 def cancel return unless sent? NetworkThread.cancel(@connection) if @connection ActivityIndicator.instance.hide @future.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.
111 112 113 114 115 116 117 |
# File 'lib/elevate/http/request.rb', line 111 def response unless sent? send end @future.value end |
#send ⇒ void
This method returns an undefined value.
Sends this request. The caller is not blocked.
124 125 126 127 128 129 130 |
# File 'lib/elevate/http/request.rb', line 124 def send @connection = NSURLConnection.alloc.initWithRequest(@request, delegate:self, startImmediately:false) @request = nil NetworkThread.start(@connection) ActivityIndicator.instance.show end |
#sent? ⇒ Boolean
Returns true if this request is in-flight
138 139 140 |
# File 'lib/elevate/http/request.rb', line 138 def sent? @connection != nil end |