68

Does anyone know if/where the HTTP status codes, as specified here, are defined in the iOS SDK? Or should I expect to manually re-define them in a constants file?

Vadim Kotov
  • 8,084
  • 8
  • 48
  • 62
esilver
  • 27,713
  • 23
  • 122
  • 168
  • 1
    I did a grep -r '404' * in /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/System/Library/Frameworks/ and came up empty handed so the answer is almost certainly "no". – Kalle Jun 21 '11 at 11:20
  • 1
    @Kalle You should post your comment as an answer, it seems to be a definitive one to me. – benzado Jun 22 '11 at 16:53
  • Done. :) (Min comment length filler) – Kalle Jun 22 '11 at 17:53
  • try [this library](https://github.com/rhodgkins/SwiftHTTPStatusCodes) – Gerald Jun 06 '16 at 08:51

7 Answers7

33

Well, they are defined in the sense that

[NSHTTPURLResponse localizedStringForStatusCode:(NSInteger)statusCode]

can return a string for the given status code. Is that what you are looking for?

Matthew Gillingham
  • 3,429
  • 1
  • 22
  • 26
  • 9
    Not quite -- I use HTTP status codes to control application logic - for example, 402 will trigger an AlertView telling the user that he should make an in-app purchase to continue. I have #defined HTTP_PAYMENT_REQUIRED 402, but I feel like that should already be present someplace in the API, as it is with Android. – esilver Apr 22 '11 at 19:37
27

I did a

grep -r '404' *

in

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/System/Lib‌​rary/Frameworks/ 

and came up empty handed so the answer is almost certainly "no".

Kalle
  • 13,186
  • 7
  • 61
  • 76
  • 1
    Or maybe the codes are defined somewhere as an enum with relative values, like kHTTPErrorBadRequestCodes = 400 and kHTTPErrorNotFound = kHTTPErrorBadRequestCodes+4... so you can't be sure... – AliSoftware Jun 22 '11 at 18:39
  • 3
    I can with confidence say that that would be pretty absurd, so I doubt it. – Kalle Jun 22 '11 at 19:11
  • I agree, I doubt it too ;) but we call still keep hoping ^^ – AliSoftware Jun 22 '11 at 20:37
6

There is a complete Obj-C library with all the codes defined to date: https://github.com/rafiki270/HTTP-Status-Codes-for-Objective-C

UPDATE: New Swift version is here: https://github.com/manGoweb/StatusCodes

Ondrej Rafaj
  • 4,342
  • 8
  • 42
  • 65
6

I'm afraid you'll have to manually define them. I'm not familiar with Objective-C, following is my swift definition:

HTTP Status Enum in Swift 4 based on https://httpstatuses.com/

