This repository has been archived by the owner on Mar 9, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 143
/
TDStatus.m
70 lines (58 loc) · 2.84 KB
/
TDStatus.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//
// TDStatus.m
// TouchDB
//
// Created by Jens Alfke on 4/6/12.
// Copyright (c) 2012 Couchbase, Inc. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
// except in compliance with the License. You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software distributed under the
// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
// either express or implied. See the License for the specific language governing permissions
// and limitations under the License.
#import "TDStatus.h"
NSString* const TDHTTPErrorDomain = @"TDHTTP";
struct StatusMapEntry {
TDStatus status;
int httpStatus;
NSString* message;
};
static const struct StatusMapEntry kStatusMap[] = {
{kTDStatusNotFound, 404, @"not_found"}, // for compatibility with CouchDB
{kTDStatusDuplicate, 412, @"Already exists"}, // really 'Precondition Failed'
{kTDStatusBadEncoding, 400, @"Bad data encoding"},
{kTDStatusBadAttachment, 400, @"Invalid attachment"},
{kTDStatusAttachmentNotFound, 404, @"Attachment not found"},
{kTDStatusBadJSON, 400, @"Invalid JSON"},
{kTDStatusBadID, 400, @"Invalid database/document/revision ID"},
{kTDStatusBadParam, 400, @"Invalid parameter in JSON body"},
{kTDStatusDeleted, 404, @"deleted"},
{kTDStatusUpstreamError, 502, @"Invalid response from remote replication server"},
{kTDStatusDBError, 500, @"Database error!"},
{kTDStatusCorruptError, 500, @"Invalid data in database"},
{kTDStatusAttachmentError, 500, @"Attachment store error"},
{kTDStatusCallbackError, 500, @"Application callback block failed"},
{kTDStatusException, 500, @"Internal error"},
};
int TDStatusToHTTPStatus( TDStatus status, NSString** outMessage ) {
for (unsigned i=0; i < sizeof(kStatusMap)/sizeof(kStatusMap[0]); ++i) {
if (kStatusMap[i].status == status) {
if (outMessage)
*outMessage = kStatusMap[i].message;
return kStatusMap[i].httpStatus;
}
}
if (outMessage)
*outMessage = [NSHTTPURLResponse localizedStringForStatusCode: status];
return status;
}
NSError* TDStatusToNSError( TDStatus status, NSURL* url ) {
NSString* reason;
status = TDStatusToHTTPStatus(status, &reason);
NSDictionary* info = $dict({NSURLErrorKey, url},
{NSLocalizedFailureReasonErrorKey, reason},
{NSLocalizedDescriptionKey, $sprintf(@"%i %@", status, reason)});
return [NSError errorWithDomain: TDHTTPErrorDomain code: status userInfo: info];
}