-
Notifications
You must be signed in to change notification settings - Fork 1
/
CCHTTPRequest.m
149 lines (111 loc) · 4.9 KB
/
CCHTTPRequest.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
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
//
// UVAPIRequest.m
// PostForm
//
// Created by karloz on 4/13/11.
// Copyright 2011 cod3monkey. All rights reserved.
//
#import "CCHTTPRequest.h"
@implementation CCHTTPRequest
@synthesize delegate;
- (id)init {
self = [super init];
if (self) {
responseDataDict = CFDictionaryCreateMutable(
kCFAllocatorDefault,
0,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
}
return self;
}
- (void)dealloc {
delegate = nil;
[originalURL release], originalURL = nil;
CFRelease(responseDataDict);
[super dealloc];
}
#pragma mark - Public Methods
- (void)performGetRequestWithURL:(NSURL *)url parameters:(id)parameters {
// i'm gonna save a copy of the original requested url to pass it back in the delegate, for identification purposes
originalURL = [url copy];
NSURL *urlWithParameters = nil;
// build params
if ([parameters isKindOfClass:[NSString class]]) {
urlWithParameters = [NSURL URLWithString:[NSString stringWithFormat:@"%@?%@",
[url absoluteString],
parameters]];
}
if ([parameters isKindOfClass:[NSDictionary class]]) {
NSMutableArray *urlParameters = [NSMutableArray array];
for (NSString *key in parameters) {
[urlParameters addObject:[NSString stringWithFormat:@"%@=%@", key, [parameters valueForKey:key]]];
}
urlWithParameters = [NSURL URLWithString:[NSString stringWithFormat:@"%@?%@",
[url absoluteString],
[urlParameters componentsJoinedByString:@"&"]]];
}
// build new URL with given params
urlRequest = [[NSMutableURLRequest alloc] initWithURL:urlWithParameters];
[urlRequest setHTTPMethod:@"GET"];
urlConnection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self];
// add to dictionary both data & request i'll be passing later on to the delegate
CFDictionaryAddValue(responseDataDict,
urlConnection,
[NSMutableDictionary dictionaryWithObjectsAndKeys:[NSMutableData data], @"receivedData", urlRequest, @"urlRequest", nil]);
[urlConnection start];
[urlConnection release], urlConnection = nil;
}
- (void)performPostRequestWithURL:(NSURL *)url parameters:(id)parameters {
// i'm gonna save a copy of the original requested url to pass it back in the delegate, for identification purposes
originalURL = [url copy];
NSString *postBody = nil;
// build post body
if ([parameters isKindOfClass:[NSString class]]) {
postBody = parameters;
}
if ([parameters isKindOfClass:[NSDictionary class]]) {
NSMutableArray *urlParameters = [NSMutableArray array];
for (NSString *key in parameters) {
[urlParameters addObject:[NSString stringWithFormat:@"%@=%@", key, [parameters valueForKey:key]]];
}
postBody = [urlParameters componentsJoinedByString:@"&"];
}
// use given url & set post body
urlRequest = [[NSMutableURLRequest alloc] initWithURL:url];
[urlRequest setHTTPMethod:@"POST"];
[urlRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[urlRequest setHTTPBody:[postBody dataUsingEncoding:NSUTF8StringEncoding]];
urlConnection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self];
// add to dictionary both data & request i'll be passing later on to the delegate
CFDictionaryAddValue(responseDataDict,
urlConnection,
[NSMutableDictionary dictionaryWithObjectsAndKeys:[NSMutableData data], @"receivedData", urlRequest, @"urlRequest", nil]);
[urlConnection start];
[urlConnection release], urlConnection = nil;
}
#pragma mark - NSURLConnection delegate methods
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
NSMutableDictionary *connectionInfo = (NSMutableDictionary *)CFDictionaryGetValue(responseDataDict, connection);
[[connectionInfo objectForKey:@"receivedData"] appendData:data];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
if ([delegate respondsToSelector:@selector(request:didFinishWithResponseString:)]) {
NSMutableDictionary *responseDictionary = (NSMutableDictionary *)CFDictionaryGetValue(responseDataDict, connection);
[delegate performSelector:@selector(request:didFinishWithResponseString:)
withObject:(NSURLRequest *)[responseDictionary valueForKey:@"urlRequest"]
withObject:[[NSString alloc] initWithData:(NSData *)[responseDictionary valueForKey:@"receivedData"] encoding:NSUTF8StringEncoding]];
}
// no further communications for this connection will take place, so remove the associated dictionary entry
CFDictionaryRemoveValue(responseDataDict, connection);
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
if ([delegate respondsToSelector:@selector(request:didFailWithError:)]) {
[delegate performSelector:@selector(request:didFailWithError:)
withObject:urlRequest
withObject:error];
}
}
@end