/// HTTP Statuses
///
/// - continue: Continue
/// - switchingProtocols: Switching Protocols
/// - processing: Processing
/// - ok: OK
/// - created: Created
/// - accepted: Accepted
/// - nonAuthoritativeInformation: Non-authoritative Information
/// - noContent: No Content
/// - resetContent: Reset Content
/// - partialContent: Partial Content
/// - multiStatus: Multi-Status
/// - alreadyReported: Already Reported
/// - iAmUsed: IM Used
/// - multipleChoices: Multiple Choices
/// - movedPermanently: Moved Permanently
/// - found: Found
/// - seeOther: See Other
/// - notModified: Not Modified
/// - useProxy: Use Proxy
/// - temporaryRedirect: Temporary Redirect
/// - permanentRedirect: Permanent Redirect
/// - badRequest: Bad Request
/// - unauthorized: Unauthorized
/// - paymentRequired: Payment Required
/// - forbidden: Forbidden
/// - notFound: Not Found
/// - methodNotAllowed: Method Not Allowed
/// - notAcceptable: Not Acceptable
/// - proxyAuthenticationRequired: Proxy Authentication Required
/// - requestTimeout: Request Timeout
/// - conflict: Conflict
/// - gone: Gone
/// - lengthRequired: Length Required
/// - preconditionFailed: Precondition Failed
/// - payloadTooLarge: Payload Too Large
/// - requestURITooLong: Request-URI Too Long
/// - unsupportedMediaType: Unsupported Media Type
/// - requestedRangeNotSatisfiable: Requested Range Not Satisfiable
/// - expectationFailed: Expectation Failed
/// - iAmATeapot: I'm a teapot
/// - misdirectedRequest: Misdirected Request
/// - unprocessableEntity: Unprocessable Entity
/// - locked: Locked
/// - failedDependency: Failed Dependency
/// - upgradeRequired: Upgrade Required
/// - preconditionRequired: Precondition Required
/// - tooManyRequests: Too Many Requests
/// - requestHeaderFieldsTooLarge: Request Header Fields Too Large
/// - connectionClosedWithoutResponse: Connection Closed Without Response
/// - unavailableForLegalReasons: Unavailable For Legal Reasons
/// - clientClosedRequest: Client Closed Request
/// - internalServerError: Internal Server Error
/// - notImplemented: Not Implemented
/// - badGateway: Bad Gateway
/// - serviceUnavailable: Service Unavailable
/// - gatewayTimeout: Gateway Timeout
/// - httpVersionNotSupported: HTTP Version Not Supported
/// - variantAlsoNegotiates: Variant Also Negotiates
/// - insufficientStorage: Insufficient Storage
/// - loopDetected: Loop Detected
/// - notExtended: Not Extended
/// - networkAuthenticationRequired: Network Authentication Required
/// - networkConnectTimeoutError: Network Connect Timeout Error
enum HttpStatus: Int {
    case `continue` = 100
    case switchingProtocols = 101
    case processing = 102
    case ok = 200
    case created = 201
    case accepted = 202
    case nonAuthoritativeInformation = 203
    case noContent = 204
    case resetContent = 205
    case partialContent = 206
    case multiStatus = 207
    case alreadyReported = 208
    case iAmUsed = 226
    case multipleChoices = 300
    case movedPermanently = 301
    case found = 302
    case seeOther = 303
    case notModified = 304
    case useProxy = 305
    case temporaryRedirect = 307
    case permanentRedirect = 308
    case badRequest = 400
    case unauthorized = 401
    case paymentRequired = 402
    case forbidden = 403
    case notFound = 404
    case methodNotAllowed = 405
    case notAcceptable = 406
    case proxyAuthenticationRequired = 407
    case requestTimeout = 408
    case conflict = 409
    case gone = 410
    case lengthRequired = 411
    case preconditionFailed = 412
    case payloadTooLarge = 413
    case requestURITooLong = 414
    case unsupportedMediaType = 415
    case requestedRangeNotSatisfiable = 416
    case expectationFailed = 417
    case iAmATeapot = 418
    case misdirectedRequest = 421
    case unprocessableEntity = 422
    case locked = 423
    case failedDependency = 424
    case upgradeRequired = 426
    case preconditionRequired = 428
    case tooManyRequests = 429
    case requestHeaderFieldsTooLarge = 431
    case connectionClosedWithoutResponse = 444
    case unavailableForLegalReasons = 451
    case clientClosedRequest = 499
    case internalServerError = 500
    case notImplemented = 501
    case badGateway = 502
    case serviceUnavailable = 503
    case gatewayTimeout = 504
    case httpVersionNotSupported = 505
    case variantAlsoNegotiates = 506
    case insufficientStorage = 507
    case loopDetected = 508
    case notExtended = 510
    case networkAuthenticationRequired = 511
    case networkConnectTimeoutError = 599
}

extension HttpStatus: CustomStringConvertible {
    var description: String {
        // HTTPURLResponse.localizedString(forStatusCode: rawValue)
        return NSLocalizedString(
            "http_status_\(rawValue)",
            tableName: "HttpStatusEnum",
            comment: ""
        )
    }
}

HttpStatusEnum.strings:

