Bgerstle has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/223787

Change subject: brute-force fix for schemeless image URLs
......................................................................

brute-force fix for schemeless image URLs

also added unit tests for all the NSURL+Extras categories

Bug: T102258
Change-Id: Ia44c86e4d648401f7d00c258683eef62d6c7456f
---
M Wikipedia.xcodeproj/project.pbxproj
M Wikipedia/Categories/NSURL+Extras.h
M Wikipedia/Categories/NSURL+Extras.m
M Wikipedia/Images/WMFImageController.swift
A WikipediaUnitTests/NSURLExtrasTests.m
5 files changed, 105 insertions(+), 1 deletion(-)


  git pull ssh://gerrit.wikimedia.org:29418/apps/ios/wikipedia 
refs/changes/87/223787/1

diff --git a/Wikipedia.xcodeproj/project.pbxproj 
b/Wikipedia.xcodeproj/project.pbxproj
index bbd0cfb..ca4b1d7 100644
--- a/Wikipedia.xcodeproj/project.pbxproj
+++ b/Wikipedia.xcodeproj/project.pbxproj
@@ -278,6 +278,7 @@
                BC6BF4001B19213600362968 /* XCTestCase+WMFLocaleTesting.m in 
Sources */ = {isa = PBXBuildFile; fileRef = BC6BF3FE1B19209900362968 /* 
XCTestCase+WMFLocaleTesting.m */; };
                BC7DFCD61AA4E5FE000035C3 /* WMFImageURLParsing.m in Sources */ 
= {isa = PBXBuildFile; fileRef = BC7DFCD51AA4E5FE000035C3 /* 
WMFImageURLParsing.m */; };
                BC7E4A441B33812700EECD8B /* LanguagesViewController.storyboard 
in Resources */ = {isa = PBXBuildFile; fileRef = BC7E4A431B33812700EECD8B /* 
LanguagesViewController.storyboard */; };
+               BC8210CC1B4EB2390010BF7B /* NSURLExtrasTests.m in Sources */ = 
{isa = PBXBuildFile; fileRef = BC8210CB1B4EB2390010BF7B /* NSURLExtrasTests.m 
*/; };
                BC86B9361A92966B00B4C039 /* 
AFHTTPRequestOperationManager+UniqueRequests.m in Sources */ = {isa = 
PBXBuildFile; fileRef = BC86B9351A92966B00B4C039 /* 
AFHTTPRequestOperationManager+UniqueRequests.m */; };
                BC86B93D1A929CC500B4C039 /* 
UICollectionViewFlowLayout+NSCopying.m in Sources */ = {isa = PBXBuildFile; 
fileRef = BC86B93C1A929CC500B4C039 /* UICollectionViewFlowLayout+NSCopying.m 
*/; };
                BC86B9401A929D7900B4C039 /* 
UICollectionViewFlowLayout+WMFItemSizeThatFits.m in Sources */ = {isa = 
PBXBuildFile; fileRef = BC86B93F1A929D7900B4C039 /* 
UICollectionViewFlowLayout+WMFItemSizeThatFits.m */; };
@@ -884,6 +885,7 @@
                BC7DFCD51AA4E5FE000035C3 /* WMFImageURLParsing.m */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path 
= WMFImageURLParsing.m; sourceTree = "<group>"; };
                BC7E4A431B33812700EECD8B /* LanguagesViewController.storyboard 
*/ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = 
file.storyboard; path = LanguagesViewController.storyboard; sourceTree = 
"<group>"; };
                BC7E4A491B34A26A00EECD8B /* WMFLogging.h */ = {isa = 
PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WMFLogging.h; 
sourceTree = "<group>"; };
+               BC8210CB1B4EB2390010BF7B /* NSURLExtrasTests.m */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path 
= NSURLExtrasTests.m; sourceTree = "<group>"; };
                BC86B9341A92966B00B4C039 /* 
AFHTTPRequestOperationManager+UniqueRequests.h */ = {isa = PBXFileReference; 
fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 
"AFHTTPRequestOperationManager+UniqueRequests.h"; sourceTree = "<group>"; };
                BC86B9351A92966B00B4C039 /* 
AFHTTPRequestOperationManager+UniqueRequests.m */ = {isa = PBXFileReference; 
fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = 
"AFHTTPRequestOperationManager+UniqueRequests.m"; sourceTree = "<group>"; };
                BC86B93B1A929CC500B4C039 /* 
UICollectionViewFlowLayout+NSCopying.h */ = {isa = PBXFileReference; 
fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 
"UICollectionViewFlowLayout+NSCopying.h"; sourceTree = "<group>"; };
@@ -2321,6 +2323,7 @@
                                BCAFC5CF1AFD5E7D004615BA /* 
MWKArticle+WMFSharingTests.m */,
                                BC5FE5741B1DFF5400273BC0 /* 
ArticleFetcherTests.m */,
                                BC092BA61B19189100093C59 /* 
MWKSiteInfoFetcherTests.m */,
+                               BC8210CB1B4EB2390010BF7B /* NSURLExtrasTests.m 
*/,
                        );
                        name = Tests;
                        path = WikipediaUnitTests;
