Created
May 16, 2017 19:09
-
-
Save acefsm/331b8a2f3db6b2441d85ed85414230d4 to your computer and use it in GitHub Desktop.
URLByModifyingParameters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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