| // |
| // GTMURLBuilder.m |
| // |
| // Copyright 2012 Google Inc. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| // use this file except in compliance with the License. You may obtain a copy |
| // of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| // License for the specific language governing permissions and limitations |
| // under the License. |
| // |
| |
| #import "GTMURLBuilder.h" |
| |
| #import "GTMDefines.h" |
| #import "GTMLogger.h" |
| #import "GTMNSDictionary+URLArguments.h" |
| #import "GTMNSString+URLArguments.h" |
| |
| #pragma clang diagnostic push |
| // Ignore all of the deprecation warnings for GTMURLBuilder |
| #pragma clang diagnostic ignored "-Wdeprecated-implementations" |
| |
| @implementation GTMURLBuilder |
| |
| @synthesize baseURLString = baseURLString_; |
| |
| + (GTMURLBuilder *)builderWithString:(NSString *)URLString { |
| GTMURLBuilder *URLBuilder = |
| [[[GTMURLBuilder alloc] initWithString:URLString] autorelease]; |
| return URLBuilder; |
| } |
| |
| + (GTMURLBuilder *)builderWithURL:(NSURL *)URL { |
| return [self builderWithString:[URL absoluteString]]; |
| } |
| |
| - (id)init { |
| self = [super init]; |
| [self release]; |
| _GTMDevAssert(NO, @"Invalid initialization."); |
| return nil; |
| } |
| |
| - (id)initWithString:(NSString *)URLString { |
| self = [super init]; |
| if (self) { |
| _GTMDevAssert(URLString, @"URL must not be nil"); |
| NSURL *URL = [NSURL URLWithString:URLString]; |
| _GTMDevAssert(URL, @"URL is invalid"); |
| |
| // NSURL does not work with ports. |
| baseURLString_ = [URL absoluteString]; |
| if ([URL query]) { |
| NSRange pathRange = |
| [baseURLString_ rangeOfString:[URL query] options:NSBackwardsSearch]; |
| if (pathRange.location != NSNotFound) { |
| baseURLString_ = [baseURLString_ substringToIndex:pathRange.location-1]; |
| } |
| } |
| [baseURLString_ retain]; |
| params_ = [[NSDictionary gtm_dictionaryWithHttpArgumentsString:[URL query]] |
| mutableCopy]; |
| } |
| return self; |
| } |
| |
| - (void)dealloc { |
| [baseURLString_ release]; |
| [params_ release]; |
| [super dealloc]; |
| } |
| |
| - (void)setValue:(NSString *)value forParameter:(NSString *)parameter { |
| [params_ setObject:value forKey:parameter]; |
| } |
| |
| - (void)setIntegerValue:(NSInteger)value forParameter:(NSString *)parameter { |
| [params_ setObject:[NSString stringWithFormat:@"%ld", (long)value] forKey:parameter]; |
| } |
| |
| - (NSString *)valueForParameter:(NSString *)parameter { |
| return [params_ objectForKey:parameter]; |
| } |
| |
| - (NSInteger)integerValueForParameter:(NSString *)parameter { |
| return [[params_ objectForKey:parameter] integerValue]; |
| } |
| |
| - (void)removeParameter:(NSString *)parameter { |
| [params_ removeObjectForKey:parameter]; |
| } |
| |
| - (void)setParameters:(NSDictionary *)parameters { |
| [params_ autorelease]; |
| params_ = [[NSDictionary dictionaryWithDictionary:parameters] mutableCopy]; |
| } |
| |
| - (NSDictionary *)parameters { |
| return params_; |
| } |
| |
| - (NSURL *)URL { |
| if (![params_ count]) { |
| return [NSURL URLWithString:baseURLString_]; |
| } else { |
| return [NSURL URLWithString:[NSString stringWithFormat:@"%@?%@", |
| baseURLString_, [params_ gtm_httpArgumentsString]]]; |
| } |
| } |
| |
| - (NSString *)URLString { |
| return [[self URL] absoluteString]; |
| } |
| |
| - (BOOL)isEqual:(GTMURLBuilder *)URLBuilder { |
| if (!URLBuilder) { |
| return NO; |
| } |
| |
| if (!([[self baseURLString] isEqualToString:[URLBuilder baseURLString]])) { |
| return NO; |
| } |
| |
| if (![[self parameters] isEqualToDictionary:[URLBuilder parameters]]) { |
| return NO; |
| } |
| |
| return YES; |
| } |
| |
| - (NSUInteger)hash { |
| return [baseURLString_ hash] * 17 + [params_ hash] * 37; |
| } |
| |
| @end |
| |
| #pragma clang diagnostic push |