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 19:45:35 +02:00
102 = > 'Processing' , #WebDAV
2010-05-31 15:04:52 +02:00
2010-01-26 19:41:53 +01:00
200 = > 'OK' ,
201 = > 'Created' ,
202 = > 'Accepted' ,
2010-05-31 19:45:35 +02:00
203 = > 'Non-Authoritative Information' , # http/1.1
2010-01-26 19:41:53 +01:00
204 = > 'No Content' ,
205 = > 'Reset Content' ,
206 = > 'Partial Content' ,
2010-05-31 19:45:35 +02:00
207 = > 'Multi-Status' , #WebDAV
2010-01-26 19:41:53 +01:00
300 = > 'Multiple Choices' ,
301 = > 'Moved Permanently' ,
302 = > 'Found' ,
2010-05-31 19:45:35 +02:00
303 = > 'See Other' , # http/1.1
2010-01-26 19:41:53 +01:00
304 = > 'Not Modified' ,
2010-05-31 19:45:35 +02:00
305 = > 'Use Proxy' , # http/1.1
306 = > 'Switch Proxy' , # no longer used
307 = > 'Temporary Redirect' , # http/1.1
2013-08-01 12:24:18 +10:00
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 19:45:35 +02:00
418 = > 'I\'m A Teapot' ,
421 = > 'Too Many Connections From This IP' ,
422 = > 'Unprocessable Entity' , #WebDAV
423 = > 'Locked' , #WebDAV
424 = > 'Failed Dependency' , #WebDAV
425 = > 'Unordered Collection' , #WebDAV
2013-08-01 12:24:18 +10:00
426 = > 'Upgrade Required' ,
2010-05-31 19:45:35 +02:00
449 = > 'Retry With' , #Microsoft
450 = > 'Blocked By Windows Parental Controls' , #Microsoft
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' ,
2010-05-31 19:45:35 +02:00
507 = > 'Insufficient Storage' , #WebDAV
509 = > 'Bandwidth Limit Exceeded' , #Apache
2010-05-31 15:04:52 +02:00
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-11-20 11:50:10 -05:00
attr_accessor :response
attr_writer :message
2008-06-25 19:02:02 -07:00
2010-07-02 23:21:32 +02:00
def initialize response = nil , initial_response_code = nil
2009-12-29 18:27:39 +01:00
@response = response
2013-04-03 00:59:43 +09:00
@message = nil
2010-07-02 23:21:32 +02:00
@initial_response_code = initial_response_code
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
2010-07-02 23:21:32 +02:00
if @response
@response . code . to_i
else
@initial_response_code
end
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-06-26 11:02:23 +02:00
@response . body if @response
2010-01-18 22:15:15 +01:00
end
def inspect
2010-07-02 23:21:32 +02:00
" #{ message } : #{ http_body } "
2010-07-02 18:33:16 +02:00
end
def to_s
inspect
2010-01-18 22:15:15 +01:00
end
2013-08-01 12:24:18 +10:00
2010-11-20 11:50:10 -05:00
def message
@message || self . class . name
end
2010-01-18 22:15:15 +01:00
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-07-02 23:21:32 +02:00
send ( :define_method , :message ) { " #{ http_code ? " #{ http_code } " : '' } #{ message } " }
2009-12-29 18:27:39 +01:00
end
2010-05-31 19:45:35 +02:00
klass_constant = const_set message . delete ( ' \-\'' ) , klass
2010-01-25 20:10:13 +01:00
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
2013-07-31 21:28:30 +10:00
def message
'Redirect'
end
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
2013-08-01 12:24:18 +10:00
class MaxRedirectsReached < Exception
2013-07-31 21:28:30 +10:00
def message
2013-08-01 12:24:18 +10:00
'Maximum number of redirect reached'
2013-07-31 21:28:30 +10:00
end
2010-12-16 12:41:12 -05:00
end
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-11-20 11:50:10 -05:00
def initialize ( message = 'Server broke connection' )
super nil , nil
self . message = message
end
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 )
2010-07-02 23:21:32 +02:00
super nil , nil
2010-05-13 11:56:56 -05:00
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