diff options
author | gtm.daemon <gtm.daemon@7dc7ac4e-7543-0410-b95c-c1676fc8e2a3> | 2009-05-28 06:15:15 +0000 |
---|---|---|
committer | gtm.daemon <gtm.daemon@7dc7ac4e-7543-0410-b95c-c1676fc8e2a3> | 2009-05-28 06:15:15 +0000 |
commit | 24abe2a706c0d876a676500a3bb0a777d6e36a8c (patch) | |
tree | 43fe5a8832d2675a77b9826706c2077c65cd7b47 /Foundation/GTMGoogleSearch.m | |
parent | 6251788ff71bfd9da23b4e504da423f10b858d83 (diff) |
[Author: dmaclach]
Change GTMGoogleSearch to not do escaping of URL arguments, because as it turns
out the client often wants to handle that themselves. Also, made it so that
you didn't have to have a query argument, and that you could override
other arguments by setting them to [NSNull null]. These changes make the API
far more flexible.
DELTA=48 (12 added, 23 deleted, 13 changed)
R=thomasvl
Diffstat (limited to 'Foundation/GTMGoogleSearch.m')
-rw-r--r-- | Foundation/GTMGoogleSearch.m | 64 |
1 files changed, 32 insertions, 32 deletions
diff --git a/Foundation/GTMGoogleSearch.m b/Foundation/GTMGoogleSearch.m index 6bb5d58..586efd3 100644 --- a/Foundation/GTMGoogleSearch.m +++ b/Foundation/GTMGoogleSearch.m @@ -18,8 +18,6 @@ #import "GTMGoogleSearch.h" #import "GTMObjectSingleton.h" -#import "GTMNSString+URLArguments.h" -#import "GTMMethodCheck.h" #import "GTMGarbageCollection.h" #if GTM_IPHONE_SDK @@ -37,9 +35,6 @@ typedef struct { // this is a seed mapping from languages to domains for google search. // this doesn't have to be complete, as it is just a seed. // -// initial values for the table were taken from the GDWin code. -// (/googleclient/totalrecall/common/url_tools.cpp, but moved to -// /google3/java/com/google/totalrecall/production/config/gpac.xml) // static LanguageDefaultInfo kLanguageListDefaultMappingTable[] = { // order is important, first match is taken @@ -126,14 +121,11 @@ static NSString *const kSearchURLTemplate = @"http://www.google.%@/%@?%@"; language:(NSString**)preferredLanguage; - (void)reloadAllAppCachedValues:(NSNotification*)notification; - (void)updateAllAppsDomain:(NSString*)domain language:(NSString*)language; -- (NSDictionary *)normalizeGoogleArguments:(NSDictionary *)args; @end @implementation GTMGoogleSearch -GTM_METHOD_CHECK(NSString, gtm_stringByEscapingForURLArgument); - GTMOBJECT_SINGLETON_BOILERPLATE(GTMGoogleSearch, sharedInstance); - (id)init { @@ -178,7 +170,7 @@ GTMOBJECT_SINGLETON_BOILERPLATE(GTMGoogleSearch, sharedInstance); NSDictionary *appArgs = [bundle objectForInfoDictionaryKey:GTMGoogleSearchClientAppArgsKey]; - globalSearchArguments_ = [[self normalizeGoogleArguments:appArgs] retain]; + globalSearchArguments_ = [appArgs retain]; } return self; } @@ -309,19 +301,17 @@ GTMOBJECT_SINGLETON_BOILERPLATE(GTMGoogleSearch, sharedInstance); } - (void)setGlobalSearchArguments:(NSDictionary *)args { - args = [self normalizeGoogleArguments:args]; [globalSearchArguments_ autorelease]; - globalSearchArguments_ = [args retain]; + globalSearchArguments_ = [args copy]; } - (NSString*)searchURLFor:(NSString*)queryText ofType:(NSString*)type arguments:(NSDictionary *)localArgs { - NSString *url = nil; - if (!queryText) { + if (!type) { return nil; } - + NSString *language; NSString *domain; [self preferredDomain:&domain @@ -333,28 +323,50 @@ GTMOBJECT_SINGLETON_BOILERPLATE(GTMGoogleSearch, sharedInstance); @"UTF-8", @"ie", @"UTF-8", @"oe", language, @"hl", - [queryText gtm_stringByEscapingForURLArgument], @"q", nil]; + if (queryText) { + [args setObject:queryText forKey:@"q"]; + } NSDictionary *globalSearchArgs = [self globalSearchArguments]; if (globalSearchArgs) { [args addEntriesFromDictionary:globalSearchArgs]; } if (localArgs) { - localArgs = [self normalizeGoogleArguments:localArgs]; [args addEntriesFromDictionary:localArgs]; } NSMutableArray *clientArgs = [NSMutableArray array]; NSString *key; + NSNull *nsNull = [NSNull null]; GTM_FOREACH_KEY(key, args) { NSString *object = [args objectForKey:key]; - NSString *arg = [NSString stringWithFormat:@"%@=%@", key, object]; - [clientArgs addObject:arg]; + if (![object isEqualTo:nsNull]) { +#if DEBUG + // In debug we check key and object for things that should be escaped. + // Note that percent is not in there because escaped strings will have + // percents in them + NSCharacterSet *cs = [NSCharacterSet characterSetWithCharactersInString: + @"!*'();:@&=+$,/?#[] "]; + NSRange range = [key rangeOfCharacterFromSet:cs]; + if (range.location != NSNotFound) { + _GTMDevLog(@"Unescaped string %@ in argument pair {%@, %@} in -[%@ %@]", + key, key, object, [self class], NSStringFromSelector(_cmd)); + } + range = [object rangeOfCharacterFromSet:cs]; + if (range.location != NSNotFound) { + _GTMDevLog(@"Unescaped string %@ in argument pair {%@,%@ } in -[%@ %@]", + object, key, object, [self class], + NSStringFromSelector(_cmd)); + } +#endif // DEBUG + NSString *arg = [NSString stringWithFormat:@"%@=%@", key, object]; + [clientArgs addObject:arg]; + } } NSString *clientArg = [clientArgs componentsJoinedByString:@"&"]; - url = [NSString stringWithFormat:kSearchURLTemplate, - domain, type, clientArg]; + NSString *url = [NSString stringWithFormat:kSearchURLTemplate, + domain, type, clientArg]; return url; } @@ -512,16 +524,4 @@ GTMOBJECT_SINGLETON_BOILERPLATE(GTMGoogleSearch, sharedInstance); userInfo:nil]; } -- (NSDictionary *)normalizeGoogleArguments:(NSDictionary *)args { - NSMutableDictionary *outArgs = [NSMutableDictionary dictionary]; - NSString *key; - GTM_FOREACH_KEY(key, args) { - NSString *object = [args objectForKey:key]; - key = [[key gtm_stringByEscapingForURLArgument] lowercaseString]; - object = [object gtm_stringByEscapingForURLArgument]; - [outArgs setObject:object forKey:key]; - } - return outArgs; -} - @end |