lib/footrest/http_error.rb in footrest-0.5.0 vs lib/footrest/http_error.rb in footrest-0.5.1
- old
+ new
@@ -11,28 +11,24 @@
@response = response
@status = @response[:status]
@body = @response[:body]
@method = @response[:method]
- super("HTTP ERROR: #{@status} #{method} #{url}\n#{errors}\n#{headers}")
+ super("HTTP ERROR: #{status} (#{status_message}) #{method} #{url}\n#{errors}\n#{headers}")
end
def method
@method.to_s.upcase
- rescue => e
- "[Unable to show HTTP method: #{e}]"
end
def url
@response.url.to_s
- rescue => e
- "[Unable to show URL: #{e}]"
end
def headers
JSON::pretty_generate(
- request: @response.request_headers,
+ request: sanitized_request_headers,
response: @response.response_headers
)
rescue => e
"[Unable to show headers: #{e}]"
end
@@ -40,10 +36,30 @@
def errors
JSON::pretty_generate(JSON::parse(@body)["errors"])
rescue
@body
end
+
+ def status_message
+ HTTP_STATUS_CODES.fetch(status, 'UNKNOWN STATUS')
+ end
+
+ def sanitized_request_headers
+ return request_headers unless request_headers['Authorization']
+ request_headers.merge('Authorization' => truncated_authorization_value)
+ end
+
+ def request_headers
+ @response.request_headers
+ end
+
+ def truncated_authorization_value
+ bearer, token = request_headers['Authorization'].split(/\s+/)
+ token_parts = token.split('~')
+ token_parts[-1] = token_parts.last[0, 4]
+ "Bearer #{token_parts.join('~')}..."
+ end
end
%w(
BadRequest Unauthorized Forbidden
NotFound MethodNotAllowed InternalServerError
@@ -70,6 +86,68 @@
key = response[:status].to_i
raise ERROR_MAP[key].new(response) if ERROR_MAP.has_key? key
end
end
-end
\ No newline at end of file
+ # Every standard HTTP code mapped to the appropriate message. Ripped directly from
+ # the Rack::Utils source :-)
+ HTTP_STATUS_CODES = {
+ 100 => 'Continue',
+ 101 => 'Switching Protocols',
+ 102 => 'Processing',
+ 200 => 'OK',
+ 201 => 'Created',
+ 202 => 'Accepted',
+ 203 => 'Non-Authoritative Information',
+ 204 => 'No Content',
+ 205 => 'Reset Content',
+ 206 => 'Partial Content',
+ 207 => 'Multi-Status',
+ 208 => 'Already Reported',
+ 226 => 'IM Used',
+ 300 => 'Multiple Choices',
+ 301 => 'Moved Permanently',
+ 302 => 'Found',
+ 303 => 'See Other',
+ 304 => 'Not Modified',
+ 305 => 'Use Proxy',
+ 307 => 'Temporary Redirect',
+ 308 => 'Permanent Redirect',
+ 400 => 'Bad Request',
+ 401 => 'Unauthorized',
+ 402 => 'Payment Required',
+ 403 => 'Forbidden',
+ 404 => 'Not Found',
+ 405 => 'Method Not Allowed',
+ 406 => 'Not Acceptable',
+ 407 => 'Proxy Authentication Required',
+ 408 => 'Request Timeout',
+ 409 => 'Conflict',
+ 410 => 'Gone',
+ 411 => 'Length Required',
+ 412 => 'Precondition Failed',
+ 413 => 'Payload Too Large',
+ 414 => 'URI Too Long',
+ 415 => 'Unsupported Media Type',
+ 416 => 'Range Not Satisfiable',
+ 417 => 'Expectation Failed',
+ 421 => 'Misdirected Request',
+ 422 => 'Unprocessable Entity',
+ 423 => 'Locked',
+ 424 => 'Failed Dependency',
+ 426 => 'Upgrade Required',
+ 428 => 'Precondition Required',
+ 429 => 'Too Many Requests',
+ 431 => 'Request Header Fields Too Large',
+ 500 => 'Internal Server Error',
+ 501 => 'Not Implemented',
+ 502 => 'Bad Gateway',
+ 503 => 'Service Unavailable',
+ 504 => 'Gateway Timeout',
+ 505 => 'HTTP Version Not Supported',
+ 506 => 'Variant Also Negotiates',
+ 507 => 'Insufficient Storage',
+ 508 => 'Loop Detected',
+ 510 => 'Not Extended',
+ 511 => 'Network Authentication Required'
+ }
+end