/// HTTP Status
"http_status_100" = "Continue";
"http_status_101" = "Switching Protocols";
"http_status_102" = "Processing";
"http_status_200" = "OK";
"http_status_201" = "Created";
"http_status_202" = "Accepted";
"http_status_203" = "Non-authoritative Information";
"http_status_204" = "No Content";
"http_status_205" = "Reset Content";
"http_status_206" = "Partial Content";
"http_status_207" = "Multi-Status";
"http_status_208" = "Already Reported";
"http_status_226" = "IM Used";
"http_status_300" = "Multiple Choices";
"http_status_301" = "Moved Permanently";
"http_status_302" = "Found";
"http_status_303" = "See Other";
"http_status_304" = "Not Modified";
"http_status_305" = "Use Proxy";
"http_status_307" = "Temporary Redirect";
"http_status_308" = "Permanent Redirect";
"http_status_400" = "Bad Request";
"http_status_401" = "Unauthorized";
"http_status_402" = "Payment Required";
"http_status_403" = "Forbidden";
"http_status_404" = "Not Found";
"http_status_405" = "Method Not Allowed";
"http_status_406" = "Not Acceptable";
"http_status_407" = "Proxy Authentication Required";
"http_status_408" = "Request Timeout";
"http_status_409" = "Conflict";
"http_status_410" = "Gone";
"http_status_411" = "Length Required";
"http_status_412" = "Precondition Failed";
"http_status_413" = "Payload Too Large";
"http_status_414" = "Request-URI Too Long";
"http_status_415" = "Unsupported Media Type";
"http_status_416" = "Requested Range Not Satisfiable";
"http_status_417" = "Expectation Failed";
"http_status_418" = "I'm a teapot";
"http_status_421" = "Misdirected Request";
"http_status_422" = "Unprocessable Entity";
"http_status_423" = "Locked";
"http_status_424" = "Failed Dependency";
"http_status_426" = "Upgrade Required";
"http_status_428" = "Precondition Required";
"http_status_429" = "Too Many Requests";
"http_status_431" = "Request Header Fields Too Large";
"http_status_444" = "Connection Closed Without Response";
"http_status_451" = "Unavailable For Legal Reasons";
"http_status_499" = "Client Closed Request";
"http_status_500" = "Internal Server Error";
"http_status_501" = "Not Implemented";
"http_status_502" = "Bad Gateway";
"http_status_503" = "Service Unavailable";
"http_status_504" = "Gateway Timeout";
"http_status_505" = "HTTP Version Not Supported";
"http_status_506" = "Variant Also Negotiates";
"http_status_507" = "Insufficient Storage";
"http_status_508" = "Loop Detected";
"http_status_510" = "Not Extended";
"http_status_511" = "Network Authentication Required";
"http_status_599" = "Network Connect Timeout Error";
macseed
  • 61
  • 1
  • 2
2

I also could not find a header file which I expected to exist, so I had to write one of my own.

With HTTPStatusCodes.h contained in nv-ios-http-status project at GitHub, dispatch based on HTTP status codes can be written like the following.

#import "HTTPStatusCodes.h"

......

- (void)connection:(NSURLConnection *)connection
  didReceiveResponse:(NSURLResponse *)response
{
    NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;

    switch ([res statusCode])
    {
        // 200 OK
        case kHTTPStatusCodeOK:
            ......;
    }

    ......
}

I hope HTTPStatusCodes.h can save time of you and other developers.

Takahiko Kawasaki
  • 18,118
  • 9
  • 62
  • 105
2

There is also a Swift pendant to reuse it:

https://github.com/rhodgkins/SwiftHTTPStatusCodes

Jan
  • 12,992
  • 9
  • 53
  • 89
2

The http status code can be defined by the server response. When there is a connection, you can use the NSURLResponse to read out the statusCode. Those 4** response can be defined internally on your server.

JocelynH
  • 146
  • 5
  • 1
    I think JocelynH has got it right: per the w3.org [link](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html) in the OP, "Except when responding to a HEAD request, the server SHOULD include an entity containing an explanation of the error situation..." My guess is that Apple chose, for whatever reason, to opt out of the enum game for the 400-range of errors because they're supposed to be service-dependant. (Not that I necessarily agree with this reasoning.) – clozach Aug 25 '11 at 18:27