Permalink
Switch branches/tags
Nothing to show
Find file
Fetching contributors…
Cannot retrieve contributors at this time
156 lines (132 sloc) 4.24 KB
//
// MMHTTPRequest.m
// Marshmallows
//
// Created by Sami Samhuri on 11-09-03.
// Copyright 2011 Sami Samhuri. All rights reserved.
//
#import "MMHTTPRequest.h"
@interface MMHTTPRequest ()
- (void) _start;
@end
@implementation MMHTTPRequest
@synthesize connection = _connection;
@synthesize request = _request;
@synthesize method = _method;
@synthesize url = _url;
@synthesize headers = _headers;
@synthesize data = _data;
@synthesize type = _type;
@synthesize callback = _callback;
@synthesize timeout = _timeout;
@synthesize statusCode = _statusCode;
@synthesize responseHeaders = _responseHeaders;
+ (id) requestWithOptions: (NSDictionary *)options callback: (MMHTTPCallback)callback
{
return [[self alloc] initWithOptions: options callback: callback];
}
- (id) initWithOptions: (NSDictionary *)options callback: (MMHTTPCallback)callback
{
self = [super init];
if (self) {
self.callback = [callback copy];
self.timeout = MMHTTPRequestDefaultTimeout;
self.method = [options objectForKey: @"method"];
self.url = [options objectForKey: @"url"];
self.headers = [options objectForKey: @"headers"];
self.data = [options objectForKey: @"data"];
self.type = [options objectForKey: @"type"];
if (!self.method) self.method = @"GET";
[self _start];
}
return self;
}
- (void) cancel
{
[_connection cancel];
if (self.callback) {
Block_release(self.callback);
self.callback = nil;
}
}
- (NSData *) responseData
{
return [NSData dataWithData: _responseData];
}
- (NSString *) responseText
{
return [[NSString alloc] initWithBytes: _responseData.bytes
length: _responseData.length
encoding: NSUTF8StringEncoding];
}
- (UIImage *) responseImage
{
return [UIImage imageWithData: _responseData];
}
- (void) _start
{
self.request = [NSMutableURLRequest requestWithURL: [NSURL URLWithString: self.url]
cachePolicy: NSURLRequestUseProtocolCachePolicy
timeoutInterval: self.timeout];
[self.request setHTTPMethod: self.method];
if (self.data && ([self.method isEqualToString: @"POST"] || [self.method isEqualToString: @"PUT"])) {
[self.request setHTTPBody: self.data];
}
if (self.headers) {
for (NSString *key in self.headers) {
[self.request setValue: [self.headers objectForKey: key] forHTTPHeaderField: key];
}
}
self.connection = [NSURLConnection connectionWithRequest: self.request delegate: self];
[self.connection start];
}
#pragma mark - NSURLConnection delegate methods
- (void) connection: (NSURLConnection *)connection didReceiveResponse: (NSURLResponse *)response
{
// NSLog(@"didReceiveResponse: %@",response);
if ([response respondsToSelector: @selector(statusCode)])
{
_statusCode = [(NSHTTPURLResponse *)response statusCode];
_responseHeaders = [(NSHTTPURLResponse *)response allHeaderFields];
}
else {
NSLog(@"Not an HTTP response? connection: %@ response: %@", connection, response);
_statusCode = 500;
_responseHeaders = [[NSDictionary alloc] init];
}
_responseData = [[NSMutableData alloc] init];
}
- (void) connection: (NSURLConnection *)connection didReceiveData: (NSData *)data
{
// NSLog(@"didReceiveData: %@", data);
[_responseData appendData: data];
}
- (void) connection: (NSURLConnection *)connection didFailWithError: (NSError *)error
{
NSLog(@"didFailWithError: %@", error);
_responseData = nil;
_statusCode = MMHTTPRequestStatusError;
if (self.callback) {
self.callback(self.statusCode, error);
}
}
- (void) connectionDidFinishLoading: (NSURLConnection *)connection
{
// NSLog(@"didFinishLoading: %d", self.statusCode);
id data = nil;
if (self.statusCode == 200) {
if ([self.type isEqualToString: @"text"]) {
data = self.responseText;
}
else if ([self.type isEqualToString: @"image"]) {
data = self.responseImage;
}
else {
data = self.responseData;
}
}
if (self.callback) {
self.callback(self.statusCode, data);
}
}
@end