@@ -3182,6 +3185,7 @@
                                BCB8487B1AAAADF90077EC24 /* 
WMFRoundingUtilitiesTests.m in Sources */,
                                BC0FED6F1AAA0268002488D7 /* 
MWKImageInfo+MWKImageComparisonTests.m in Sources */,
                                BC0FED621AAA0263002488D7 /* WMFCodingStyle.m in 
Sources */,
+                               BC8210CC1B4EB2390010BF7B /* NSURLExtrasTests.m 
in Sources */,
                                BC0FED741AAA026C002488D7 /* 
CircularBitwiseRotationTests.m in Sources */,
                                BCEC77951AC9C74700D9DDA5 /* 
NSArray+WMFShuffle.m in Sources */,
                                BCE912BD1ACC629B00B74B42 /* 
NSIndexSet+BKReduceTests.m in Sources */,
diff --git a/Wikipedia/Categories/NSURL+Extras.h 
b/Wikipedia/Categories/NSURL+Extras.h
index dbcdcc1..208e8f1 100644
--- a/Wikipedia/Categories/NSURL+Extras.h
+++ b/Wikipedia/Categories/NSURL+Extras.h
@@ -19,6 +19,12 @@
 
 - (NSString*)wmf_mimeTypeForExtension;
 
+/// Prepend the receiver with the given scheme, unless one was already present.
+- (instancetype)wmf_prependSchemeIfNeeded:(NSString*)scheme;
+
+/// Prepend the receiver with "https" if it doesn't already have a scheme.
+- (instancetype)wmf_prependSchemeIfNeeded;
+
 @end
 
 NS_ASSUME_NONNULL_END
diff --git a/Wikipedia/Categories/NSURL+Extras.m 
b/Wikipedia/Categories/NSURL+Extras.m
index 5d3e150..360a3ce 100644
--- a/Wikipedia/Categories/NSURL+Extras.m
+++ b/Wikipedia/Categories/NSURL+Extras.m
@@ -26,4 +26,19 @@
     return [self.pathExtension wmf_asMIMEType];
 }
 
+- (instancetype)wmf_prependSchemeIfNeeded:(NSString*)scheme {
+    NSParameterAssert(scheme.length);
+    if (self.scheme.length) {
+        return self;
+    } else {
+        NSURLComponents* components = [[NSURLComponents alloc] 
initWithURL:self resolvingAgainstBaseURL:YES];
+        components.scheme = scheme;
+        return components.URL;
+    }
+}
+
+- (instancetype)wmf_prependSchemeIfNeeded {
+    return [self wmf_prependSchemeIfNeeded:@"https"];
+}
+
 @end
diff --git a/Wikipedia/Images/WMFImageController.swift 
b/Wikipedia/Images/WMFImageController.swift
index 5891eca..0107fe6 100644
--- a/Wikipedia/Images/WMFImageController.swift
+++ b/Wikipedia/Images/WMFImageController.swift
@@ -139,7 +139,8 @@
      * @return An `ImageDownload` with the image data and the origin it was 
loaded from.
      */
     public func fetchImageWithURL(url: NSURL) -> Promise<ImageDownload> {
-        let promise = imageManager.promisedImageWithURL(url, options: 
SDWebImageOptions.allZeros)
+        // HAX: make sure all image requests have a scheme (MW api sometimes 
omits one)
+        let promise = 
imageManager.promisedImageWithURL(url.wmf_prependSchemeIfNeeded(), options: 
.allZeros)
         return maybeApplyDebugTransforms(promise)
     }
 
