From f8d3550aafc414ec199062d55cfaaca0d5660b2e Mon Sep 17 00:00:00 2001 From: Mattt Thompson Date: Wed, 24 Aug 2011 15:21:17 -0500 Subject: [PATCH] Experimental implementation of HTTP Basic auth helper in AFRestClient --- AFNetworking/AFRestClient.h | 1 + AFNetworking/AFRestClient.m | 8 ++++++++ AFNetworking/NSData+AFNetworking.h | 1 + AFNetworking/NSData+AFNetworking.m | 29 +++++++++++++++++++++++++++++ 4 files changed, 39 insertions(+) diff --git a/AFNetworking/AFRestClient.h b/AFNetworking/AFRestClient.h index 57c54b5..7470810 100644 --- a/AFNetworking/AFRestClient.h +++ b/AFNetworking/AFRestClient.h @@ -38,6 +38,7 @@ - (NSString *)defaultValueForHeader:(NSString *)header; - (void)setDefaultHeader:(NSString *)header value:(NSString *)value; +- (void)setAuthorizationHeaderWithUsername:(NSString *)username password:(NSString *)password; - (void)setAuthorizationHeaderWithToken:(NSString *)token; - (void)clearAuthorizationHeader; diff --git a/AFNetworking/AFRestClient.m b/AFNetworking/AFRestClient.m index 2062c55..d699e59 100644 --- a/AFNetworking/AFRestClient.m +++ b/AFNetworking/AFRestClient.m @@ -23,6 +23,8 @@ #import "AFRestClient.h" #import "AFJSONRequestOperation.h" +#import "NSData+AFNetworking.h" + static NSStringEncoding const kAFRestClientStringEncoding = NSUTF8StringEncoding; @interface AFRestClient () @@ -86,6 +88,12 @@ static NSStringEncoding const kAFRestClientStringEncoding = NSUTF8StringEncoding [self.defaultHeaders setObject:value forKey:header]; } +- (void)setAuthorizationHeaderWithUsername:(NSString *)username password:(NSString *)password { + NSString *authHeader = [NSString stringWithFormat:@"%@:%@", username, password]; + NSString *encodedAuthHeader = [[NSData dataWithBytes:[authHeader UTF8String] length:[authHeader length]] base64EncodedString]; + [self setDefaultHeader:@"Authorization" value:[NSString stringWithFormat:@"Basic %@", encodedAuthHeader]]; +} + - (void)setAuthorizationHeaderWithToken:(NSString *)token { [self setDefaultHeader:@"Authorization" value:[NSString stringWithFormat:@"Token token=\"%@\"", token]]; } diff --git a/AFNetworking/NSData+AFNetworking.h b/AFNetworking/NSData+AFNetworking.h index 02851e9..4fe6c36 100644 --- a/AFNetworking/NSData+AFNetworking.h +++ b/AFNetworking/NSData+AFNetworking.h @@ -26,6 +26,7 @@ extern NSString * const kAFZlibErrorDomain; @interface NSData (AFNetworking) +- (NSString *)base64EncodedString; - (NSData *)dataByGZipCompressingWithError:(NSError **)error; - (NSData *)dataByGZipDecompressingDataWithError:(NSError **)error; diff --git a/AFNetworking/NSData+AFNetworking.m b/AFNetworking/NSData+AFNetworking.m index c90c6b1..9d2fad2 100644 --- a/AFNetworking/NSData+AFNetworking.m +++ b/AFNetworking/NSData+AFNetworking.m @@ -25,6 +25,8 @@ NSString * const kAFZlibErrorDomain = @"com.alamofire.zlib.error"; +static char Base64EncodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + static inline NSUInteger NSDataEstimatedCompressedLength(NSData *data) { return [data length] / 2; } @@ -88,6 +90,33 @@ typedef enum { @implementation NSData (AFNetworking) +- (NSString *)base64EncodedString { + NSUInteger length = [self length]; + NSMutableData *mutableData = [NSMutableData dataWithLength:((length + 2) / 3) * 4]; + + uint8_t *input = (uint8_t *)[self bytes]; + uint8_t *output = (uint8_t *)[mutableData mutableBytes]; + + for (NSUInteger i = 0; i < length; i += 3) { + NSUInteger value = 0; + for (NSUInteger j = i; j < (i + 3); j++) { + value <<= 8; + + if (j < length) { + value |= (0xFF & input[j]); + } + } + + NSInteger idx = (i / 3) * 4; + output[idx + 0] = Base64EncodingTable[(value >> 18) & 0x3F]; + output[idx + 1] = Base64EncodingTable[(value >> 12) & 0x3F]; + output[idx + 2] = (i + 1) < length ? Base64EncodingTable[(value >> 6) & 0x3F] : '='; + output[idx + 3] = (i + 2) < length ? Base64EncodingTable[(value >> 0) & 0x3F] : '='; + } + + return [[[NSString alloc] initWithData:mutableData encoding:NSASCIIStringEncoding] autorelease]; +} + - (NSData *)dataByGZipCompressingWithError:(NSError **)error { return [NSData dataByTransformingData:self usingGZipOperation:GzipDeflate error:error]; }