2008-06-11 12:31:39 -07:00
module RestClient
2010-01-18 22:15:15 +01:00
2010-01-26 19:41:53 +01:00
STATUSES = { 100 = > 'Continue' ,
101 = > 'Switching Protocols' ,
2010-05-31 15:04:52 +02:00
102 = > 'Processing' ,
2010-01-26 19:41:53 +01:00
200 = > 'OK' ,
201 = > 'Created' ,
202 = > 'Accepted' ,
203 = > 'Non-Authoritative Information' ,
204 = > 'No Content' ,
205 = > 'Reset Content' ,
206 = > 'Partial Content' ,
2010-05-25 18:49:09 +02:00
207 = > 'Multi-Status' ,
2010-01-26 19:41:53 +01:00
300 = > 'Multiple Choices' ,
301 = > 'Moved Permanently' ,
302 = > 'Found' ,
303 = > 'See Other' ,
304 = > 'Not Modified' ,
305 = > 'Use Proxy' ,
2010-05-25 18:55:57 +02:00
307 = > 'Temporary Redirect' ,
2010-01-26 19:41:53 +01:00
400 = > 'Bad Request' ,
401 = > 'Unauthorized' ,
2010-05-31 15:04:52 +02:00
402 = > 'Payment Required' ,
2010-01-26 19:41:53 +01:00
403 = > 'Forbidden' ,
404 = > 'Resource 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 = > 'Request Entity Too Large' ,
414 = > 'Request-URI Too Long' ,
415 = > 'Unsupported Media Type' ,
416 = > 'Requested Range Not Satisfiable' ,
417 = > 'Expectation Failed' ,
2010-05-31 15:04:52 +02:00
422 = > 'Unprocessable Entity' ,
423 = > 'Locked' ,
424 = > 'Failed Dependency' ,
425 = > 'No Code' ,
426 = > 'Upgrade Required' ,
2010-01-26 19:41:53 +01:00
500 = > 'Internal Server Error' ,
501 = > 'Not Implemented' ,
502 = > 'Bad Gateway' ,
503 = > 'Service Unavailable' ,
504 = > 'Gateway Timeout' ,
2010-05-31 15:04:52 +02:00
505 = > 'HTTP Version Not Supported' ,
506 = > 'Variant Also Negotiates' ,
507 = > 'Insufficient Storage' ,
510 = > 'Not Extended' }
2010-01-26 19:41:53 +01:00
2010-02-06 22:32:52 +01:00
# Compatibility : make the Response act like a Net::HTTPResponse when needed
module ResponseForException
def method_missing symbol , * args
if net_http_res . respond_to? symbol
warn " [warning] The response contained in an RestClient::Exception is now a RestClient::Response instead of a Net::HTTPResponse, please update your code "
net_http_res . send symbol , * args
else
super
end
end
end
2009-12-29 18:27:39 +01:00
# This is the base RestClient exception class. Rescue it if you want to
# catch any exception that your request might raise
2010-01-20 19:57:38 +01:00
# You can get the status code by e.http_code, or see anything about the
# response via e.response.
# For example, the entire result body (which is
# probably an HTML error page) is e.response.
2009-12-29 18:27:39 +01:00
class Exception < RuntimeError
2010-01-18 22:15:15 +01:00
attr_accessor :message , :response
2008-06-25 19:02:02 -07:00
2010-01-18 22:15:15 +01:00
def initialize response = nil
2009-12-29 18:27:39 +01:00
@response = response
2010-02-06 22:32:52 +01:00
# compatibility: this make the exception behave like a Net::HTTPResponse
2010-03-09 15:09:40 -05:00
response . extend ResponseForException if response
2009-12-29 18:27:39 +01:00
end
2008-11-26 17:42:16 -08:00
2009-12-29 18:27:39 +01:00
def http_code
2010-01-20 19:57:38 +01:00
# return integer for compatibility
@response . code . to_i if @response
2009-12-29 18:27:39 +01:00
end
2009-06-29 16:22:54 -07:00
2009-12-29 18:27:39 +01:00
def http_body
2010-01-25 22:04:59 +01:00
@response . body
2010-01-18 22:15:15 +01:00
end
def inspect
" #{ self . class } : #{ http_code } #{ message } "
end
end
2010-01-25 19:36:20 +01:00
# Compatibility
class ExceptionWithResponse < Exception
end
2010-01-25 20:10:13 +01:00
# The request failed with an error code not managed by the code
class RequestFailed < ExceptionWithResponse
def message
" HTTP status code #{ http_code } "
end
def to_s
message
end
end
2010-01-18 22:15:15 +01:00
# We will a create an exception for each status code, see http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
module Exceptions
# Map http status codes to the corresponding exception class
EXCEPTIONS_MAP = { }
end
2010-01-26 19:41:53 +01:00
STATUSES . each_pair do | code , message |
2010-01-25 20:10:13 +01:00
# Compatibility
superclass = ( [ 304 , 401 , 404 ] . include? code ) ? ExceptionWithResponse : RequestFailed
klass = Class . new ( superclass ) do
2010-01-21 18:48:10 +01:00
send ( :define_method , :message ) { message }
2009-12-29 18:27:39 +01:00
end
2010-01-25 20:10:13 +01:00
klass_constant = const_set message . gsub ( / / , '' ) . gsub ( / - / , '' ) , klass
Exceptions :: EXCEPTIONS_MAP [ code ] = klass_constant
2009-12-29 18:27:39 +01:00
end
2008-11-26 17:42:16 -08:00
2009-12-29 18:27:39 +01:00
# A redirect was encountered; caught by execute to retry with the new url.
class Redirect < Exception
2010-01-18 22:15:15 +01:00
message = 'Redirect'
2008-06-25 19:02:02 -07:00
2009-12-29 18:27:39 +01:00
attr_accessor :url
2008-06-11 12:31:39 -07:00
2009-12-29 18:27:39 +01:00
def initialize ( url )
@url = url
end
end
2008-10-14 23:38:13 +09:00
2009-12-29 18:27:39 +01:00
# The server broke the connection prior to the request completing. Usually
# this means it crashed, or sometimes that your network connection was
# severed before it could complete.
class ServerBrokeConnection < Exception
2010-01-18 22:15:15 +01:00
message = 'Server broke connection'
2009-12-29 18:27:39 +01:00
end
2008-06-20 20:39:13 -07:00
2010-05-13 11:56:56 -05:00
class SSLCertificateNotVerified < Exception
def initialize ( message )
super ( nil )
self . message = message
end
end
2008-06-12 11:21:39 -07:00
end
2008-06-20 19:09:57 -07:00
# backwards compatibility
2008-06-23 13:50:08 -07:00
class RestClient :: Request
2009-12-29 18:27:39 +01:00
Redirect = RestClient :: Redirect
Unauthorized = RestClient :: Unauthorized
RequestFailed = RestClient :: RequestFailed
2008-06-23 13:50:08 -07:00
end