mirror of
https://github.com/samsonjs/5by5Browser.git
synced 2026-03-25 09:05:50 +00:00
147 lines
4.1 KiB
Objective-C
147 lines
4.1 KiB
Objective-C
//
|
|
// MMHTTPRequest.m
|
|
// Marshmallows
|
|
//
|
|
// Created by Sami Samhuri on 11-09-03.
|
|
// Copyright 2011 Guru Logic. 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];
|
|
}
|
|
|
|
- (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;
|
|
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;
|
|
}
|
|
}
|
|
|
|
self.callback(self.statusCode, data);
|
|
}
|
|
|
|
@end
|