blob: fd04c499515a17d5147c483a827039ea63eb6e9c [file] [log] [blame]
//
// 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