-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathSimpleHttpClientRequest.m
More file actions
224 lines (187 loc) · 6.41 KB
/
SimpleHttpClientRequest.m
File metadata and controls
224 lines (187 loc) · 6.41 KB
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
#import "SimpleHttpClientRequest.h"
#import "NSString+EncodingURL.h"
@implementation SimpleHttpClientRequest
@synthesize request = _request;
//----------------------------------------------------------------------------//
#pragma mark -- Internal --
//----------------------------------------------------------------------------//
- (NSString *)makeParamPairWithKey:(NSString *)key value:(id)value
{
if ([value isKindOfClass:[NSNumber class]]) {
value = [value description];
}
if (![value isKindOfClass:[NSString class]]) {
return nil;
}
return [NSString
stringWithFormat:@"%@=%@&", key, [value stringByEncodingURL]
];
}
- (NSString *)makeParamString:(NSDictionary *)parameters
{
NSMutableString *paramString = [NSMutableString string];
if (!parameters) {
return paramString;
}
NSEnumerator *paramEnum = [parameters keyEnumerator];
id key;
while (key = [paramEnum nextObject]) {
if (![key isKindOfClass:[NSString class]]) {
continue;
}
NSString *encodedKey = [key stringByEncodingURL];
id value = [parameters objectForKey:key];
NSString *keyValuePair = [self
makeParamPairWithKey:encodedKey
value:value
];
if (keyValuePair) {
[paramString appendString:keyValuePair];
continue;
}
if (![value isKindOfClass:[NSArray class]]) {
continue;
}
NSEnumerator *valueEnum = [value objectEnumerator];
id valueElem;
while (valueElem = [valueEnum nextObject]) {
NSString *elemKeyValuePair = [self
makeParamPairWithKey:encodedKey
value:valueElem
];
if (elemKeyValuePair) {
[paramString appendString:elemKeyValuePair];
}
}
}
if (paramString.length > 0) { // delete last '&'.
[paramString deleteCharactersInRange:NSMakeRange(paramString.length-1, 1)];
}
return paramString;
}
- (void)setRequestWithMethod:(SimpleHttpClientRequestMethod)method
headers:(NSDictionary *)headers
body:(NSString *)body
{
[_request setHTTPMethod:(
SimpleHttpClientRequestMethodPUT == method ? @"PUT" : @"POST"
)];
NSMutableDictionary *setHeaders = [NSMutableDictionary
dictionaryWithDictionary:[_request allHTTPHeaderFields]
];
[setHeaders addEntriesFromDictionary:headers];
[_request setAllHTTPHeaderFields:setHeaders];
NSData *bodyData = [body dataUsingEncoding:NSUTF8StringEncoding];
[_request
setValue:[NSString stringWithFormat:@"%d", bodyData.length]
forHTTPHeaderField:@"Content-Length"
];
[_request setHTTPBody:bodyData];
}
- (void)setGetOrDeleteRequestWithMethod:(SimpleHttpClientRequestMethod)method
url:(NSString *)url
parameters:(NSDictionary *)parameters
{
NSString *paramString = [self makeParamString:parameters];
NSMutableString *requestUrl = [NSMutableString stringWithString:url];
if (paramString.length > 0) {
[requestUrl appendString:@"?"];
[requestUrl appendString:paramString];
}
[_request setURL:[NSURL URLWithString:requestUrl]];
if (SimpleHttpClientRequestMethodDELETE == method) {
[_request setHTTPMethod:@"DELETE"];
}
}
- (void)setPostOrPutRequestWithMethod:(SimpleHttpClientRequestMethod)method
parameters:(NSDictionary *)parameters
{
[self
setRequestWithMethod:method
headers:[NSDictionary
dictionaryWithObject:@"application/x-www-form-urlencoded"
forKey:@"Content-Type"
]
body:[self makeParamString:parameters]
];
}
- (void)setRequestWithUrl:(NSString *)url
userAgent:(NSString *)userAgent
wsse:(SimpleHttpClientWSSE *)wsse
timeout:(NSTimeInterval)timeout
{
_request = [NSMutableURLRequest
requestWithURL:[NSURL URLWithString:url]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:timeout
];
[_request setHTTPShouldHandleCookies:YES];
if (wsse) {
NSDictionary *wsse_header = [wsse headerForHost:_request.URL.host];
if (wsse_header) {
[_request setAllHTTPHeaderFields:wsse_header];
}
}
[_request
setValue:userAgent
forHTTPHeaderField:@"User-Agent"
];
}
//----------------------------------------------------------------------------//
#pragma mark -- Initialize --
//----------------------------------------------------------------------------//
- (id)initWithMethod:(SimpleHttpClientRequestMethod)method
url:(NSString *)url
parameters:(NSDictionary *)parameters
userAgent:(NSString *)userAgent
wsse:(SimpleHttpClientWSSE *)wsse
timeout:(NSTimeInterval)timeout
{
if (![super init]) {
return nil;
}
[self setRequestWithUrl:url userAgent:userAgent wsse:wsse timeout:timeout];
if (
SimpleHttpClientRequestMethodGET == method
|| SimpleHttpClientRequestMethodDELETE == method
) {
[self
setGetOrDeleteRequestWithMethod:method
url:url
parameters:(NSDictionary *)parameters
];
} else {
[self
setPostOrPutRequestWithMethod:method
parameters:(NSDictionary *)parameters
];
}
return self;
}
- (id)initWithMethod:(SimpleHttpClientRequestMethod)method
url:(NSString *)url
headers:(NSDictionary *)headers
body:(NSString *)body
userAgent:(NSString *)userAgent
wsse:(SimpleHttpClientWSSE *)wsse
timeout:(NSTimeInterval)timeout
{
if (![super init]) {
return nil;
}
[self setRequestWithUrl:url userAgent:userAgent wsse:wsse timeout:timeout];
if (
SimpleHttpClientRequestMethodPOST != method
&& SimpleHttpClientRequestMethodPUT != method
) {
return nil;
}
[self setRequestWithMethod:method headers:headers body:body];
return self;
}
- (void)dealloc
{
_request = nil;
[super dealloc];
}
@end