BTURLUtils.m 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #if __has_include(<Braintree/BraintreeCore.h>)
  2. #import <Braintree/BTURLUtils.h>
  3. #else
  4. #import <BraintreeCore/BTURLUtils.h>
  5. #endif
  6. @implementation BTURLUtils
  7. + (NSString *)queryStringWithDictionary:(NSDictionary *)dict {
  8. NSMutableString *queryString = [NSMutableString string];
  9. for (id key in dict) {
  10. NSString *encodedKey = [self stringByURLEncodingAllCharactersInString:[key description]];
  11. id value = [dict objectForKey:key];
  12. if([value isKindOfClass:[NSArray class]]) {
  13. for(id obj in value) {
  14. [queryString appendFormat:@"%@%%5B%%5D=%@&",
  15. encodedKey,
  16. [self stringByURLEncodingAllCharactersInString:[obj description]]
  17. ];
  18. }
  19. } else if([value isKindOfClass:[NSDictionary class]]) {
  20. for(id subkey in value) {
  21. [queryString appendFormat:@"%@%%5B%@%%5D=%@&",
  22. encodedKey,
  23. [self stringByURLEncodingAllCharactersInString:[subkey description]],
  24. [self stringByURLEncodingAllCharactersInString:[[value objectForKey:subkey] description]]
  25. ];
  26. }
  27. } else if([value isKindOfClass:[NSNull class]]) {
  28. [queryString appendFormat:@"%@=&", encodedKey];
  29. } else {
  30. [queryString appendFormat:@"%@=%@&",
  31. encodedKey,
  32. [self stringByURLEncodingAllCharactersInString:[value description]]
  33. ];
  34. }
  35. }
  36. if([queryString length] > 0) {
  37. [queryString deleteCharactersInRange:NSMakeRange([queryString length] - 1, 1)]; // remove trailing &
  38. }
  39. return queryString;
  40. }
  41. + (NSDictionary<NSString *, NSString *> *)queryParametersForURL:(NSURL *)url {
  42. NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:YES];
  43. NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
  44. for (NSURLQueryItem *queryItem in components.queryItems) {
  45. parameters[queryItem.name] = [queryItem.value stringByReplacingOccurrencesOfString:@"+" withString:@" "];
  46. }
  47. return [NSDictionary dictionaryWithDictionary:parameters];
  48. }
  49. + (NSString *)stringByURLEncodingAllCharactersInString:(NSString *)aString {
  50. // See Section 2.2. http://www.ietf.org/rfc/rfc2396.txt
  51. NSString *reservedCharacters = @";/?:@&=+$,";
  52. NSMutableCharacterSet *URLQueryPartAllowedCharacterSet = [[NSCharacterSet URLQueryAllowedCharacterSet] mutableCopy];
  53. [URLQueryPartAllowedCharacterSet removeCharactersInString:reservedCharacters];
  54. return [aString stringByAddingPercentEncodingWithAllowedCharacters:URLQueryPartAllowedCharacterSet];
  55. }
  56. @end