lib/elevate/http/response.rb in elevate-0.5.0 vs lib/elevate/http/response.rb in elevate-0.6.0
- old
+ new
@@ -1,22 +1,112 @@
module Elevate
module HTTP
- class HTTPResponse
+ # Encapsulates a response received from a HTTP server.
+ #
+ # @api public
+ class Response
def initialize
@body = nil
@headers = nil
@status_code = nil
@error = nil
+ @raw_body = nil
+ @url = nil
end
+ # Appends a chunk of data to the body.
+ #
+ # @api private
def append_data(data)
- @body ||= NSMutableData.alloc.init
- @body.appendData(data)
+ @raw_body ||= NSMutableData.alloc.init
+ @raw_body.appendData(data)
end
- attr_reader :body
+ # Returns the body of the response.
+ #
+ # If the body is JSON-encoded, it will be decoded and returned.
+ #
+ # @return [NSData, Hash, Array, nil]
+ # response body, if any. If the response is JSON-encoded, the decoded body.
+ #
+ # @api public
+ def body
+ @body ||= begin
+ if json?
+ NSJSONSerialization.JSONObjectWithData(@raw_body, options: 0, error: nil)
+ else
+ @raw_body
+ end
+ end
+ end
+
+ # Freezes this instance, making it immutable.
+ #
+ # @api private
+ def freeze
+ body
+
+ super
+ end
+
+ # Forwards unknown methods to +body+, enabling this object to behave like +body+.
+ #
+ # This only occurs if +body+ is a Ruby collection.
+ #
+ # @api public
+ def method_missing(m, *args, &block)
+ return super unless json?
+
+ body.send(m, *args, &block)
+ end
+
+ # Handles missing method queries, allowing +body+ masquerading.
+ #
+ # @api public
+ def respond_to_missing?(m, include_private = false)
+ return false unless json?
+
+ body.respond_to_missing?(m, include_private)
+ end
+
+ # Returns the HTTP headers
+ #
+ # @return [Hash]
+ # returned headers
+ #
+ # @api public
attr_accessor :headers
+
+ # Returns the HTTP status code
+ #
+ # @return [Integer]
+ # status code of the response
+ #
+ # @api public
attr_accessor :status_code
+
attr_accessor :error
+
+ # Returns the raw body
+ #
+ # @return [NSData]
+ # response body
+ #
+ # @api public
+ attr_reader :raw_body
+
+ # Returns the URL
+ #
+ # @return [String]
+ # URL of the response
+ #
+ # @api public
+ attr_accessor :url
+
+ private
+
+ def json?
+ headers && headers["Content-Type"] =~ %r{application/json}
+ end
end
end
end