Output a string representation of the HTTP status code in the HTTP operation log. Add RKStringFromStatusCode convenience method to the HTTP utilities

This commit is contained in:
Blake Watters
2012-12-13 17:52:51 -05:00
parent 280fd5d571
commit abd07043f3
3 changed files with 106 additions and 7 deletions

View File

@@ -78,9 +78,15 @@ NSRange RKStatusCodeRangeForClass(RKStatusCodeClass statusCodeClass);
*/
NSIndexSet *RKStatusCodeIndexSetForClass(RKStatusCodeClass statusCodeClass);
// TODO: Implement these guys...
//NSString * RKStringFromStatusCode(NSInteger statusCode);
//NSInteger RKStatusCodeFromString(NSString *statusCode);
/**
Returns string representation of a given HTTP status code.
The list of supported status codes was built from http://en.wikipedia.org/wiki/List_of_HTTP_status_codes
@param statusCode The HTTP status code to return a string from.
@return A string representation of the given status code.
*/
NSString *RKStringFromStatusCode(NSInteger statusCode);
/**
Parse HTTP Date: http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1

View File

@@ -59,6 +59,97 @@ RKRequestMethod RKRequestMethodFromString(NSString *methodName)
else return RKRequestMethodInvalid;
}
// Built from http://en.wikipedia.org/wiki/List_of_HTTP_status_codes
static NSDictionary *RKStatusCodesToNamesDictionary()
{
static NSDictionary *statusCodesToNamesDictionary = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
statusCodesToNamesDictionary = @{
// 1xx (Informational)
@(100): @"Continue",
@(101): @"Switching Protocols",
@(102): @"Processing",
// 2xx (Success)
@(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",
// 3xx (Redirection)
@(300): @"Multiple Choices",
@(301): @"Moved Permanently",
@(302): @"Found",
@(303): @"See Other",
@(304): @"Not Modified",
@(305): @"Use Proxy",
@(306): @"Switch Proxy",
@(307): @"Temporary Redirect",
@(308): @"Permanent Redirect",
// 4xx (Client Error)
@(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): @"Request Entity Too Large",
@(414): @"Request-URI Too Long",
@(415): @"Unsupported Media Type",
@(416): @"Requested Range Not Satisfiable",
@(417): @"Expectation Failed",
@(418): @"I'm a teapot",
@(420): @"Enhance Your Calm",
@(422): @"Unprocessable Entity",
@(423): @"Locked",
@(424): @"Failed Dependency",
@(424): @"Method Failure",
@(425): @"Unordered Collection",
@(426): @"Upgrade Required",
@(428): @"Precondition Required",
@(429): @"Too Many Requests",
@(431): @"Request Header Fields Too Large",
@(451): @"Unavailable For Legal Reasons",
// 5xx (Server Error)
@(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",
@(509): @"Bandwidth Limit Exceeded",
@(510): @"Not Extended",
@(511): @"Network Authentication Required",
};
});
return statusCodesToNamesDictionary;
}
NSString * RKStringFromStatusCode(NSInteger statusCode)
{
return [RKStatusCodesToNamesDictionary() objectForKey:@(statusCode)];
}
/**
Below is ragel source used to compile those tables. The output was polished / pretty-printed and tweaked from ragel.
As the generated code is "hard" to debug, we store the code in http-date.r1