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;
}