diff --git a/WikipediaUnitTests/NSURLExtrasTests.m 
b/WikipediaUnitTests/NSURLExtrasTests.m
new file mode 100644
index 0000000..a0b3697
--- /dev/null
+++ b/WikipediaUnitTests/NSURLExtrasTests.m
@@ -0,0 +1,78 @@
+//
+//  NSURLExtrasTests.m
+//  Wikipedia
+//
+//  Created by Brian Gerstle on 7/9/15.
+//  Copyright (c) 2015 Wikimedia Foundation. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+#import <XCTest/XCTest.h>
+#import "NSURL+Extras.h"
+
+#define HC_SHORTHAND 1
+#import <OCHamcrest/OCHamcrest.h>
+
+static NSURL* fakeURLWithExtension(NSString* extension) {
+    return [NSURL URLWithString:[@"http://foo.org/bar."; 
stringByAppendingString:extension]];
+}
+
+@interface NSURLExtrasTests : XCTestCase
+
+@end
+
+@implementation NSURLExtrasTests
+
+- (void)testOptionalURLReturnsNilForNilString {
+    XCTAssertNil([NSURL wmf_optionalURLWithString:nil]);
+}
+
+- (void)testOptionalURLReturnsNilForEmptyString {
+    XCTAssertNil([NSURL wmf_optionalURLWithString:@""]);
+}
+
+- (void)testMimeTypeWithPNGExtension {
+    NSArray* testURLMimeTypes =
+        [@[fakeURLWithExtension(@"png"),
+           fakeURLWithExtension(@"PNG")] valueForKey : 
WMF_SAFE_KEYPATH(NSURL.new, wmf_mimeTypeForExtension)];
+    assertThat(testURLMimeTypes, everyItem(is(@"image/png")));
+}
+
+- (void)testMimeTypeWithJPEGExtension {
+    NSArray* testURLMimeTypes =
+        [@[fakeURLWithExtension(@"jpg"),
+           fakeURLWithExtension(@"jpeg"),
+           fakeURLWithExtension(@"JPG"),
+           fakeURLWithExtension(@"JPEG")] valueForKey : 
WMF_SAFE_KEYPATH(NSURL.new, wmf_mimeTypeForExtension)];
+    assertThat(testURLMimeTypes, everyItem(is(@"image/jpeg")));
+}
+
+- (void)testMimeTypeWithGIFExtension {
+    NSArray* testURLMimeTypes =
+        [@[fakeURLWithExtension(@"gif"),
+           fakeURLWithExtension(@"GIF")] valueForKey : 
WMF_SAFE_KEYPATH(NSURL.new, wmf_mimeTypeForExtension)];
+    assertThat(testURLMimeTypes, everyItem(is(@"image/gif")));
+}
+
+- (void)testPrependSchemeAddHTTPSToSchemelessURL {
+    assertThat([[NSURL URLWithString:@"//foo.org/bar.jpg"] 
wmf_prependSchemeIfNeeded],
+               is([NSURL URLWithString:@"https://foo.org/bar.jpg";]));
+}
+
+- (void)testPrependSchemeReturnsOriginalURLWithScheme {
+    NSURL* urlWithScheme = [NSURL URLWithString:@"https://foo.org/bar";];
+    // checking identity instead of equality to make sure we return the 
receiver
+    XCTAssertTrue(urlWithScheme == [urlWithScheme wmf_prependSchemeIfNeeded]);
+}
+
+- (void)testSchemelessURLStringPreservesEverythingExceptSchemeAndColon {
+    NSURL* urlWithScheme = [NSURL URLWithString:@"https://foo.org/bar";];
+    assertThat([urlWithScheme wmf_schemelessURLString], is(@"//foo.org/bar"));
+}
+
+- (void)testSchemelessURLIsEqualToAbsoluteStringOfURLWithoutScheme {
+    NSURL* urlWithoutScheme = [NSURL URLWithString:@"//foo.org/bar"];
+    assertThat([urlWithoutScheme wmf_schemelessURLString], 
is(urlWithoutScheme.absoluteString));
+}
+
+@end

-- 
To view, visit https://gerrit.wikimedia.org/r/223787
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ia44c86e4d648401f7d00c258683eef62d6c7456f
Gerrit-PatchSet: 1
Gerrit-Project: apps/ios/wikipedia
Gerrit-Branch: 5.0
Gerrit-Owner: Bgerstle <bgers...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to