static id _ParseAPIResponse()

in TNLExample/TAPI/TAPIResponse.m [74:118]


static id _ParseAPIResponse(TNLResponseInfo *info, NSError ** errorOut, NSError ** apiErrorOut)
{
    id json = nil;
    NSError *parseError = nil;
    __block NSError *apiError = TNLHTTPStatusCodeIsSuccess(info.statusCode) ? nil : [NSError errorWithDomain:TAPIErrorDomain code:0 userInfo:nil];

    NSInteger statusCode = info.statusCode;
    NSData *data = info.data;
    TNLAssert(statusCode > 0);

    BOOL hasDocTypePrefix = _DataBeginsWithHTMLDocType(data);
    if (hasDocTypePrefix) {
        parseError = [NSError errorWithDomain:TAPIOperationErrorDomain
                                         code:TAPIOperationErrorCodeServiceEncounteredTechnicalError
                                     userInfo:nil];
    } else {
        json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&parseError];
        if (json) {
            NSArray *apiErrors = _ExtractAPIErrors(json);

            // Underlying behavior in some 4XX errors
            if (TNLHTTPStatusCodeIsClientError(statusCode)) {
                [apiErrors enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
                    NSError *currentError = obj;
                    if ([currentError.domain isEqualToString:TAPIErrorDomain]) {
                        apiError = currentError;
                        *stop = YES;
                    }
                }];
            }
        } else {
            parseError = [NSError errorWithDomain:TAPIParseErrorDomain
                                             code:TAPIParseErrorCodeCannotParseResponse
                                         userInfo:(parseError) ? @{ NSUnderlyingErrorKey : parseError } : nil];
        }
    }

    if (errorOut) {
        *errorOut = parseError;
    }
    if (apiErrorOut) {
        *apiErrorOut = apiError;
    }
    return json;
}