moduleRestClientSTATUSES={100=>'Continue',101=>'Switching Protocols',200=>'OK',201=>'Created',202=>'Accepted',203=>'Non-Authoritative Information',204=>'No Content',205=>'Reset Content',206=>'Partial Content',300=>'Multiple Choices',301=>'Moved Permanently',302=>'Found',303=>'See Other',304=>'Not Modified',305=>'Use Proxy',400=>'Bad Request',401=>'Unauthorized',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',500=>'Internal Server Error',501=>'Not Implemented',502=>'Bad Gateway',503=>'Service Unavailable',504=>'Gateway Timeout',505=>'HTTP Version Not Supported'}# Compatibility : make the Response act like a Net::HTTPResponse when neededmoduleResponseForExceptiondefmethod_missingsymbol,*argsifnet_http_res.respond_to?symbolwarn"[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.sendsymbol,*argselsesuperendendend# This is the base RestClient exception class. Rescue it if you want to# catch any exception that your request might raise# 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.classException<RuntimeErrorattr_accessor:message,:responsedefinitializeresponse=nil@response=response# compatibility: this make the exception behave like a Net::HTTPResponseresponse.extendResponseForExceptionenddefhttp_code# return integer for compatibility@response.code.to_iif@responseenddefhttp_body@response.bodyenddefinspect"#{self.class} : #{http_code}#{message}"endend# CompatibilityclassExceptionWithResponse<Exceptionend# The request failed with an error code not managed by the codeclassRequestFailed<ExceptionWithResponsedefmessage"HTTP status code #{http_code}"enddefto_smessageendend# We will a create an exception for each status code, see http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.htmlmoduleExceptions# Map http status codes to the corresponding exception classEXCEPTIONS_MAP={}endSTATUSES.each_pairdo|code,message|# Compatibilitysuperclass=([304,401,404].include?code)?ExceptionWithResponse:RequestFailedklass=Class.new(superclass)dosend(:define_method,:message){message}endklass_constant=const_setmessage.gsub(/ /,'').gsub(/-/,''),klassExceptions::EXCEPTIONS_MAP[code]=klass_constantend# A redirect was encountered; caught by execute to retry with the new url.classRedirect<Exceptionmessage='Redirect'attr_accessor:urldefinitialize(url)@url=urlendend# 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.classServerBrokeConnection<Exceptionmessage='Server broke connection'endend# backwards compatibilityclassRestClient::RequestRedirect=RestClient::RedirectUnauthorized=RestClient::UnauthorizedRequestFailed=RestClient::RequestFailedend