Class: Google::Apis::Core::HttpCommand
- Inherits:
-
Object
- Object
- Google::Apis::Core::HttpCommand
- Includes:
- Logging
- Defined in:
- lib/google/apis/core/http_command.rb
Overview
Command for HTTP request/response.
Direct Known Subclasses
Constant Summary collapse
- RETRIABLE_ERRORS =
[Google::Apis::ServerError, Google::Apis::RateLimitError, Google::Apis::TransmissionError]
Instance Attribute Summary collapse
-
#body ⇒ #read
Request body.
-
#connection ⇒ HTTPClient
HTTP Client.
-
#header ⇒ Hash
HTTP headers.
-
#method ⇒ symbol
HTTP method.
-
#options ⇒ Google::Apis::RequestOptions
Request options.
-
#params ⇒ Hash
Path params for URL Template.
-
#query ⇒ Hash
Query params.
-
#url ⇒ String, Addressable::URI
HTTP request URL.
Instance Method Summary collapse
- #allow_form_encoding? ⇒ Boolean
-
#apply_request_options(req_header)
Update the request with any specified options.
-
#authorization_refreshable? ⇒ Boolean
Check if attached credentials can be automatically refreshed.
-
#check_status(status, header = nil, body = nil, message = nil)
Check the response and raise error if needed.
-
#decode_response_body(_content_type, body) ⇒ Object
Process the actual response body.
-
#error(err, rethrow: false) {|nil, err| ... }
Process an error response.
-
#execute(client) {|result, err| ... } ⇒ Object
Execute the command, retrying as necessary.
-
#initialize(method, url, body: nil) ⇒ HttpCommand
constructor
A new instance of HttpCommand.
-
#process_response(status, header, body) ⇒ Object
Check the response and either decode body or raise error.
-
#success(result) {|result, nil| ... } ⇒ Object
Process a success response.
Methods included from Logging
Constructor Details
#initialize(method, url, body: nil) ⇒ HttpCommand
Returns a new instance of HttpCommand
70 71 72 73 74 75 76 77 78 79 |
# File 'lib/google/apis/core/http_command.rb', line 70 def initialize(method, url, body: nil) self. = Google::Apis::RequestOptions.default.dup self.url = url self.url = Addressable::Template.new(url) if url.is_a?(String) self.method = method self.header = Hash.new self.body = body self.query = {} self.params = {} end |
Instance Attribute Details
#body ⇒ #read
Request body
46 47 48 |
# File 'lib/google/apis/core/http_command.rb', line 46 def body @body end |
#connection ⇒ HTTPClient
HTTP Client
54 55 56 |
# File 'lib/google/apis/core/http_command.rb', line 54 def connection @connection end |
#header ⇒ Hash
HTTP headers
42 43 44 |
# File 'lib/google/apis/core/http_command.rb', line 42 def header @header end |
#method ⇒ symbol
HTTP method
50 51 52 |
# File 'lib/google/apis/core/http_command.rb', line 50 def method @method end |
#options ⇒ Google::Apis::RequestOptions
Request options
34 35 36 |
# File 'lib/google/apis/core/http_command.rb', line 34 def @options end |
#params ⇒ Hash
Path params for URL Template
62 63 64 |
# File 'lib/google/apis/core/http_command.rb', line 62 def params @params end |
#query ⇒ Hash
Query params
58 59 60 |
# File 'lib/google/apis/core/http_command.rb', line 58 def query @query end |
#url ⇒ String, Addressable::URI
HTTP request URL
38 39 40 |
# File 'lib/google/apis/core/http_command.rb', line 38 def url @url end |
Instance Method Details
#allow_form_encoding? ⇒ Boolean
320 321 322 |
# File 'lib/google/apis/core/http_command.rb', line 320 def allow_form_encoding? [:post, :put].include?(method) && body.nil? end |
#apply_request_options(req_header)
This method returns an undefined value.
Update the request with any specified options.
311 312 313 314 315 316 317 318 |
# File 'lib/google/apis/core/http_command.rb', line 311 def (req_header) if ..respond_to?(:apply!) ..apply!(req_header) elsif ..is_a?(String) req_header['Authorization'] = sprintf('Bearer %s', .) end req_header.update(header) end |
#authorization_refreshable? ⇒ Boolean
Check if attached credentials can be automatically refreshed
133 134 135 |
# File 'lib/google/apis/core/http_command.rb', line 133 def ..respond_to?(:apply!) end |
#check_status(status, header = nil, body = nil, message = nil)
This method returns an undefined value.
Check the response and raise error if needed
202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 |
# File 'lib/google/apis/core/http_command.rb', line 202 def check_status(status, header = nil, body = nil, = nil) # TODO: 304 Not Modified depends on context... case status when 200...300 nil when 301, 302, 303, 307 ||= sprintf('Redirect to %s', header['Location']) raise Google::Apis::RedirectError.new(, status_code: status, header: header, body: body) when 401 ||= 'Unauthorized' raise Google::Apis::AuthorizationError.new(, status_code: status, header: header, body: body) when 429 ||= 'Rate limit exceeded' raise Google::Apis::RateLimitError.new(, status_code: status, header: header, body: body) when 304, 400, 402...500 ||= 'Invalid request' raise Google::Apis::ClientError.new(, status_code: status, header: header, body: body) when 500...600 ||= 'Server error' raise Google::Apis::ServerError.new(, status_code: status, header: header, body: body) else logger.warn(sprintf('Encountered unexpected status code %s', status)) ||= 'Unknown error' raise Google::Apis::TransmissionError.new(, status_code: status, header: header, body: body) end end |
#decode_response_body(_content_type, body) ⇒ Object
Process the actual response body. Intended to be overridden by subclasses
236 237 238 |
# File 'lib/google/apis/core/http_command.rb', line 236 def decode_response_body(_content_type, body) body end |
#error(err, rethrow: false) {|nil, err| ... }
This method returns an undefined value.
Process an error response
259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 |
# File 'lib/google/apis/core/http_command.rb', line 259 def error(err, rethrow: false, &block) logger.debug { sprintf('Error - %s', PP.pp(err, '')) } if err.is_a?(HTTPClient::BadResponseError) begin res = err.res check_status(res.status.to_i, res.header, res.body) rescue Google::Apis::Error => e err = e end elsif err.is_a?(HTTPClient::TimeoutError) || err.is_a?(SocketError) err = Google::Apis::TransmissionError.new(err) end block.call(nil, err) if block_given? fail err if rethrow || block.nil? end |
#execute(client) {|result, err| ... } ⇒ Object
Execute the command, retrying as necessary
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
# File 'lib/google/apis/core/http_command.rb', line 90 def execute(client) prepare! begin Retriable.retriable tries: .retries + 1, base_interval: 1, multiplier: 2, on: RETRIABLE_ERRORS do |try| # This 2nd level retriable only catches auth errors, and supports 1 retry, which allows # auth to be re-attempted without having to retry all sorts of other failures like # NotFound, etc auth_tries = (try == 1 && ? 2 : 1) Retriable.retriable tries: auth_tries, on: [Google::Apis::AuthorizationError], on_retry: proc { |*| } do execute_once(client).tap do |result| if block_given? yield result, nil end end end end rescue => e if block_given? yield nil, e else raise e end end ensure release! end |
#process_response(status, header, body) ⇒ Object
Check the response and either decode body or raise error
182 183 184 185 |
# File 'lib/google/apis/core/http_command.rb', line 182 def process_response(status, header, body) check_status(status, header, body) decode_response_body(header['Content-Type'].first, body) end |
#success(result) {|result, nil| ... } ⇒ Object
Process a success response
245 246 247 248 249 |
# File 'lib/google/apis/core/http_command.rb', line 245 def success(result, &block) logger.debug { sprintf('Success - %s', PP.pp(result, '')) } block.call(result, nil) if block_given? result end |