Quellcode durchsuchen

Handle preexisting options in profile image URLs.

Peter Andrews vor 4 Jahren
Ursprung
Commit
4db22d6282
2 geänderte Dateien mit 38 neuen und 6 gelöschten Zeilen
  1. 22 5
      GoogleSignIn/Sources/GIDProfileData.m
  2. 16 1
      GoogleSignIn/Tests/Unit/GIDProfileDataTest.m

+ 22 - 5
GoogleSignIn/Sources/GIDProfileData.m

@@ -54,19 +54,36 @@ static NSString *const kOldImageURLStringKey = @"picture";
   if (!_imageURL) {
     return nil;
   }
+  NSURLComponents *url = [NSURLComponents componentsWithURL:_imageURL
+                                    resolvingAgainstBaseURL:YES];
   if ([self isFIFEAvatarURL:_imageURL]) {
-    return [NSURL URLWithString:
-        [NSString stringWithFormat:@"%@=s%lu", _imageURL, (unsigned long)dimension]];
+    // Remove any preexisting FIFE Avatar URL options
+    NSError *error;
+    NSRegularExpression *regex =
+        [NSRegularExpression regularExpressionWithPattern:@"=.*"
+                                                  options:0
+                                                    error:&error];
+    url.path = [regex stringByReplacingMatchesInString:url.path
+                                               options:0
+                                                 range:NSMakeRange(0, url.path.length)
+                                          withTemplate:@""];
+    // Append our own FIFE Avatar URL options to the path
+    url.path = [NSString stringWithFormat:@"%@=s%@", url.path, @(dimension)];
+    return url.URL;
   } else {
-    return [NSURL URLWithString:
-        [NSString stringWithFormat:@"%@?sz=%lu", _imageURL, (unsigned long)dimension]];
+    // Append our own FIFE image URL options query string, replacing any existing query string.
+    NSURLQueryItem *queryItem =
+        [NSURLQueryItem queryItemWithName:@"sz"
+                                    value:[NSString stringWithFormat:@"%@", @(dimension)]];
+    url.queryItems = @[ queryItem ];
+    return url.URL;
   }
 }
 
 - (BOOL)isFIFEAvatarURL:(NSURL *)url {
   static NSString *const AvatarURLPattern =
       @"lh[3-6](-tt|-d[a-g,z]|-testonly)?\\.(google|googleusercontent)\\.[a-z]+\\/(a|a-)\\/";
-  NSError *error = NULL;
+  NSError *error;
   NSRegularExpression *regex =
       [NSRegularExpression regularExpressionWithPattern:AvatarURLPattern
                                                 options:0

+ 16 - 1
GoogleSignIn/Tests/Unit/GIDProfileDataTest.m

@@ -113,11 +113,19 @@ static NSString *const kFIFEAvatarURL2WithDimension =
 }
 
 - (void)testImageURLWithDimension {
+  GIDProfileData *profileData;
   // Test FIFE Image URLs
-  GIDProfileData *profileData = [self profileDataWithImageURL:kFIFEImageURL];
+  profileData = [self profileDataWithImageURL:kFIFEImageURL];
   XCTAssertEqualObjects([profileData imageURLWithDimension:kDimension].absoluteString,
                         kFIFEImageURLWithDimension);
   profileData = [self profileDataWithImageURL:kFIFEImageURL2];
+  XCTAssertEqualObjects([profileData imageURLWithDimension:kDimension].absoluteString,
+                        kFIFEImageURL2WithDimension);
+  // with preexisting options
+  profileData = [self profileDataWithImageURL:kFIFEImageURLWithDimension];
+  XCTAssertEqualObjects([profileData imageURLWithDimension:kDimension].absoluteString,
+                        kFIFEImageURLWithDimension);
+  profileData = [self profileDataWithImageURL:kFIFEImageURL2WithDimension];
   XCTAssertEqualObjects([profileData imageURLWithDimension:kDimension].absoluteString,
                         kFIFEImageURL2WithDimension);
 
@@ -128,6 +136,13 @@ static NSString *const kFIFEAvatarURL2WithDimension =
   profileData = [self profileDataWithImageURL:kFIFEAvatarURL2];
   XCTAssertEqualObjects([profileData imageURLWithDimension:kDimension].absoluteString,
                         kFIFEAvatarURL2WithDimension);
+  // with preexisting options
+  profileData = [self profileDataWithImageURL:kFIFEAvatarURLWithDimension];
+  XCTAssertEqualObjects([profileData imageURLWithDimension:kDimension].absoluteString,
+                        kFIFEAvatarURLWithDimension);
+  profileData = [self profileDataWithImageURL:kFIFEAvatarURL2WithDimension];
+  XCTAssertEqualObjects([profileData imageURLWithDimension:kDimension].absoluteString,
+                        kFIFEAvatarURL2WithDimension);
 }
 
 #pragma mark - Helpers