From 4aed59698828eb7c646c59da6a94592624836b81 Mon Sep 17 00:00:00 2001 From: Ivan Vasic Date: Thu, 29 Sep 2011 12:20:25 +0200 Subject: [PATCH] Added override to add already URL encoded key/value params --- .../RESTframework/RFClasses/RFRequest.h | 6 ++++ .../RESTframework/RFClasses/RFRequest.m | 20 +++++++++---- .../RESTframeworkTests/RESTframeworkTests.m | 29 +++++++++++++++++++ 3 files changed, 50 insertions(+), 5 deletions(-) diff --git a/RESTframework/RESTframework/RFClasses/RFRequest.h b/RESTframework/RESTframework/RFClasses/RFRequest.h index 87fa313..165e4b0 100644 --- a/RESTframework/RESTframework/RFClasses/RFRequest.h +++ b/RESTframework/RESTframework/RFClasses/RFRequest.h @@ -112,6 +112,12 @@ typedef enum { */ -(void) addParam:(NSString*)value forKey:(NSString*)key; +/*! + * @method addParam:forKey:alreadyEncoded: + * @abstract Adds string param to request. If both value AND key are URL encoded pass YES for alreadyEncoded. + */ +-(void) addParam:(NSString*)value forKey:(NSString*)key alreadyEncoded:(BOOL)encoded; + /*! * @method addData:withContentType:forKey: * @abstract Adds data (e.g. file) with specified MIME type for specified key diff --git a/RESTframework/RESTframework/RFClasses/RFRequest.m b/RESTframework/RESTframework/RFClasses/RFRequest.m index 20f5a8a..41a05ce 100644 --- a/RESTframework/RESTframework/RFClasses/RFRequest.m +++ b/RESTframework/RESTframework/RFClasses/RFRequest.m @@ -24,6 +24,7 @@ #define kRFRequestParamKey @"kRFRequestParamKey" #define kRFRequestParamValue @"kRFRequestParamValue" +#define kRFRequestParamEncoded @"kRFRequestParamEncoded" #define kRFRequestParamMIME @"kRFRequestParamMIME" @@ -131,12 +132,17 @@ -(BOOL) hasParams { #pragma mark - Methods --(void) addParam:(NSString*)value forKey:(NSString*)key { +-(void) addParam:(NSString*)value forKey:(NSString*)key +{ + [self addParam:value forKey:key alreadyEncoded:NO]; +} + +-(void) addParam:(NSString*)value forKey:(NSString*)key alreadyEncoded:(BOOL)encoded { if (!self.params) { params = [[NSMutableArray array] retain]; } - NSDictionary* pd = [NSDictionary dictionaryWithObjectsAndKeys:key, kRFRequestParamKey, value, kRFRequestParamValue, nil]; + NSDictionary* pd = [NSDictionary dictionaryWithObjectsAndKeys:key, kRFRequestParamKey, value, kRFRequestParamValue, [NSNumber numberWithBool:encoded], kRFRequestParamEncoded, nil]; //add param [self.params addObject:pd]; @@ -169,13 +175,17 @@ -(NSURL*) URL continue; } + BOOL isEncoded = [[p objectForKey:kRFRequestParamEncoded] boolValue]; + NSString* pKey = isEncoded ? [p objectForKey:kRFRequestParamKey] : [[p objectForKey:kRFRequestParamKey] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + NSString* pValue = isEncoded ? [p objectForKey:kRFRequestParamValue] : [[p objectForKey:kRFRequestParamValue] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + if(first) { - str = [str stringByAppendingFormat:@"%@=%@", [[p objectForKey:kRFRequestParamKey] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], [[p objectForKey:kRFRequestParamValue] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; first = NO; - continue; + } else { + str = [str stringByAppendingString:@"&"]; } - str = [str stringByAppendingFormat:@"&%@=%@", [[p objectForKey:kRFRequestParamKey] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], [[p objectForKey:kRFRequestParamValue] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; + str = [str stringByAppendingFormat:@"%@=%@", pKey, pValue]; } urlString = [urlString stringByAppendingString:str]; diff --git a/RESTframework/RESTframeworkTests/RESTframeworkTests.m b/RESTframework/RESTframeworkTests/RESTframeworkTests.m index 4d95629..281cde3 100644 --- a/RESTframework/RESTframeworkTests/RESTframeworkTests.m +++ b/RESTframework/RESTframeworkTests/RESTframeworkTests.m @@ -223,6 +223,35 @@ - (void)testPostRequestBodyType STAssertEqualObjects(httpData, xmlDataString, @"Data don't match"); +} + + +-(void) testGETWithDateChars +{ + RFRequest* r = [[[RFRequest alloc] init] autorelease]; + r.serviceEndpoint = [NSURL URLWithString:@"http://dummy.url/path1/"]; + r.resourcePath = [NSArray arrayWithObjects:@"sub1", nil]; + + NSDate* d = [NSDate date]; + NSDateFormatter* df = [[[NSDateFormatter alloc] init] autorelease]; + df.dateStyle = NSDateFormatterShortStyle; + + NSString* date = [[df stringFromDate:d] stringByAppendingString:@" 15:22h"]; + NSLog(@"%@", date); + NSLog(@"%@", [date stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]); + [r addParam:date forKey:@"date1 1"]; + STAssertEqualObjects([[[r urlRequest] URL] absoluteString], @"http://dummy.url/path1/sub1?date1%201=9/29/11%2015:22h", @"Param not encoded properly?"); + NSLog(@"%@", [[r urlRequest] URL]); + + //now the same but encoded + r = [[[RFRequest alloc] init] autorelease]; + r.serviceEndpoint = [NSURL URLWithString:@"http://dummy.url/path1/"]; + r.resourcePath = [NSArray arrayWithObjects:@"sub1", nil]; + date = [[df stringFromDate:d] stringByAppendingString:@"%2015:22h"]; + [r addParam:date forKey:@"date1%201" alreadyEncoded:YES]; + STAssertEqualObjects([[[r urlRequest] URL] absoluteString], @"http://dummy.url/path1/sub1?date1%201=9/29/11%2015:22h", @"Param not encoded properly?"); + + } @end