Skip to content

Instantly share code, notes, and snippets.

@acefsm
Created May 16, 2017 19:09
Show Gist options
  • Save acefsm/331b8a2f3db6b2441d85ed85414230d4 to your computer and use it in GitHub Desktop.
Save acefsm/331b8a2f3db6b2441d85ed85414230d4 to your computer and use it in GitHub Desktop.
URLByModifyingParameters
#import <Foundation/Foundation.h>
NSString *decodeStringFromURLFormat(NSString *string)
{
NSString *result = [string stringByReplacingOccurrencesOfString:@"+" withString:@" "];
result = [result stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
return result;
}
NSString *encodeStringToURLFormat(NSString *string)
{
NSString *result = [string stringByReplacingOccurrencesOfString:@" " withString:@"+"];
result = [result stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
return result;
}
NSDictionary *dictionaryFromQuery(NSString *query)
{
NSMutableDictionary *queryDict = nil;
NSArray *urlComponents = [query componentsSeparatedByString:@"&"];
for (NSString *keyValuePair in urlComponents)
{
NSRange equalsSignRange = [keyValuePair rangeOfString:@"="];
if (equalsSignRange.location != NSNotFound)
{
NSString *key = [keyValuePair substringToIndex:equalsSignRange.location];
NSString *value = decodeStringFromURLFormat([keyValuePair substringFromIndex:equalsSignRange.location + equalsSignRange.length]);
NSMutableArray *valuesArray = [queryDict objectForKey:key];
if(!valuesArray)
{
valuesArray = [NSMutableArray new];
if (!queryDict)
{
queryDict = [NSMutableDictionary new];
}
queryDict[key] = valuesArray;
}
[valuesArray addObject:value];
}
}
return [queryDict copy];
}
NSString *stringFromQueryDictionary(NSDictionary *dict)
{
NSMutableString *string = [NSMutableString new];
for (NSString *key in dict.allKeys)
{
id value = dict[key];
if ([value isKindOfClass:[NSArray class]])
{
for (NSString *itVal in value)
{
NSString *valString = encodeStringToURLFormat(itVal);
if (!string.length)
[string appendFormat:@"%@=%@", key, valString];
else
[string appendFormat:@"&%@=%@", key, valString];
}
}
else
{
NSString *valString = encodeStringToURLFormat(value);
if (!string.length)
[string appendFormat:@"%@=%@", key, valString];
else
[string appendFormat:@"&%@=%@", key, valString];
}
}
return [string copy];
}
NSURL *URLByModifyingParameters(NSURL *url, void (^block)(NSMutableDictionary *parameters))
{
NSString *query = url.query;
if (!block || !query)
{
return url;
}
NSURL *changedUrl = url;
NSMutableDictionary *queryDict = [[NSMutableDictionary alloc] initWithDictionary:dictionaryFromQuery(query)];
if (queryDict.allKeys.count > 0)
{
block(queryDict);
NSString *changedQuery = stringFromQueryDictionary(queryDict);
NSString *urlWithoutQuery = [url.absoluteString substringToIndex:url.absoluteString.length - query.length];
changedUrl = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", urlWithoutQuery, changedQuery]];
}
return changedUrl;
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSURL *url = [NSURL URLWithString:@"https://market.yandex.ru/catalog/54954/list?hid=237420&glfilter=7893318%3A152709%2C152970%2C152858&local-offers-first=0&deliveryincluded=0&onstock=1"];
NSURL *urlModified = URLByModifyingParameters(url, ^(NSMutableDictionary *parameters) {
for (NSString *key in parameters.allKeys)
{
parameters[key] = @"1234";
}
});
NSLog(@"%@\n%@", url, urlModified);
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment