Browse Source

- Updated implementation for #3028
- Added test demonstrating fix

Kevin Harwood 10 years ago
parent
commit
edb58a0058

+ 16 - 12
AFNetworking/AFURLRequestSerialization.m

@@ -80,23 +80,27 @@ static NSString * AFPercentEscapedStringFromString(NSString *string) {
     NSMutableCharacterSet * allowedCharacterSet = [[NSCharacterSet URLQueryAllowedCharacterSet] mutableCopy];
     [allowedCharacterSet removeCharactersInString:[kAFCharactersGeneralDelimitersToEncode stringByAppendingString:kAFCharactersSubDelimitersToEncode]];
 
-	// FIXME: WAIT 4 APL 2 FIX DIS SHIT
-	//return [string stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacterSet];
+	// FIXME: https://github.com/AFNetworking/AFNetworking/pull/3028
+    // return [string stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacterSet];
 
-	static NSUInteger const batchSize = 50;
+    static NSUInteger const batchSize = 50;
 
-	NSInteger index = 0;
-	NSMutableString *escaped = @"".mutableCopy;
+    NSInteger index = 0;
+    NSMutableString *escaped = @"".mutableCopy;
 
-	while (index < string.length) {
-		NSUInteger length = MIN(string.length - index, batchSize);
-		NSRange range = NSMakeRange(index, length);
+    while (index < string.length) {
+        NSUInteger length = MIN(string.length - index, batchSize);
+        NSRange range = NSMakeRange(index, length);
 
-		NSString *substring = [string substringWithRange:range];
-		[escaped appendString:[substring stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacterSet]];
+        // To avoid breaking up character sequences such as 👴🏻👮🏽
+        range = [string rangeOfComposedCharacterSequencesForRange:range];
 
-		index += length;
-	}
+        NSString *substring = [string substringWithRange:range];
+        NSString *encoded = [substring stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacterSet];
+        [escaped appendString:encoded];
+
+        index += range.length;
+    }
 
 	return escaped;
 }

+ 18 - 0
Tests/Tests/AFHTTPRequestSerializationTests.m

@@ -183,4 +183,22 @@
     XCTAssertFalse([serializer.HTTPRequestHeaders.allKeys containsObject:headerField]);
 }
 
+#pragma mark - #3028 tests
+//https://github.com/AFNetworking/AFNetworking/pull/3028
+
+- (void)testThatEmojiIsProperlyEncoded {
+    //Start with an odd number of characters so we can cross the 50 character boundry
+    NSMutableString *parameter = [NSMutableString stringWithString:@"!"];
+    while (parameter.length < 50) {
+        [parameter appendString:@"👴🏿👷🏻👮🏽"];
+    }
+
+    AFHTTPRequestSerializer *serializer = [AFHTTPRequestSerializer serializer];
+    NSURLRequest *request = [serializer requestWithMethod:@"GET"
+                                                URLString:@"http://test.com"
+                                               parameters:@{@"test":parameter}
+                                                    error:nil];
+    XCTAssertTrue([request.URL.query isEqualToString:@"test=%21%F0%9F%91%B4%F0%9F%8F%BF%F0%9F%91%B7%F0%9F%8F%BB%F0%9F%91%AE%F0%9F%8F%BD%F0%9F%91%B4%F0%9F%8F%BF%F0%9F%91%B7%F0%9F%8F%BB%F0%9F%91%AE%F0%9F%8F%BD%F0%9F%91%B4%F0%9F%8F%BF%F0%9F%91%B7%F0%9F%8F%BB%F0%9F%91%AE%F0%9F%8F%BD%F0%9F%91%B4%F0%9F%8F%BF%F0%9F%91%B7%F0%9F%8F%BB%F0%9F%91%AE%F0%9F%8F%BD%F0%9F%91%B4%F0%9F%8F%BF%F0%9F%91%B7%F0%9F%8F%BB%F0%9F%91%AE%F0%9F%8F%BD"]);
+}
+
 @end