From f8159fee72f4eadd22e8465b9f7ea8aef8ec25b5 Mon Sep 17 00:00:00 2001 From: BKKim Date: Tue, 30 May 2017 21:35:54 +0900 Subject: [PATCH 001/159] Fix AFURLSessionManager security weakness crashes when calling to a released block pointer --- AFNetworking/AFURLSessionManager.m | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/AFNetworking/AFURLSessionManager.m b/AFNetworking/AFURLSessionManager.m index 2475595d77..da02ce6c2b 100644 --- a/AFNetworking/AFURLSessionManager.m +++ b/AFNetworking/AFURLSessionManager.m @@ -39,13 +39,18 @@ static dispatch_queue_t url_session_manager_creation_queue() { } static void url_session_manager_create_task_safely(dispatch_block_t block) { - if (NSFoundationVersionNumber < NSFoundationVersionNumber_With_Fixed_5871104061079552_bug) { - // Fix of bug - // Open Radar:http://openradar.appspot.com/radar?id=5871104061079552 (status: Fixed in iOS8) - // Issue about:https://github.com/AFNetworking/AFNetworking/issues/2093 - dispatch_sync(url_session_manager_creation_queue(), block); + + if(block != nil) { + if (NSFoundationVersionNumber < NSFoundationVersionNumber_With_Fixed_5871104061079552_bug) { + // Fix of bug + // Open Radar:http://openradar.appspot.com/radar?id=5871104061079552 (status: Fixed in iOS8) + // Issue about:https://github.com/AFNetworking/AFNetworking/issues/2093 + dispatch_sync(url_session_manager_creation_queue(), block); + } else { + block(); + } } else { - block(); + return; } } From ec5c9550598c4b60db10edebed45b155d4c90472 Mon Sep 17 00:00:00 2001 From: Jeff Kelley Date: Wed, 12 Jul 2017 22:24:56 -0400 Subject: [PATCH 002/159] Make tests pass again (#3993) * Make tests pass again * Fix macOS builds in Fastlane. --- AFNetworking.xcodeproj/project.pbxproj | 56 +++--- .../HTTPBin.org/AddTrust_External_CA_Root.cer | Bin 1082 -> 0 bytes .../COMODO_RSA_Certification_Authority.cer | Bin 1400 -> 0 bytes ...RSA_Domain_Validation_Secure_Server_CA.cer | Bin 1548 -> 0 bytes .../Resources/HTTPBin.org/DST Root CA X3.cer | Bin 0 -> 846 bytes .../HTTPBinOrgServerTrustChain/httpbin_0.cer | Bin 1363 -> 1295 bytes .../HTTPBinOrgServerTrustChain/httpbin_1.cer | Bin 1548 -> 1174 bytes .../HTTPBinOrgServerTrustChain/httpbin_2.cer | Bin 1400 -> 846 bytes .../HTTPBinOrgServerTrustChain/httpbin_3.cer | Bin 1082 -> 0 bytes .../Let's Encrypt Authority X3.cer | Bin 0 -> 1174 bytes .../HTTPBin.org/httpbinorg_01192017.cer | Bin 1363 -> 0 bytes .../HTTPBin.org/httpbinorg_08132017.cer | Bin 0 -> 1295 bytes Tests/Tests/AFSecurityPolicyTests.m | 166 ++++-------------- fastlane/.env.default | 1 - 14 files changed, 59 insertions(+), 164 deletions(-) delete mode 100644 Tests/Resources/HTTPBin.org/AddTrust_External_CA_Root.cer delete mode 100644 Tests/Resources/HTTPBin.org/COMODO_RSA_Certification_Authority.cer delete mode 100644 Tests/Resources/HTTPBin.org/COMODO_RSA_Domain_Validation_Secure_Server_CA.cer create mode 100644 Tests/Resources/HTTPBin.org/DST Root CA X3.cer delete mode 100644 Tests/Resources/HTTPBin.org/HTTPBinOrgServerTrustChain/httpbin_3.cer create mode 100644 Tests/Resources/HTTPBin.org/Let's Encrypt Authority X3.cer delete mode 100644 Tests/Resources/HTTPBin.org/httpbinorg_01192017.cer create mode 100644 Tests/Resources/HTTPBin.org/httpbinorg_08132017.cer diff --git a/AFNetworking.xcodeproj/project.pbxproj b/AFNetworking.xcodeproj/project.pbxproj index df8f045ef8..7feb916cde 100644 --- a/AFNetworking.xcodeproj/project.pbxproj +++ b/AFNetworking.xcodeproj/project.pbxproj @@ -10,9 +10,15 @@ 1BF9F9601C87832B00F1F35A /* AFImageResponseSerializerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BF9F95F1C87832B00F1F35A /* AFImageResponseSerializerTests.m */; }; 1BF9F9611C87843200F1F35A /* AFImageResponseSerializerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BF9F95F1C87832B00F1F35A /* AFImageResponseSerializerTests.m */; }; 1BF9F9621C87843300F1F35A /* AFImageResponseSerializerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BF9F95F1C87832B00F1F35A /* AFImageResponseSerializerTests.m */; }; - 1FE783011C5857A100A73B7C /* httpbinorg_01192017.cer in Resources */ = {isa = PBXBuildFile; fileRef = 1FE783001C58579D00A73B7C /* httpbinorg_01192017.cer */; }; - 1FE783021C5857A100A73B7C /* httpbinorg_01192017.cer in Resources */ = {isa = PBXBuildFile; fileRef = 1FE783001C58579D00A73B7C /* httpbinorg_01192017.cer */; }; - 1FE783031C5857A200A73B7C /* httpbinorg_01192017.cer in Resources */ = {isa = PBXBuildFile; fileRef = 1FE783001C58579D00A73B7C /* httpbinorg_01192017.cer */; }; + 1F6F7DF71F17051000C979D0 /* DST Root CA X3.cer in Resources */ = {isa = PBXBuildFile; fileRef = 1F6F7DF61F1703A100C979D0 /* DST Root CA X3.cer */; }; + 1F6F7DF81F17051000C979D0 /* Let's Encrypt Authority X3.cer in Resources */ = {isa = PBXBuildFile; fileRef = 1F6F7DF51F1703A100C979D0 /* Let's Encrypt Authority X3.cer */; }; + 1F6F7DF91F17051000C979D0 /* httpbinorg_08132017.cer in Resources */ = {isa = PBXBuildFile; fileRef = 1F6F7DF41F1703A100C979D0 /* httpbinorg_08132017.cer */; }; + 1F6F7DFA1F17051000C979D0 /* DST Root CA X3.cer in Resources */ = {isa = PBXBuildFile; fileRef = 1F6F7DF61F1703A100C979D0 /* DST Root CA X3.cer */; }; + 1F6F7DFB1F17051000C979D0 /* Let's Encrypt Authority X3.cer in Resources */ = {isa = PBXBuildFile; fileRef = 1F6F7DF51F1703A100C979D0 /* Let's Encrypt Authority X3.cer */; }; + 1F6F7DFC1F17051000C979D0 /* httpbinorg_08132017.cer in Resources */ = {isa = PBXBuildFile; fileRef = 1F6F7DF41F1703A100C979D0 /* httpbinorg_08132017.cer */; }; + 1F6F7DFD1F17051100C979D0 /* DST Root CA X3.cer in Resources */ = {isa = PBXBuildFile; fileRef = 1F6F7DF61F1703A100C979D0 /* DST Root CA X3.cer */; }; + 1F6F7DFE1F17051100C979D0 /* Let's Encrypt Authority X3.cer in Resources */ = {isa = PBXBuildFile; fileRef = 1F6F7DF51F1703A100C979D0 /* Let's Encrypt Authority X3.cer */; }; + 1F6F7DFF1F17051100C979D0 /* httpbinorg_08132017.cer in Resources */ = {isa = PBXBuildFile; fileRef = 1F6F7DF41F1703A100C979D0 /* httpbinorg_08132017.cer */; }; 2960BAC31C1B2F1A00BA02F0 /* AFUIButtonTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 2960BAC21C1B2F1A00BA02F0 /* AFUIButtonTests.m */; }; 297824A31BC2D69A0041C395 /* adn_0.cer in Resources */ = {isa = PBXBuildFile; fileRef = 297824A01BC2D69A0041C395 /* adn_0.cer */; }; 297824A41BC2D69A0041C395 /* adn_0.cer in Resources */ = {isa = PBXBuildFile; fileRef = 297824A01BC2D69A0041C395 /* adn_0.cer */; }; @@ -54,9 +60,6 @@ 2987B0D51BC40AE900179A4C /* adn_2.cer in Resources */ = {isa = PBXBuildFile; fileRef = 297824A21BC2D69A0041C395 /* adn_2.cer */; }; 2987B0D61BC40AEC00179A4C /* ADNNetServerTrustChain in Resources */ = {isa = PBXBuildFile; fileRef = 298D7CDF1BC2CB5A00FD3B3E /* ADNNetServerTrustChain */; }; 2987B0D71BC40AF000179A4C /* HTTPBinOrgServerTrustChain in Resources */ = {isa = PBXBuildFile; fileRef = 298D7CE21BC2CB7C00FD3B3E /* HTTPBinOrgServerTrustChain */; }; - 2987B0D81BC40AF300179A4C /* AddTrust_External_CA_Root.cer in Resources */ = {isa = PBXBuildFile; fileRef = 298D7C6E1BC2C88F00FD3B3E /* AddTrust_External_CA_Root.cer */; }; - 2987B0D91BC40AF300179A4C /* COMODO_RSA_Certification_Authority.cer in Resources */ = {isa = PBXBuildFile; fileRef = 298D7C6F1BC2C88F00FD3B3E /* COMODO_RSA_Certification_Authority.cer */; }; - 2987B0DA1BC40AF300179A4C /* COMODO_RSA_Domain_Validation_Secure_Server_CA.cer in Resources */ = {isa = PBXBuildFile; fileRef = 298D7C701BC2C88F00FD3B3E /* COMODO_RSA_Domain_Validation_Secure_Server_CA.cer */; }; 2987B0DC1BC40AF600179A4C /* logo.png in Resources */ = {isa = PBXBuildFile; fileRef = 298D7C771BC2C88F00FD3B3E /* logo.png */; }; 2987B0DD1BC40AFB00179A4C /* AltName.cer in Resources */ = {isa = PBXBuildFile; fileRef = 298D7C791BC2C88F00FD3B3E /* AltName.cer */; }; 2987B0DE1BC40AFB00179A4C /* foobar.com.cer in Resources */ = {isa = PBXBuildFile; fileRef = 298D7C7A1BC2C88F00FD3B3E /* foobar.com.cer */; }; @@ -80,12 +83,6 @@ 298D7CBE1BC2CA9D00FD3B3E /* AltName.cer in Resources */ = {isa = PBXBuildFile; fileRef = 298D7C791BC2C88F00FD3B3E /* AltName.cer */; }; 298D7CBF1BC2CA9D00FD3B3E /* foobar.com.cer in Resources */ = {isa = PBXBuildFile; fileRef = 298D7C7A1BC2C88F00FD3B3E /* foobar.com.cer */; }; 298D7CC01BC2CA9D00FD3B3E /* NoDomains.cer in Resources */ = {isa = PBXBuildFile; fileRef = 298D7C7B1BC2C88F00FD3B3E /* NoDomains.cer */; }; - 298D7CC11BC2CAA100FD3B3E /* AddTrust_External_CA_Root.cer in Resources */ = {isa = PBXBuildFile; fileRef = 298D7C6E1BC2C88F00FD3B3E /* AddTrust_External_CA_Root.cer */; }; - 298D7CC21BC2CAA100FD3B3E /* COMODO_RSA_Certification_Authority.cer in Resources */ = {isa = PBXBuildFile; fileRef = 298D7C6F1BC2C88F00FD3B3E /* COMODO_RSA_Certification_Authority.cer */; }; - 298D7CC31BC2CAA100FD3B3E /* COMODO_RSA_Domain_Validation_Secure_Server_CA.cer in Resources */ = {isa = PBXBuildFile; fileRef = 298D7C701BC2C88F00FD3B3E /* COMODO_RSA_Domain_Validation_Secure_Server_CA.cer */; }; - 298D7CC51BC2CAA200FD3B3E /* AddTrust_External_CA_Root.cer in Resources */ = {isa = PBXBuildFile; fileRef = 298D7C6E1BC2C88F00FD3B3E /* AddTrust_External_CA_Root.cer */; }; - 298D7CC61BC2CAA200FD3B3E /* COMODO_RSA_Certification_Authority.cer in Resources */ = {isa = PBXBuildFile; fileRef = 298D7C6F1BC2C88F00FD3B3E /* COMODO_RSA_Certification_Authority.cer */; }; - 298D7CC71BC2CAA200FD3B3E /* COMODO_RSA_Domain_Validation_Secure_Server_CA.cer in Resources */ = {isa = PBXBuildFile; fileRef = 298D7C701BC2C88F00FD3B3E /* COMODO_RSA_Domain_Validation_Secure_Server_CA.cer */; }; 298D7CD31BC2CAE800FD3B3E /* AFHTTPResponseSerializationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 298D7C821BC2C88F00FD3B3E /* AFHTTPResponseSerializationTests.m */; }; 298D7CD41BC2CAE900FD3B3E /* AFHTTPResponseSerializationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 298D7C821BC2C88F00FD3B3E /* AFHTTPResponseSerializationTests.m */; }; 298D7CD51BC2CAEC00FD3B3E /* AFHTTPSessionManagerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 298D7C831BC2C88F00FD3B3E /* AFHTTPSessionManagerTests.m */; }; @@ -228,7 +225,9 @@ /* Begin PBXFileReference section */ 1BF9F95F1C87832B00F1F35A /* AFImageResponseSerializerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFImageResponseSerializerTests.m; sourceTree = ""; }; - 1FE783001C58579D00A73B7C /* httpbinorg_01192017.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = httpbinorg_01192017.cer; sourceTree = ""; }; + 1F6F7DF41F1703A100C979D0 /* httpbinorg_08132017.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = httpbinorg_08132017.cer; sourceTree = ""; }; + 1F6F7DF51F1703A100C979D0 /* Let's Encrypt Authority X3.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Let's Encrypt Authority X3.cer"; sourceTree = ""; }; + 1F6F7DF61F1703A100C979D0 /* DST Root CA X3.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = "DST Root CA X3.cer"; sourceTree = ""; }; 2960BAC21C1B2F1A00BA02F0 /* AFUIButtonTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFUIButtonTests.m; sourceTree = ""; }; 297824A01BC2D69A0041C395 /* adn_0.cer */ = {isa = PBXFileReference; lastKnownFileType = file; name = adn_0.cer; path = ADNNetServerTrustChain/adn_0.cer; sourceTree = ""; }; 297824A11BC2D69A0041C395 /* adn_1.cer */ = {isa = PBXFileReference; lastKnownFileType = file; name = adn_1.cer; path = ADNNetServerTrustChain/adn_1.cer; sourceTree = ""; }; @@ -237,9 +236,6 @@ 2987B0AE1BC408A200179A4C /* AFNetworking tvOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "AFNetworking tvOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 298D7C3B1BC2C79500FD3B3E /* AFNetworking iOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "AFNetworking iOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 298D7C4A1BC2C7B200FD3B3E /* AFNetworking Mac OS X Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "AFNetworking Mac OS X Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 298D7C6E1BC2C88F00FD3B3E /* AddTrust_External_CA_Root.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = AddTrust_External_CA_Root.cer; sourceTree = ""; }; - 298D7C6F1BC2C88F00FD3B3E /* COMODO_RSA_Certification_Authority.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = COMODO_RSA_Certification_Authority.cer; sourceTree = ""; }; - 298D7C701BC2C88F00FD3B3E /* COMODO_RSA_Domain_Validation_Secure_Server_CA.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = COMODO_RSA_Domain_Validation_Secure_Server_CA.cer; sourceTree = ""; }; 298D7C771BC2C88F00FD3B3E /* logo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = logo.png; sourceTree = ""; }; 298D7C791BC2C88F00FD3B3E /* AltName.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = AltName.cer; sourceTree = ""; }; 298D7C7A1BC2C88F00FD3B3E /* foobar.com.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = foobar.com.cer; sourceTree = ""; }; @@ -403,10 +399,9 @@ isa = PBXGroup; children = ( 298D7CE21BC2CB7C00FD3B3E /* HTTPBinOrgServerTrustChain */, - 298D7C6E1BC2C88F00FD3B3E /* AddTrust_External_CA_Root.cer */, - 298D7C6F1BC2C88F00FD3B3E /* COMODO_RSA_Certification_Authority.cer */, - 298D7C701BC2C88F00FD3B3E /* COMODO_RSA_Domain_Validation_Secure_Server_CA.cer */, - 1FE783001C58579D00A73B7C /* httpbinorg_01192017.cer */, + 1F6F7DF61F1703A100C979D0 /* DST Root CA X3.cer */, + 1F6F7DF51F1703A100C979D0 /* Let's Encrypt Authority X3.cer */, + 1F6F7DF41F1703A100C979D0 /* httpbinorg_08132017.cer */, ); path = HTTPBin.org; sourceTree = ""; @@ -838,22 +833,21 @@ files = ( 2987B0DE1BC40AFB00179A4C /* foobar.com.cer in Resources */, 2987B0D61BC40AEC00179A4C /* ADNNetServerTrustChain in Resources */, - 2987B0D91BC40AF300179A4C /* COMODO_RSA_Certification_Authority.cer in Resources */, 2987B0DF1BC40AFB00179A4C /* NoDomains.cer in Resources */, 2987B0D41BC40AE900179A4C /* adn_1.cer in Resources */, + 1F6F7DFF1F17051100C979D0 /* httpbinorg_08132017.cer in Resources */, 2987B0DD1BC40AFB00179A4C /* AltName.cer in Resources */, 2987B0D71BC40AF000179A4C /* HTTPBinOrgServerTrustChain in Resources */, 2987B0D31BC40AE900179A4C /* adn_0.cer in Resources */, 2987B0DC1BC40AF600179A4C /* logo.png in Resources */, - 2987B0D81BC40AF300179A4C /* AddTrust_External_CA_Root.cer in Resources */, 2987B0D51BC40AE900179A4C /* adn_2.cer in Resources */, - 2987B0DA1BC40AF300179A4C /* COMODO_RSA_Domain_Validation_Secure_Server_CA.cer in Resources */, 5F4323D71BF63CB0003B8749 /* GoogleComServerTrustChainPath1 in Resources */, + 1F6F7DFE1F17051100C979D0 /* Let's Encrypt Authority X3.cer in Resources */, 5F4323DB1BF63CBA003B8749 /* GoogleComServerTrustChainPath2 in Resources */, 5F4323BD1BF63741003B8749 /* Equifax_Secure_Certificate_Authority_Root.cer in Resources */, 5F4323DF1BF63CCC003B8749 /* GeoTrust_Global_CA_Root.cer in Resources */, - 1FE783031C5857A200A73B7C /* httpbinorg_01192017.cer in Resources */, 5F4323C01BF63741003B8749 /* GeoTrust_Global_CA-cross.cer in Resources */, + 1F6F7DFD1F17051100C979D0 /* DST Root CA X3.cer in Resources */, 5F4323CF1BF63741003B8749 /* GoogleInternetAuthorityG2.cer in Resources */, 5F4323C31BF63741003B8749 /* google.com.cer in Resources */, ); @@ -863,24 +857,23 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 298D7CC51BC2CAA200FD3B3E /* AddTrust_External_CA_Root.cer in Resources */, 298D7CBF1BC2CA9D00FD3B3E /* foobar.com.cer in Resources */, 298D7CBA1BC2CA9800FD3B3E /* logo.png in Resources */, - 298D7CC61BC2CAA200FD3B3E /* COMODO_RSA_Certification_Authority.cer in Resources */, 297824A31BC2D69A0041C395 /* adn_0.cer in Resources */, - 298D7CC71BC2CAA200FD3B3E /* COMODO_RSA_Domain_Validation_Secure_Server_CA.cer in Resources */, 298D7CE31BC2CB7C00FD3B3E /* HTTPBinOrgServerTrustChain in Resources */, + 1F6F7DF91F17051000C979D0 /* httpbinorg_08132017.cer in Resources */, 297824A71BC2D69A0041C395 /* adn_2.cer in Resources */, 297824A51BC2D69A0041C395 /* adn_1.cer in Resources */, 298D7CC01BC2CA9D00FD3B3E /* NoDomains.cer in Resources */, 298D7CE01BC2CB5A00FD3B3E /* ADNNetServerTrustChain in Resources */, 298D7CBE1BC2CA9D00FD3B3E /* AltName.cer in Resources */, 5F4323D51BF63CB0003B8749 /* GoogleComServerTrustChainPath1 in Resources */, + 1F6F7DF81F17051000C979D0 /* Let's Encrypt Authority X3.cer in Resources */, 5F4323D91BF63CBA003B8749 /* GoogleComServerTrustChainPath2 in Resources */, 5F4323BB1BF63741003B8749 /* Equifax_Secure_Certificate_Authority_Root.cer in Resources */, 5F4323DD1BF63CCC003B8749 /* GeoTrust_Global_CA_Root.cer in Resources */, - 1FE783011C5857A100A73B7C /* httpbinorg_01192017.cer in Resources */, 5F4323BE1BF63741003B8749 /* GeoTrust_Global_CA-cross.cer in Resources */, + 1F6F7DF71F17051000C979D0 /* DST Root CA X3.cer in Resources */, 5F4323CD1BF63741003B8749 /* GoogleInternetAuthorityG2.cer in Resources */, 5F4323C11BF63741003B8749 /* google.com.cer in Resources */, ); @@ -890,24 +883,23 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 298D7CC11BC2CAA100FD3B3E /* AddTrust_External_CA_Root.cer in Resources */, 298D7CBC1BC2CA9C00FD3B3E /* foobar.com.cer in Resources */, 298D7CB91BC2CA9800FD3B3E /* logo.png in Resources */, - 298D7CC21BC2CAA100FD3B3E /* COMODO_RSA_Certification_Authority.cer in Resources */, 297824A41BC2D69A0041C395 /* adn_0.cer in Resources */, - 298D7CC31BC2CAA100FD3B3E /* COMODO_RSA_Domain_Validation_Secure_Server_CA.cer in Resources */, 298D7CE41BC2CB7C00FD3B3E /* HTTPBinOrgServerTrustChain in Resources */, + 1F6F7DFC1F17051000C979D0 /* httpbinorg_08132017.cer in Resources */, 297824A81BC2D69A0041C395 /* adn_2.cer in Resources */, 297824A61BC2D69A0041C395 /* adn_1.cer in Resources */, 298D7CBD1BC2CA9C00FD3B3E /* NoDomains.cer in Resources */, 298D7CE11BC2CB5A00FD3B3E /* ADNNetServerTrustChain in Resources */, 298D7CBB1BC2CA9C00FD3B3E /* AltName.cer in Resources */, 5F4323D61BF63CB0003B8749 /* GoogleComServerTrustChainPath1 in Resources */, + 1F6F7DFB1F17051000C979D0 /* Let's Encrypt Authority X3.cer in Resources */, 5F4323DA1BF63CBA003B8749 /* GoogleComServerTrustChainPath2 in Resources */, 5F4323BC1BF63741003B8749 /* Equifax_Secure_Certificate_Authority_Root.cer in Resources */, 5F4323CE1BF63741003B8749 /* GoogleInternetAuthorityG2.cer in Resources */, - 1FE783021C5857A100A73B7C /* httpbinorg_01192017.cer in Resources */, 5F4323DE1BF63CCC003B8749 /* GeoTrust_Global_CA_Root.cer in Resources */, + 1F6F7DFA1F17051000C979D0 /* DST Root CA X3.cer in Resources */, 5F4323BF1BF63741003B8749 /* GeoTrust_Global_CA-cross.cer in Resources */, 5F4323C21BF63741003B8749 /* google.com.cer in Resources */, ); diff --git a/Tests/Resources/HTTPBin.org/AddTrust_External_CA_Root.cer b/Tests/Resources/HTTPBin.org/AddTrust_External_CA_Root.cer deleted file mode 100644 index 8a99c54a99fbe7d188e8349044bbf835338815b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1082 zcmXqLVlgvlVwPLL%*4pV#K>sC%f_kI=F#?@mywZ`mBAq2klTQhjX9KsO_(Xz)lkGh z2*lwM=5|a;2`MTqE>UoFGE_5A0f}-8%fdxnD@sy}@)C0tLP7!*{8CHG^NX?#l?)U> z>X?NkG1WOcDg@={ml(*2^BNc!m>L@x8kkrZTSSTT8XjN?rvBY=YQMRKuAJRO$F&7v$3OVnzc89ta_Yo{keA2e z`77qma!f!mNNh*Jt^yXWhK4aLSy*%>fBq$A#xwu(vU-c)21|O=7}o zpAG)XtF8Q7ZrndN|6ykS?(0t1vt6DXU;8fCF}^6Oki&d)W$Kd11yjtwGwAaknpAY_ zf<@77krl2-Vzp|wZ@G5l-I}w)F56FP-*skC{gt>gGb=(_aQkxO{;<->uV*!{yKU#v zPTh9dDPMHcj_TjoB)8i0+;|888*y*(5iaqn(`z5X>60`I?kALv!$}}rd+fLyRuno|Argo zyVp48xF<9RZun_r`~1&0HR0n8VoUc&{b@g6QQ4_D>yZyTSDWdcPxk_kT$;B1PMzPo zg1<7BuX&gPMRfc2iaj`Z->vky%Gx(yoVK)1E)YoHHJ8oQOX9M2)tNx2g;mKHpY2|F zRQr(GK4IQxdz0%btCw@~I;_sR+uwEg+qWJmC)U6#u3zUbPg2YfRdBYM`MhSY%8iv1 z#fv-a!=w!@B(@at&pLa8Z(g6C^uwMR&8OuJKf3rFV=4A5OW;5LW3PBaw%*G#K73KL eD)|+-^sdfJR+9^zH04HUoFGE_5A0f}-8%fdxnD@sy}@)C0t zLP7!*{8CHG^NX?#l?)U>>X?NkG1WOcDg@={ml(*2^BNc!m>L@x8kkrZTSSTT8Xr?e)pb%`8bxG1NBDgg8$LDi;*&sNkGhRFavNnVeXXnV+ZNSXz>i zUzAx=Y0$)k5>||?49rbT{0u;GE~X|XMuv$mLMC0}3fs7bSLN=}^DgNnGqueZ*D4n< z6z&PWf8>{zP``J*K-k{-1x4Ev>rZ;~i!Zl*yn!Y0-G9O9$G^1Mas9H3`8oNSN!3k} z?B{bfw=QU^DqCMT;rg4uyuaq;{JOuP>5E9+&wWRh>HF8utl#=4-MMHl55u+2*V#Ik z-}cXt5m{aL^l{#w8!MhnQn}@vowOtL@2i7*a<+AU=IfpHWOh#G%pVmV2Ci4vKIFA= zP55IpEl_<=`r%W0+p=G|9Y3zHV55BMJr9muOZ--TYIZYkdHv!{qla_4Uy;`An7uyI z8eK6;)mv82xcTluVDn*4H@{rFnZKrr->NYVceLpZe9OHpX1z|b)cx=i_IqB&9+|z~ zb>^eRQ7T(@tqik0pTFwAXT-h_EB=4kvG%3;?_E2-a9jO+;p`;Wd86gD@W-3GA9g0} z=+OvUBO*J8>v`ep^L%%0S58~#vDfDN`mMZ5J_iIF--KCzyS(U8^!80GNaN+QxRXU2R+|OyuVRJ3p-z1^F zk&nQT$}{_BWZ$b06!4^&QvNEyh26!5W#v54$m zU&mzoYuQJemcF&`EM~m9X=HQ-oQP%l85#exumE#yn*l#axiE;&YQPMn3#pvFxko}c zOOHQR=ZkHrGQ%Gu64I;-<~_|vo9`t L|Is>Mz#<<2E=x9y diff --git a/Tests/Resources/HTTPBin.org/COMODO_RSA_Domain_Validation_Secure_Server_CA.cer b/Tests/Resources/HTTPBin.org/COMODO_RSA_Domain_Validation_Secure_Server_CA.cer deleted file mode 100644 index 7d7e8f271e43b37257755ed76258f83533d2fc98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1548 zcmXqLV&gDqV*apznTe5!NkCgK@72vxvmBAGyxWUwde{wk**LY@JlekVGBWb8G8iCn^}^YVyJDP36f(LR)Wd}1v@G@rxulDre!84 zmSpDVDL9svWaJlRmQ)(ZiSrto7#JBE8Gu2QIIoct%l>tM=+0mehQ3*LT8Ce;an;7{SfZ|+C zO^l2TeTSGNA1;Vo^4h|*SLZL|h0C4?QjT*cvAT*`typk?hpArn%tZKZm_Od`*m7q{&aV)n$~Wm>Ajm<9!v|rP#}>ot^b`a`{cO`cb&R;w)*7}tyvn1 z6Mge1`KvDdRAqWs?T*{h3u_`xd;a@PbPlkOoGh0UsQ4~IWc9z&fC@XG4Ki)Qzp`iS zd0;(7t~KZm^JEo?ywmD|uFneYsX8y=edx9H?Y6oTXLH}_$*LE}-f=Z(SoL_5Blr5f zF73B=K9!zZzwT*k(^4j8Mh3>kO^m6)5J@zU2Zph%GK++PScAy!^>s|Pzm|QpY3W=0 z&SJ)!n?^=g3}itH_*lePL?*1yvYHabePhBap|Iln&ReWBZaoL5JXwB5#{VoVz?9u) zAOun_4B~SbumLG1Mh1uxsw`p#B5WMmY>cd|?97aC7L$QANQ(lCh=Gs+8ygFd$zZ_2 z#+Kg5!^p&F-~*DBXK^)fHgH^EzreQ5I-{hdz)D{~xhO|3IX^c)B|kY4#L$PN5@2FR zNz3r0tOwL!PzbY@k&z|UAlbkg#y4PU(}x>eg2Q0Pl$4O7(&7?lN1$OP1}bpPjBOH7 z&H2g21t_|alOix&>YDMx+oW3Enqy18ignT4uqBKyHLAs>l?!)62EY2D)#s1!8 zy%OuLo^b8Ag>_ERqA5R|r0&1XXX|l2#Ky4d$%{KTw>~Vcc=Jv9&c(YqeNz2PUxn06 z+kW_8XkV{q+@F-)=k4}Rd!2c9{{xSYNlgMzdECN38Q;2aBKhqx`6;Z^yrd>x{QmlU zf6zK!j+=HX76iUL*j{q={z9+*dKSQ|d&3)hX>v9@we zoI;w^(w)n;S|0p5!}FgsLtM84&_yXI1PlgS;nsZ2K} z{M3DAepM>rLb}5B8&2G=>zgv}-Az+5pP)HK(oIrzN5l2gSK2hPTnf~blUB}e%iq6i qLcyi5^45y?uT)oxp9?7JVX#{D_;#|%{2y$EjE|ZWuKdg2yAc4zK1JmK diff --git a/Tests/Resources/HTTPBin.org/DST Root CA X3.cer b/Tests/Resources/HTTPBin.org/DST Root CA X3.cer new file mode 100644 index 0000000000000000000000000000000000000000..95500f6bd1373c2dce681e3779ac7647a84ef251 GIT binary patch literal 846 zcmXqLV)imbp7(EZg*cIAj~}vT2q`KpE>UpK*E1A15Cy4X7Upva4p9io z&j$)SDnu9?$cghB7#LU@8yFcH8W~zfiSrs6g1Ckz28M>FQIuQI#HfVqXhv2B<|amd z27@L>E~X|%Muz+AUrrC;Xb#_UCMosXgr+ygFY9C*oQi&P^Kk8Phl3I#-49+Emw9SE zwpa9=yvC1jy`9JD)OUX_EAppa(zNRcy4j_*@^4P z-Bq|BeN3xswcg%>wMV(7R40@a9j(q&NgLp&$0Xa zPdXO75i7c?_QoRA()q%lzY;MHAE&>*I%{^X?5ss6 zTx-sJA~0K0Ynx{H=YL>|WnyMzU|j5E;9$THj3HTJM#ldvtOm?L%770fzz-5& z0j35v16dHCk420{Az=xANbwf&S15*z;pelr>~hlUS#T)JUzuK&f|!LT!du298=T>o{t;X zuDlc3)}8lq;@7rQzjme>uZoO5_h`9TvHNN5Gcz}sdz^n9=Kb|NKTnZS`>_u$yMv2z zoxiGi%nC~19kT+H`dpb@E zJ-bvpvHPd3QE%#&mo*#1%U&JbreV2XG*#xrxAJLOT)pMoHzsnk^s(R8+{X28Zj-60 F004`~O?LnQ literal 0 HcmV?d00001 diff --git a/Tests/Resources/HTTPBin.org/HTTPBinOrgServerTrustChain/httpbin_0.cer b/Tests/Resources/HTTPBin.org/HTTPBinOrgServerTrustChain/httpbin_0.cer index e2a2a3a13c337456dd97eac8f5ea0186c028edc0..f2ee78266ef5c032bc4f0b9af540e5a5e658c879 100644 GIT binary patch literal 1295 zcmXqLV&yhyV*b2Rh;S%QcNi9(?R&dQrE~+djF;q5C1c@^XOQDD>IF^=V z$h9*$1ftaC)fe^$P?u?R>f~3qmz5Jqd zgC<5LWM?t5GB7tW@-qO%xtN+585wSWKD*?o%TMk9lI;<~v9b4sZgO5`dHuZ6Y?Y_4 ztao1ira3bfyy#mJ+Iz|4>Qa8D=eHIv$hsY*qaHMQruq5TPfT_vzy7|)Yhb;;3|Kcho~Vh+Fsi^TENTmWx<2QrG&juW9Z0U_Wj7*FMjnCM)f#Jf! z*mNHl3_$)h12vednHa^Spsr3XC`Na!LE~z;LMDU8c|47?Lozap6`X=87E(+dkFEhpBFb^s>E^e>K!_ z-q%WRyKHx%uGrgW@zI3_Z_|D;9}LazW3n|NGo+ zLu9lsA6rUPDPwk@#zvZ%jow!yRlqw@U zWrN>8jguAp>MEA2LpN-%O#FTD`)iI_JQ2^I3#Ju6+vkxnVcEq;hPO;Z&jeiUcTW#8 zSiDE`@bqIhEsuXb)%5+xt-Wi13s?$W$$G}0lezW>_s>7ygrdA0x^?n$zlwh2W?*|_ ar#&O2V^i*;-}8NbRS6zB`$^`lO#lGVCf0@k literal 1363 zcmXqLV)Zv@VliL9%*4pVB#;(ucmBzdNqZZf9$k7-F?5dsFB_*;n@8JsUPeZ4RtAH{ z35MJToNUaYENsF|?oNi%29h8Shp>=)QEFmIYLS9(VqS7aYB7*$C}6+`l4KWV4^GTU z%P&eXlroS2iEs%EI{W+jyZ9?OJ1Y2O=4O_prWl$Tn1JM%g>|8FLBWm+F8R5MnRyCf zi8+}mi6xo&c?!X)$)!c9K&q$=Xq&U6ft)xmP_Ln(kpUP)0lDTtuBDN&simo9ltHwi zqJccfWNu*zsBzBuc_l^pIWS{^mdhE)K$M8O78j@Hm1HL71PA*lglFcYBqstLE@mJC zb{r3{mR?3lNkLL(o?d=Yx?EA-7B?Sst|Zh1$a@ju?VVET@jhe86SpVXKW6ZaibQ@k|SnBgJAku#^1TxU-{ z_x#_SNs3#=qzV+BFYJ&sQ=Z2#>t=&SsNkF6c+E|l{^Tx_+9-9#w6s9Vq{Zc6iO21! z|K>P2S}oK6JcZGI!jlCDdV1C`dRDz`)*;$?`KY{%2ufW@24nzyne)4B|5xFhDe`vVfwB zLz|6}m6e^D5zb;V@CPYYVDT_;Gq7Ug1}b1-+++w$^XvxN2AVK+OpIc(p!hAe($_Br zr!>9f{M`JMd=RDY91v{4!N!)}$iv9QXb=K2P@cutz}vucf%^j2HfNAdpvL5)9H_43 zM2J3cVh5&YNcuyhW=LX&q-AGEJ)lN|##WeH7#UeA4a$M;hWf^U3CV^Ma&0IvP=OoB z*d_sWa(;4g0g8zRsvzG9vH&wi6Ka}o;zrH@sO1AN@iQ{`n!MKK&adQmNdCR|=X6!O z^N;u3Qt!>5eXsJ0;?dfLn_hi$TIrVYtwrnZL#diHpX*n?_o{Dh`n_#kt;^#ko13e? z++AkH;9dE^nv8IoTSFbv#5ooWQt_j~DDWJ+VZR^-xpSk*h7w z&X(#tT5?2XjYYU0L+0BW51#3#=2>&Rc%`7X@58BEpEPU@1uX96sFl6s;oISRp<>3NAIrA4Uh&j1wXVrpV! zWSDcA=R?#}J@@TJvF6R2Gm;HnT{l&eRDHO2pXtYfN&4G&cssJLUOCT{BjU|Qts@!j z+>0NVK6&l0_q|9qh$z3@aP-_(ic|2>=eGQq~-^kmKfP`JhC5R4vw5eA)gIAakh*Cmi&<$y_8PCx(i1!@^cPL@*HTc` zWI0xH;DX`VenX3?V!Kut?{NOOQU0(&{h~@kVOw3ZACLchGS1p*X?S$~kzQWe6fxsf zzgjf6UEw}(qxSG*CT2zk#>GvHwZIUmG!Oy?sH`v}<9`+o12!PV#K>U42NL54iLn6F zN1H)C8;3R2P#h-gA@BM&1Jqk%meH_+KEj7|4} z{$n&SFwld!fr(K}3F?Mqpc6oL=~fu(<)oGrr$UmNUVc%!fepx1c@|RxV*|ql`U`a1 zv|*Zxa?sojOz%Pd{vpne5ys9zK6=STIR>&I-Fz%!EFvqsvXWV9@9uhb(Q^AT*VOl) zSG-w>oJ4_H446b28SWZi7yO(YVR2VN^fzbdzOt~L1s+Q?-PNlPsc=mC7$xr|q-m~F z5-5|DvE%I2g7l}~m+bM=2s}Ic#k%&nuWsy$TF5x-&WF2MvROCm!j@;Oxdt4HR-{@kf)2a)+!u%`E2){6W_KTHd;L6O!Z+>x=&G>hD&N+uyM)Tw+#W)@;$%&5TiZ?#vJAaME2mNZDq`5a2Ps~@9)}OFZ z(#`f;o%FJ*_MMBXawUGLE}hse`rwn8e#8bgeVq)oW8O2)-kQ(zvwp%`XD=Zazx?7V bjaN%nhllF4Ox`})Hs(OaAVarCE7 literal 1548 zcmXqLV&gDqV*apznTe5!NkCgK@72vxvmBAGyxWUwde{wk**LY@JlekVGBWb8G8iCn^}^YVyJDP36f(LR)Wd}1v@G@rxulDre!84 zmSpDVDL9svWaJlRmQ)(ZiSrto7#JBE8Gu2QIIoct%l>tM=+0mehQ3*LT8Ce;an;7{SfZ|+C zO^l2TeTSGNA1;Vo^4h|*SLZL|h0C4?QjT*cvAT*`typk?hpArn%tZKZm_Od`*m7q{&aV)n$~Wm>Ajm<9!v|rP#}>ot^b`a`{cO`cb&R;w)*7}tyvn1 z6Mge1`KvDdRAqWs?T*{h3u_`xd;a@PbPlkOoGh0UsQ4~IWc9z&fC@XG4Ki)Qzp`iS zd0;(7t~KZm^JEo?ywmD|uFneYsX8y=edx9H?Y6oTXLH}_$*LE}-f=Z(SoL_5Blr5f zF73B=K9!zZzwT*k(^4j8Mh3>kO^m6)5J@zU2Zph%GK++PScAy!^>s|Pzm|QpY3W=0 z&SJ)!n?^=g3}itH_*lePL?*1yvYHabePhBap|Iln&ReWBZaoL5JXwB5#{VoVz?9u) zAOun_4B~SbumLG1Mh1uxsw`p#B5WMmY>cd|?97aC7L$QANQ(lCh=Gs+8ygFd$zZ_2 z#+Kg5!^p&F-~*DBXK^)fHgH^EzreQ5I-{hdz)D{~xhO|3IX^c)B|kY4#L$PN5@2FR zNz3r0tOwL!PzbY@k&z|UAlbkg#y4PU(}x>eg2Q0Pl$4O7(&7?lN1$OP1}bpPjBOH7 z&H2g21t_|alOix&>YDMx+oW3Enqy18ignT4uqBKyHLAs>l?!)62EY2D)#s1!8 zy%OuLo^b8Ag>_ERqA5R|r0&1XXX|l2#Ky4d$%{KTw>~Vcc=Jv9&c(YqeNz2PUxn06 z+kW_8XkV{q+@F-)=k4}Rd!2c9{{xSYNlgMzdECN38Q;2aBKhqx`6;Z^yrd>x{QmlU zf6zK!j+=HX76iUL*j{q={z9+*dKSQ|d&3)hX>v9@we zoI;w^(w)n;S|0p5!}FgsLtM84&_yXI1PlgS;nsZ2K} z{M3DAepM>rLb}5B8&2G=>zgv}-Az+5pP)HK(oIrzN5l2gSK2hPTnf~blUB}e%iq6i qLcyi5^45y?uT)oxp9?7JVX#{D_;#|%{2y$EjE|ZWuKdg2yAc4zK1JmK diff --git a/Tests/Resources/HTTPBin.org/HTTPBinOrgServerTrustChain/httpbin_2.cer b/Tests/Resources/HTTPBin.org/HTTPBinOrgServerTrustChain/httpbin_2.cer index ad75f0fc5419119a8f36aba983d42c13c6b18c82..95500f6bd1373c2dce681e3779ac7647a84ef251 100644 GIT binary patch literal 846 zcmXqLV)imbp7(EZg*cIAj~}vT2q`KpE>UpK*E1A15Cy4X7Upva4p9io z&j$)SDnu9?$cghB7#LU@8yFcH8W~zfiSrs6g1Ckz28M>FQIuQI#HfVqXhv2B<|amd z27@L>E~X|%Muz+AUrrC;Xb#_UCMosXgr+ygFY9C*oQi&P^Kk8Phl3I#-49+Emw9SE zwpa9=yvC1jy`9JD)OUX_EAppa(zNRcy4j_*@^4P z-Bq|BeN3xswcg%>wMV(7R40@a9j(q&NgLp&$0Xa zPdXO75i7c?_QoRA()q%lzY;MHAE&>*I%{^X?5ss6 zTx-sJA~0K0Ynx{H=YL>|WnyMzU|j5E;9$THj3HTJM#ldvtOm?L%770fzz-5& z0j35v16dHCk420{Az=xANbwf&S15*z;pelr>~hlUS#T)JUzuK&f|!LT!du298=T>o{t;X zuDlc3)}8lq;@7rQzjme>uZoO5_h`9TvHNN5Gcz}sdz^n9=Kb|NKTnZS`>_u$yMv2z zoxiGi%nC~19kT+H`dpb@E zJ-bvpvHPd3QE%#&mo*#1%U&JbreV2XG*#xrxAJLOT)pMoHzsnk^s(R8+{X28Zj-60 F004`~O?LnQ literal 1400 zcmXqLVl6RfVu@M6%*4pVB%q%5F6_1E=f2g~3l{xpxu;~n%f_kI=F#?@mywZ&mBAq2 zklTQhjX9KsO_(Xz)lkGh2*lwM=5|a;2`MTqE>UoFGE_5A0f}-8%fdxnD@sy}@)C0t zLP7!*{8CHG^NX?#l?)U>>X?NkG1WOcDg@={ml(*2^BNc!m>L@x8kkrZTSSTT8Xr?e)pb%`8bxG1NBDgg8$LDi;*&sNkGhRFavNnVeXXnV+ZNSXz>i zUzAx=Y0$)k5>||?49rbT{0u;GE~X|XMuv$mLMC0}3fs7bSLN=}^DgNnGqueZ*D4n< z6z&PWf8>{zP``J*K-k{-1x4Ev>rZ;~i!Zl*yn!Y0-G9O9$G^1Mas9H3`8oNSN!3k} z?B{bfw=QU^DqCMT;rg4uyuaq;{JOuP>5E9+&wWRh>HF8utl#=4-MMHl55u+2*V#Ik z-}cXt5m{aL^l{#w8!MhnQn}@vowOtL@2i7*a<+AU=IfpHWOh#G%pVmV2Ci4vKIFA= zP55IpEl_<=`r%W0+p=G|9Y3zHV55BMJr9muOZ--TYIZYkdHv!{qla_4Uy;`An7uyI z8eK6;)mv82xcTluVDn*4H@{rFnZKrr->NYVceLpZe9OHpX1z|b)cx=i_IqB&9+|z~ zb>^eRQ7T(@tqik0pTFwAXT-h_EB=4kvG%3;?_E2-a9jO+;p`;Wd86gD@W-3GA9g0} z=+OvUBO*J8>v`ep^L%%0S58~#vDfDN`mMZ5J_iIF--KCzyS(U8^!80GNaN+QxRXU2R+|OyuVRJ3p-z1^F zk&nQT$}{_BWZ$b06!4^&QvNEyh26!5W#v54$m zU&mzoYuQJemcF&`EM~m9X=HQ-oQP%l85#exumE#yn*l#axiE;&YQPMn3#pvFxko}c zOOHQR=ZkHrGQ%Gu64I;-<~_|vo9`t L|Is>Mz#<<2E=x9y diff --git a/Tests/Resources/HTTPBin.org/HTTPBinOrgServerTrustChain/httpbin_3.cer b/Tests/Resources/HTTPBin.org/HTTPBinOrgServerTrustChain/httpbin_3.cer deleted file mode 100644 index 8a99c54a99fbe7d188e8349044bbf835338815b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1082 zcmXqLVlgvlVwPLL%*4pV#K>sC%f_kI=F#?@mywZ`mBAq2klTQhjX9KsO_(Xz)lkGh z2*lwM=5|a;2`MTqE>UoFGE_5A0f}-8%fdxnD@sy}@)C0tLP7!*{8CHG^NX?#l?)U> z>X?NkG1WOcDg@={ml(*2^BNc!m>L@x8kkrZTSSTT8XjN?rvBY=YQMRKuAJRO$F&7v$3OVnzc89ta_Yo{keA2e z`77qma!f!mNNh*Jt^yXWhK4aLSy*%>fBq$A#xwu(vU-c)21|O=7}o zpAG)XtF8Q7ZrndN|6ykS?(0t1vt6DXU;8fCF}^6Oki&d)W$Kd11yjtwGwAaknpAY_ zf<@77krl2-Vzp|wZ@G5l-I}w)F56FP-*skC{gt>gGb=(_aQkxO{;<->uV*!{yKU#v zPTh9dDPMHcj_TjoB)8i0+;|888*y*(5iaqn(`z5X>60`I?kALv!$}}rd+fLyRuno|Argo zyVp48xF<9RZun_r`~1&0HR0n8VoUc&{b@g6QQ4_D>yZyTSDWdcPxk_kT$;B1PMzPo zg1<7BuX&gPMRfc2iaj`Z->vky%Gx(yoVK)1E)YoHHJ8oQOX9M2)tNx2g;mKHpY2|F zRQr(GK4IQxdz0%btCw@~I;_sR+uwEg+qWJmC)U6#u3zUbPg2YfRdBYM`MhSY%8iv1 z#fv-a!=w!@B(@at&pLa8Z(g6C^uwMR&8OuJKf3rFV=4A5OW;5LW3PBaw%*G#K73KL eD)|+-^sdfJR+9^zH04H6s;oISRp<>3NAIrA4Uh&j1wXVrpV! zWSDcA=R?#}J@@TJvF6R2Gm;HnT{l&eRDHO2pXtYfN&4G&cssJLUOCT{BjU|Qts@!j z+>0NVK6&l0_q|9qh$z3@aP-_(ic|2>=eGQq~-^kmKfP`JhC5R4vw5eA)gIAakh*Cmi&<$y_8PCx(i1!@^cPL@*HTc` zWI0xH;DX`VenX3?V!Kut?{NOOQU0(&{h~@kVOw3ZACLchGS1p*X?S$~kzQWe6fxsf zzgjf6UEw}(qxSG*CT2zk#>GvHwZIUmG!Oy?sH`v}<9`+o12!PV#K>U42NL54iLn6F zN1H)C8;3R2P#h-gA@BM&1Jqk%meH_+KEj7|4} z{$n&SFwld!fr(K}3F?Mqpc6oL=~fu(<)oGrr$UmNUVc%!fepx1c@|RxV*|ql`U`a1 zv|*Zxa?sojOz%Pd{vpne5ys9zK6=STIR>&I-Fz%!EFvqsvXWV9@9uhb(Q^AT*VOl) zSG-w>oJ4_H446b28SWZi7yO(YVR2VN^fzbdzOt~L1s+Q?-PNlPsc=mC7$xr|q-m~F z5-5|DvE%I2g7l}~m+bM=2s}Ic#k%&nuWsy$TF5x-&WF2MvROCm!j@;Oxdt4HR-{@kf)2a)+!u%`E2){6W_KTHd;L6O!Z+>x=&G>hD&N+uyM)Tw+#W)@;$%&5TiZ?#vJAaME2mNZDq`5a2Ps~@9)}OFZ z(#`f;o%FJ*_MMBXawUGLE}hse`rwn8e#8bgeVq)oW8O2)-kQ(zvwp%`XD=Zazx?7V bjaN%nhllF4Ox`})Hs(OaAVarCE7 literal 0 HcmV?d00001 diff --git a/Tests/Resources/HTTPBin.org/httpbinorg_01192017.cer b/Tests/Resources/HTTPBin.org/httpbinorg_01192017.cer deleted file mode 100644 index e2a2a3a13c337456dd97eac8f5ea0186c028edc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1363 zcmXqLV)Zv@VliL9%*4pVB#;(ucmBzdNqZZf9$k7-F?5dsFB_*;n@8JsUPeZ4RtAH{ z35MJToNUaYENsF|?oNi%29h8Shp>=)QEFmIYLS9(VqS7aYB7*$C}6+`l4KWV4^GTU z%P&eXlroS2iEs%EI{W+jyZ9?OJ1Y2O=4O_prWl$Tn1JM%g>|8FLBWm+F8R5MnRyCf zi8+}mi6xo&c?!X)$)!c9K&q$=Xq&U6ft)xmP_Ln(kpUP)0lDTtuBDN&simo9ltHwi zqJccfWNu*zsBzBuc_l^pIWS{^mdhE)K$M8O78j@Hm1HL71PA*lglFcYBqstLE@mJC zb{r3{mR?3lNkLL(o?d=Yx?EA-7B?Sst|Zh1$a@ju?VVET@jhe86SpVXKW6ZaibQ@k|SnBgJAku#^1TxU-{ z_x#_SNs3#=qzV+BFYJ&sQ=Z2#>t=&SsNkF6c+E|l{^Tx_+9-9#w6s9Vq{Zc6iO21! z|K>P2S}oK6JcZGI!jlCDdV1C`dRDz`)*;$?`KY{%2ufW@24nzyne)4B|5xFhDe`vVfwB zLz|6}m6e^D5zb;V@CPYYVDT_;Gq7Ug1}b1-+++w$^XvxN2AVK+OpIc(p!hAe($_Br zr!>9f{M`JMd=RDY91v{4!N!)}$iv9QXb=K2P@cutz}vucf%^j2HfNAdpvL5)9H_43 zM2J3cVh5&YNcuyhW=LX&q-AGEJ)lN|##WeH7#UeA4a$M;hWf^U3CV^Ma&0IvP=OoB z*d_sWa(;4g0g8zRsvzG9vH&wi6Ka}o;zrH@sO1AN@iQ{`n!MKK&adQmNdCR|=X6!O z^N;u3Qt!>5eXsJ0;?dfLn_hi$TIrVYtwrnZL#diHpX*n?_o{Dh`n_#kt;^#ko13e? z++AkH;9dE^nv8IoTSFbv#5ooWQt_j~DDWJ+VZR^-xpSk*h7w z&X(#tT5?2XjYYU0L+0BW51#3#=2>&Rc%`7X@58BEpEPU@1uX96sFlRh;S%QcNi9(?R&dQrE~+djF;q5C1c@^XOQDD>IF^=V z$h9*$1ftaC)fe^$P?u?R>f~3qmz5Jqd zgC<5LWM?t5GB7tW@-qO%xtN+585wSWKD*?o%TMk9lI;<~v9b4sZgO5`dHuZ6Y?Y_4 ztao1ira3bfyy#mJ+Iz|4>Qa8D=eHIv$hsY*qaHMQruq5TPfT_vzy7|)Yhb;;3|Kcho~Vh+Fsi^TENTmWx<2QrG&juW9Z0U_Wj7*FMjnCM)f#Jf! z*mNHl3_$)h12vednHa^Spsr3XC`Na!LE~z;LMDU8c|47?Lozap6`X=87E(+dkFEhpBFb^s>E^e>K!_ z-q%WRyKHx%uGrgW@zI3_Z_|D;9}LazW3n|NGo+ zLu9lsA6rUPDPwk@#zvZ%jow!yRlqw@U zWrN>8jguAp>MEA2LpN-%O#FTD`)iI_JQ2^I3#Ju6+vkxnVcEq;hPO;Z&jeiUcTW#8 zSiDE`@bqIhEsuXb)%5+xt-Wi13s?$W$$G}0lezW>_s>7ygrdA0x^?n$zlwh2W?*|_ ar#&O2V^i*;-}8NbRS6zB`$^`lO#lGVCf0@k literal 0 HcmV?d00001 diff --git a/Tests/Tests/AFSecurityPolicyTests.m b/Tests/Tests/AFSecurityPolicyTests.m index 2504569e20..2ebbd80d34 100644 --- a/Tests/Tests/AFSecurityPolicyTests.m +++ b/Tests/Tests/AFSecurityPolicyTests.m @@ -57,68 +57,30 @@ static SecTrustRef AFUTADNNetServerTrust() { return AFUTTrustChainForCertsInDirectory(serverCertDirectoryPath); } -//static SecTrustRef AFUTGoogleComServerTrustPath1() { -// NSString *bundlePath = [[NSBundle bundleForClass:[AFSecurityPolicyTests class]] resourcePath]; -// NSString *serverCertDirectoryPath = [bundlePath stringByAppendingPathComponent:@"GoogleComServerTrustChainPath1"]; -// -// return AFUTTrustChainForCertsInDirectory(serverCertDirectoryPath); -//} -// -//static SecTrustRef AFUTGoogleComServerTrustPath2() { -// NSString *bundlePath = [[NSBundle bundleForClass:[AFSecurityPolicyTests class]] resourcePath]; -// NSString *serverCertDirectoryPath = [bundlePath stringByAppendingPathComponent:@"GoogleComServerTrustChainPath2"]; -// -// return AFUTTrustChainForCertsInDirectory(serverCertDirectoryPath); -//} - static SecCertificateRef AFUTHTTPBinOrgCertificate() { - NSString *certPath = [[NSBundle bundleForClass:[AFSecurityPolicyTests class]] pathForResource:@"httpbinorg_01192017" ofType:@"cer"]; - NSCAssert(certPath != nil, @"Path for certificate should not be nil"); - NSData *certData = [NSData dataWithContentsOfFile:certPath]; - - return SecCertificateCreateWithData(NULL, (__bridge CFDataRef)(certData)); -} - -static SecCertificateRef AFUTCOMODORSADomainValidationSecureServerCertificate() { - NSString *certPath = [[NSBundle bundleForClass:[AFSecurityPolicyTests class]] pathForResource:@"COMODO_RSA_Domain_Validation_Secure_Server_CA" ofType:@"cer"]; + NSString *certPath = [[NSBundle bundleForClass:[AFSecurityPolicyTests class]] pathForResource:@"httpbinorg_08132017" ofType:@"cer"]; NSCAssert(certPath != nil, @"Path for certificate should not be nil"); NSData *certData = [NSData dataWithContentsOfFile:certPath]; return SecCertificateCreateWithData(NULL, (__bridge CFDataRef)(certData)); } -static SecCertificateRef AFUTCOMODORSACertificate() { - NSString *certPath = [[NSBundle bundleForClass:[AFSecurityPolicyTests class]] pathForResource:@"COMODO_RSA_Certification_Authority" ofType:@"cer"]; +static SecCertificateRef AFUTLetsEncryptAuthorityCertificate() { + NSString *certPath = [[NSBundle bundleForClass:NSClassFromString(@"AFSecurityPolicyTests")] pathForResource:@"Let's Encrypt Authority X3" ofType:@"cer"]; NSCAssert(certPath != nil, @"Path for certificate should not be nil"); NSData *certData = [NSData dataWithContentsOfFile:certPath]; - + return SecCertificateCreateWithData(NULL, (__bridge CFDataRef)(certData)); } -static SecCertificateRef AFUTAddTrustExternalRootCertificate() { - NSString *certPath = [[NSBundle bundleForClass:[AFSecurityPolicyTests class]] pathForResource:@"AddTrust_External_CA_Root" ofType:@"cer"]; +static SecCertificateRef AFUTDSTRootCertificate() { + NSString *certPath = [[NSBundle bundleForClass:NSClassFromString(@"AFSecurityPolicyTests")] pathForResource:@"DST Root CA X3" ofType:@"cer"]; NSCAssert(certPath != nil, @"Path for certificate should not be nil"); NSData *certData = [NSData dataWithContentsOfFile:certPath]; - + return SecCertificateCreateWithData(NULL, (__bridge CFDataRef)(certData)); } -//static SecCertificateRef AFUTGoogleComEquifaxSecureCARootCertificate() { -// NSString *certPath = [[NSBundle bundleForClass:[AFSecurityPolicyTests class]] pathForResource:@"Equifax_Secure_Certificate_Authority_Root" ofType:@"cer"]; -// NSCAssert(certPath != nil, @"Path for certificate should not be nil"); -// NSData *certData = [NSData dataWithContentsOfFile:certPath]; -// -// return SecCertificateCreateWithData(NULL, (__bridge CFDataRef)(certData)); -//} -// -//static SecCertificateRef AFUTGoogleComGeoTrustGlobalCARootCertificate() { -// NSString *certPath = [[NSBundle bundleForClass:[AFSecurityPolicyTests class]] pathForResource:@"GeoTrust_Global_CA_Root" ofType:@"cer"]; -// NSCAssert(certPath != nil, @"Path for certificate should not be nil"); -// NSData *certData = [NSData dataWithContentsOfFile:certPath]; -// -// return SecCertificateCreateWithData(NULL, (__bridge CFDataRef)(certData)); -//} - static SecCertificateRef AFUTSelfSignedCertificateWithoutDomain() { NSString *certPath = [[NSBundle bundleForClass:[AFSecurityPolicyTests class]] pathForResource:@"NoDomains" ofType:@"cer"]; NSCAssert(certPath != nil, @"Path for certificate should not be nil"); @@ -239,58 +201,48 @@ - (void)testPolicyWithPublicKeyPinningAllowsHTTPBinOrgServerTrustWithHTTPBinOrgL XCTAssertTrue([policy evaluateServerTrust:AFUTHTTPBinOrgServerTrust() forDomain:nil], @"Policy should allow server trust"); } -- (void)testPolicyWithPublicKeyPinningAllowsHTTPBinOrgServerTrustWithHTTPBinOrgIntermediate1CertificatePinned { +- (void)testPolicyWithPublicKeyPinningAllowsHTTPBinOrgServerTrustWithHTTPBinOrgIntermediateCertificatePinned { AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey]; - - SecCertificateRef certificate = AFUTCOMODORSADomainValidationSecureServerCertificate(); - policy.pinnedCertificates = [NSSet setWithObject:(__bridge_transfer id)SecCertificateCopyData(certificate)]; - XCTAssertTrue([policy evaluateServerTrust:AFUTHTTPBinOrgServerTrust() forDomain:nil], @"Policy should allow server trust"); -} - -- (void)testPolicyWithPublicKeyPinningAllowsHTTPBinOrgServerTrustWithHTTPBinOrgIntermediate2CertificatePinned { - AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey]; - - SecCertificateRef certificate = AFUTCOMODORSACertificate(); + + SecCertificateRef certificate = AFUTLetsEncryptAuthorityCertificate(); policy.pinnedCertificates = [NSSet setWithObject:(__bridge_transfer id)SecCertificateCopyData(certificate)]; XCTAssertTrue([policy evaluateServerTrust:AFUTHTTPBinOrgServerTrust() forDomain:nil], @"Policy should allow server trust"); } - (void)testPolicyWithPublicKeyPinningAllowsHTTPBinOrgServerTrustWithHTTPBinOrgRootCertificatePinned { AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey]; - - SecCertificateRef certificate = AFUTAddTrustExternalRootCertificate(); + + SecCertificateRef certificate = AFUTDSTRootCertificate(); policy.pinnedCertificates = [NSSet setWithObject:(__bridge_transfer id)SecCertificateCopyData(certificate)]; XCTAssertTrue([policy evaluateServerTrust:AFUTHTTPBinOrgServerTrust() forDomain:nil], @"Policy should allow server trust"); } - (void)testPolicyWithPublicKeyPinningAllowsHTTPBinOrgServerTrustWithEntireCertificateChainPinned { AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey]; - + SecCertificateRef httpBinCertificate = AFUTHTTPBinOrgCertificate(); - SecCertificateRef intermedaite1Certificate = AFUTCOMODORSADomainValidationSecureServerCertificate(); - SecCertificateRef intermedaite2Certificate = AFUTCOMODORSACertificate(); - SecCertificateRef rootCertificate = AFUTAddTrustExternalRootCertificate(); + SecCertificateRef intermediateCertificate = AFUTLetsEncryptAuthorityCertificate(); + SecCertificateRef rootCertificate = AFUTDSTRootCertificate(); [policy setPinnedCertificates:[NSSet setWithObjects:(__bridge_transfer NSData *)SecCertificateCopyData(httpBinCertificate), - (__bridge_transfer NSData *)SecCertificateCopyData(intermedaite1Certificate), - (__bridge_transfer NSData *)SecCertificateCopyData(intermedaite2Certificate), - (__bridge_transfer NSData *)SecCertificateCopyData(rootCertificate), nil]]; + (__bridge_transfer NSData *)SecCertificateCopyData(intermediateCertificate), + (__bridge_transfer NSData *)SecCertificateCopyData(rootCertificate), nil]]; XCTAssertTrue([policy evaluateServerTrust:AFUTHTTPBinOrgServerTrust() forDomain:nil], @"Policy should allow HTTPBinOrg server trust because at least one of the pinned certificates is valid"); - + } - (void)testPolicyWithPublicKeyPinningAllowsHTTPBirnOrgServerTrustWithHTTPbinOrgPinnedCertificateAndAdditionalPinnedCertificates { AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey]; - + SecCertificateRef httpBinCertificate = AFUTHTTPBinOrgCertificate(); SecCertificateRef selfSignedCertificate = AFUTSelfSignedCertificateWithCommonNameDomain(); [policy setPinnedCertificates:[NSSet setWithObjects:(__bridge_transfer NSData *)SecCertificateCopyData(httpBinCertificate), - (__bridge_transfer NSData *)SecCertificateCopyData(selfSignedCertificate), nil]]; + (__bridge_transfer NSData *)SecCertificateCopyData(selfSignedCertificate), nil]]; XCTAssertTrue([policy evaluateServerTrust:AFUTHTTPBinOrgServerTrust() forDomain:nil], @"Policy should allow HTTPBinOrg server trust because at least one of the pinned certificates is valid"); } - (void)testPolicyWithPublicKeyPinningAllowsHTTPBinOrgServerTrustWithHTTPBinOrgLeafCertificatePinnedAndValidDomainName { AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey]; - + SecCertificateRef certificate = AFUTHTTPBinOrgCertificate(); policy.pinnedCertificates = [NSSet setWithObject:(__bridge_transfer id)SecCertificateCopyData(certificate)]; XCTAssertTrue([policy evaluateServerTrust:AFUTHTTPBinOrgServerTrust() forDomain:@"httpbin.org"], @"Policy should allow server trust"); @@ -361,96 +313,53 @@ - (void)testPolicyWithCertificatePinningAllowsHTTPBinOrgServerTrustWithHTTPBinOr XCTAssertTrue([policy evaluateServerTrust:AFUTHTTPBinOrgServerTrust() forDomain:nil], @"Policy should allow server trust"); } -- (void)testPolicyWithCertificatePinningAllowsHTTPBinOrgServerTrustWithHTTPBinOrgIntermediate1CertificatePinned { - AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate]; - - SecCertificateRef certificate = AFUTCOMODORSADomainValidationSecureServerCertificate(); - policy.pinnedCertificates = [NSSet setWithObject:(__bridge_transfer id)SecCertificateCopyData(certificate)]; - XCTAssertTrue([policy evaluateServerTrust:AFUTHTTPBinOrgServerTrust() forDomain:nil], @"Policy should allow server trust"); -} - -- (void)testPolicyWithCertificatePinningAllowsHTTPBinOrgServerTrustWithHTTPBinOrgIntermediate2CertificatePinned { +- (void)testPolicyWithCertificatePinningAllowsHTTPBinOrgServerTrustWithHTTPBinOrgIntermediateCertificatePinned { AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate]; - - SecCertificateRef certificate = AFUTCOMODORSACertificate(); + + SecCertificateRef certificate = AFUTLetsEncryptAuthorityCertificate(); policy.pinnedCertificates = [NSSet setWithObject:(__bridge_transfer id)SecCertificateCopyData(certificate)]; XCTAssertTrue([policy evaluateServerTrust:AFUTHTTPBinOrgServerTrust() forDomain:nil], @"Policy should allow server trust"); } - (void)testPolicyWithCertificatePinningAllowsHTTPBinOrgServerTrustWithHTTPBinOrgRootCertificatePinned { AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate]; - - SecCertificateRef certificate = AFUTAddTrustExternalRootCertificate(); + + SecCertificateRef certificate = AFUTDSTRootCertificate(); policy.pinnedCertificates = [NSSet setWithObject:(__bridge_transfer id)SecCertificateCopyData(certificate)]; XCTAssertTrue([policy evaluateServerTrust:AFUTHTTPBinOrgServerTrust() forDomain:nil], @"Policy should allow server trust"); } - (void)testPolicyWithCertificatePinningAllowsHTTPBinOrgServerTrustWithEntireCertificateChainPinned { AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate]; - + SecCertificateRef httpBinCertificate = AFUTHTTPBinOrgCertificate(); - SecCertificateRef intermedaite1Certificate = AFUTCOMODORSADomainValidationSecureServerCertificate(); - SecCertificateRef intermedaite2Certificate = AFUTCOMODORSACertificate(); - SecCertificateRef rootCertificate = AFUTAddTrustExternalRootCertificate(); + SecCertificateRef intermediateCertificate = AFUTLetsEncryptAuthorityCertificate(); + SecCertificateRef rootCertificate = AFUTDSTRootCertificate(); [policy setPinnedCertificates:[NSSet setWithObjects:(__bridge_transfer NSData *)SecCertificateCopyData(httpBinCertificate), - (__bridge_transfer NSData *)SecCertificateCopyData(intermedaite1Certificate), - (__bridge_transfer NSData *)SecCertificateCopyData(intermedaite2Certificate), - (__bridge_transfer NSData *)SecCertificateCopyData(rootCertificate), nil]]; + (__bridge_transfer NSData *)SecCertificateCopyData(intermediateCertificate), + (__bridge_transfer NSData *)SecCertificateCopyData(rootCertificate), nil]]; XCTAssertTrue([policy evaluateServerTrust:AFUTHTTPBinOrgServerTrust() forDomain:nil], @"Policy should allow HTTPBinOrg server trust because at least one of the pinned certificates is valid"); - + } - (void)testPolicyWithCertificatePinningAllowsHTTPBirnOrgServerTrustWithHTTPbinOrgPinnedCertificateAndAdditionalPinnedCertificates { AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate]; - + SecCertificateRef httpBinCertificate = AFUTHTTPBinOrgCertificate(); SecCertificateRef selfSignedCertificate = AFUTSelfSignedCertificateWithCommonNameDomain(); [policy setPinnedCertificates:[NSSet setWithObjects:(__bridge_transfer NSData *)SecCertificateCopyData(httpBinCertificate), - (__bridge_transfer NSData *)SecCertificateCopyData(selfSignedCertificate), nil]]; + (__bridge_transfer NSData *)SecCertificateCopyData(selfSignedCertificate), nil]]; XCTAssertTrue([policy evaluateServerTrust:AFUTHTTPBinOrgServerTrust() forDomain:nil], @"Policy should allow HTTPBinOrg server trust because at least one of the pinned certificates is valid"); } - (void)testPolicyWithCertificatePinningAllowsHTTPBinOrgServerTrustWithHTTPBinOrgLeafCertificatePinnedAndValidDomainName { AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate]; - + SecCertificateRef certificate = AFUTHTTPBinOrgCertificate(); policy.pinnedCertificates = [NSSet setWithObject:(__bridge_transfer id)SecCertificateCopyData(certificate)]; XCTAssertTrue([policy evaluateServerTrust:AFUTHTTPBinOrgServerTrust() forDomain:@"httpbin.org"], @"Policy should allow server trust"); } -//- (void)testPolicyWithCertificatePinningAllowsGoogleComServerTrustIncompleteChainWithRootCertificatePinnedAndValidDomainName { -// //TODO THIS TEST HAS BEEN DISABLED UNTIL CERTS HAVE BEEN UPDATED. -// //Please see conversation here: https://github.com/AFNetworking/AFNetworking/pull/3159#issuecomment-178647437 -// // -// // Fix certificate validation for servers providing incomplete chains (#3159) - test case -// // -// // google.com has two certification paths and both send incomplete certificate chains, i.e. don't include the Root CA -// // (this can be validated in https://www.ssllabs.com/ssltest/analyze.html?d=google.com) -// // -// // The two certification paths are: -// // - Path 1: *.google.com, Google Internet Authority G2 (with GeoTrust Global CA Root) -// // - Path 2: *.google.com, Google Internet Authority G2, GeoTrust Global CA (cross signed) (with Equifax Secure CA Root) -// // -// // The common goal of using certificate pinning is to prevent MiTM (man-in-the-middle) attacks, so the Root CA's should be pinned to protect the entire chains. -// // Since there's no Root CA being sent, when `-evaluateServerTrust:` invokes `AFCertificateTrustChainForServerTrust(serverTrust)`, the Root CA isn't present -// // Therefore, even though `AFServerTrustIsValid(serverTrust)` succeeds, the next validation fails since no pinned certificate matches the `pinnedCertificates`. -// // By fetching the `AFCertificateTrustChainForServerTrust(serverTrust)` *after* the `AFServerTrustIsValid(serverTrust)` validation, the complete chain is obtained and the Root CA's match. -// -// AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate]; -// -// // certification path 1 -// SecCertificateRef certificate = AFUTGoogleComGeoTrustGlobalCARootCertificate(); -// policy.pinnedCertificates = [NSSet setWithObject:(__bridge_transfer id)SecCertificateCopyData(certificate)]; -// -// XCTAssertTrue([policy evaluateServerTrust:AFUTGoogleComServerTrustPath1() forDomain:@"google.com"], @"Policy should allow server trust"); -// -// // certification path 2 -// certificate = AFUTGoogleComEquifaxSecureCARootCertificate(); -// policy.pinnedCertificates = [NSSet setWithObject:(__bridge_transfer id)SecCertificateCopyData(certificate)]; -// -// XCTAssertTrue([policy evaluateServerTrust:AFUTGoogleComServerTrustPath2() forDomain:@"google.com"], @"Policy should allow server trust"); -//} - #pragma mark Negative Server Trust Evaluation Tests - (void)testPolicyWithCertificatePinningAndNoPinnedCertificatesDoesNotAllowHTTPBinOrgServerTrust { @@ -494,11 +403,6 @@ - (void)testThatPolicyWithoutDomainNameValidationAllowsServerTrustWithInvalidDom XCTAssertTrue([policy evaluateServerTrust:AFUTHTTPBinOrgServerTrust() forDomain:@"invalid.org"], @"Policy should allow server trust because domain name validation is disabled"); } -- (void)testThatPolicyWithDomainNameValidationAllowsServerTrustWithValidWildcardDomainName { - AFSecurityPolicy *policy = [AFSecurityPolicy defaultPolicy]; - XCTAssertTrue([policy evaluateServerTrust:AFUTHTTPBinOrgServerTrust() forDomain:@"test.httpbin.org"], @"Policy should allow server trust"); -} - - (void)testThatPolicyWithDomainNameValidationAndSelfSignedCommonNameCertificateAllowsServerTrust { AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey]; diff --git a/fastlane/.env.default b/fastlane/.env.default index 5c60977b28..63c5283fba 100644 --- a/fastlane/.env.default +++ b/fastlane/.env.default @@ -6,7 +6,6 @@ AF_CONFIGURATION=Release SCAN_WORKSPACE=$AF_WORKSPACE SCAN_SCHEME=$AF_IOS_FRAMEWORK_SCHEME -SCAN_DEVICE="iPhone 7" SCAN_SDK=$AF_IOS_SDK SCAN_OUTPUT_DIRECTORY=fastlane/test-output From 0ffb17d61932a1afacb39834a34ffe786301f5e1 Mon Sep 17 00:00:00 2001 From: skyline75489 Date: Fri, 14 Oct 2016 22:26:04 +0800 Subject: [PATCH 003/159] Add XMLParser/XMLDocument serializer tests --- AFNetworking.xcodeproj/project.pbxproj | 12 +++ AFNetworking/AFURLResponseSerialization.h | 2 +- .../AFXMLDocumentResponseSerializerTests.m | 101 ++++++++++++++++++ .../AFXMLParserResponseSerializerTests.m | 89 +++++++++++++++ 4 files changed, 203 insertions(+), 1 deletion(-) create mode 100644 Tests/Tests/AFXMLDocumentResponseSerializerTests.m create mode 100644 Tests/Tests/AFXMLParserResponseSerializerTests.m diff --git a/AFNetworking.xcodeproj/project.pbxproj b/AFNetworking.xcodeproj/project.pbxproj index 7feb916cde..32766284b7 100644 --- a/AFNetworking.xcodeproj/project.pbxproj +++ b/AFNetworking.xcodeproj/project.pbxproj @@ -173,6 +173,10 @@ 29D96E991BCC406B00F571A5 /* UIImageView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 299522931BBF13C700859F49 /* UIImageView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 29D96E9A1BCC406B00F571A5 /* UIProgressView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 299522961BBF13C700859F49 /* UIProgressView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 29F5EF031C47E64F008B976A /* AFUIWebViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 29F5EF021C47E64F008B976A /* AFUIWebViewTests.m */; }; + 2D4563901DB1179D00AE4812 /* AFXMLParserResponseSerializerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D45638F1DB1179D00AE4812 /* AFXMLParserResponseSerializerTests.m */; }; + 2D4563911DB117A200AE4812 /* AFXMLParserResponseSerializerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D45638F1DB1179D00AE4812 /* AFXMLParserResponseSerializerTests.m */; }; + 2D4563921DB117A200AE4812 /* AFXMLParserResponseSerializerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D45638F1DB1179D00AE4812 /* AFXMLParserResponseSerializerTests.m */; }; + 2D4563941DB11DDB00AE4812 /* AFXMLDocumentResponseSerializerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D4563931DB11DDB00AE4812 /* AFXMLDocumentResponseSerializerTests.m */; }; 5F4323BB1BF63741003B8749 /* Equifax_Secure_Certificate_Authority_Root.cer in Resources */ = {isa = PBXBuildFile; fileRef = 5F4323B31BF63741003B8749 /* Equifax_Secure_Certificate_Authority_Root.cer */; }; 5F4323BC1BF63741003B8749 /* Equifax_Secure_Certificate_Authority_Root.cer in Resources */ = {isa = PBXBuildFile; fileRef = 5F4323B31BF63741003B8749 /* Equifax_Secure_Certificate_Authority_Root.cer */; }; 5F4323BD1BF63741003B8749 /* Equifax_Secure_Certificate_Authority_Root.cer in Resources */ = {isa = PBXBuildFile; fileRef = 5F4323B31BF63741003B8749 /* Equifax_Secure_Certificate_Authority_Root.cer */; }; @@ -297,6 +301,8 @@ 2995229B1BBF13C700859F49 /* UIWebView+AFNetworking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIWebView+AFNetworking.m"; sourceTree = ""; }; 29D3413E1C20D46400A7D266 /* AFCompoundResponseSerializerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFCompoundResponseSerializerTests.m; sourceTree = ""; }; 29F5EF021C47E64F008B976A /* AFUIWebViewTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFUIWebViewTests.m; sourceTree = ""; }; + 2D45638F1DB1179D00AE4812 /* AFXMLParserResponseSerializerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFXMLParserResponseSerializerTests.m; sourceTree = ""; }; + 2D4563931DB11DDB00AE4812 /* AFXMLDocumentResponseSerializerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFXMLDocumentResponseSerializerTests.m; sourceTree = ""; }; 5F4323B31BF63741003B8749 /* Equifax_Secure_Certificate_Authority_Root.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = Equifax_Secure_Certificate_Authority_Root.cer; sourceTree = ""; }; 5F4323B41BF63741003B8749 /* GeoTrust_Global_CA-cross.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = "GeoTrust_Global_CA-cross.cer"; sourceTree = ""; }; 5F4323B51BF63741003B8749 /* google.com.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = google.com.cer; sourceTree = ""; }; @@ -434,6 +440,8 @@ 298D7C821BC2C88F00FD3B3E /* AFHTTPResponseSerializationTests.m */, 298D7C831BC2C88F00FD3B3E /* AFHTTPSessionManagerTests.m */, 298D7C851BC2C88F00FD3B3E /* AFJSONSerializationTests.m */, + 2D45638F1DB1179D00AE4812 /* AFXMLParserResponseSerializerTests.m */, + 2D4563931DB11DDB00AE4812 /* AFXMLDocumentResponseSerializerTests.m */, 298D7C881BC2C88F00FD3B3E /* AFPropertyListResponseSerializerTests.m */, E91164641DA6A7AE00DFFF56 /* AFPropertyListRequestSerializerTests.m */, 29D3413E1C20D46400A7D266 /* AFCompoundResponseSerializerTests.m */, @@ -967,6 +975,7 @@ 2987B0CF1BC40A7600179A4C /* AFPropertyListResponseSerializerTests.m in Sources */, 2987B0D21BC40AD800179A4C /* AFTestCase.m in Sources */, 2987B0CD1BC40A7600179A4C /* AFJSONSerializationTests.m in Sources */, + 2D4563921DB117A200AE4812 /* AFXMLParserResponseSerializerTests.m in Sources */, E91164671DA6A7AE00DFFF56 /* AFPropertyListRequestSerializerTests.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -992,6 +1001,7 @@ 298D7C981BC2CA2500FD3B3E /* AFURLSessionManagerTests.m in Sources */, 297824AC1BC2DB450041C395 /* AFImageDownloaderTests.m in Sources */, 29F5EF031C47E64F008B976A /* AFUIWebViewTests.m in Sources */, + 2D4563901DB1179D00AE4812 /* AFXMLParserResponseSerializerTests.m in Sources */, 298D7CD51BC2CAEC00FD3B3E /* AFHTTPSessionManagerTests.m in Sources */, 298D7CD71BC2CAEF00FD3B3E /* AFJSONSerializationTests.m in Sources */, 298D7CDB1BC2CAF500FD3B3E /* AFPropertyListResponseSerializerTests.m in Sources */, @@ -1010,8 +1020,10 @@ 1BF9F9611C87843200F1F35A /* AFImageResponseSerializerTests.m in Sources */, 298D7C971BC2C94500FD3B3E /* AFTestCase.m in Sources */, 298D7CD81BC2CAF000FD3B3E /* AFJSONSerializationTests.m in Sources */, + 2D4563941DB11DDB00AE4812 /* AFXMLDocumentResponseSerializerTests.m in Sources */, 298D7CDC1BC2CAF500FD3B3E /* AFPropertyListResponseSerializerTests.m in Sources */, 298D7CD61BC2CAED00FD3B3E /* AFHTTPSessionManagerTests.m in Sources */, + 2D4563911DB117A200AE4812 /* AFXMLParserResponseSerializerTests.m in Sources */, 298D7CDA1BC2CAF300FD3B3E /* AFNetworkReachabilityManagerTests.m in Sources */, 298D7C991BC2CA2600FD3B3E /* AFURLSessionManagerTests.m in Sources */, ); diff --git a/AFNetworking/AFURLResponseSerialization.h b/AFNetworking/AFURLResponseSerialization.h index 0f6d462b7c..fca835be37 100644 --- a/AFNetworking/AFURLResponseSerialization.h +++ b/AFNetworking/AFURLResponseSerialization.h @@ -163,7 +163,7 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)init; /** - Input and output options specifically intended for `NSXMLDocument` objects. For possible values, see the `NSJSONSerialization` documentation section "NSJSONReadingOptions". `0` by default. + Input and output options specifically intended for `NSXMLDocument` objects. For possible values, see the `NSXMLDocument` documentation section "Input and Output Options". `0` by default. */ @property (nonatomic, assign) NSUInteger options; diff --git a/Tests/Tests/AFXMLDocumentResponseSerializerTests.m b/Tests/Tests/AFXMLDocumentResponseSerializerTests.m new file mode 100644 index 0000000000..6108d52743 --- /dev/null +++ b/Tests/Tests/AFXMLDocumentResponseSerializerTests.m @@ -0,0 +1,101 @@ +// AFXMLDocumentResponseSerializerTests.m +// Copyright (c) 2011–2016 Alamofire Software Foundation ( http://alamofire.org/ ) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "AFTestCase.h" + +#import "AFURLRequestSerialization.h" +#import "AFURLResponseSerialization.h" + +#import + +static NSData * AFXMLTestData() { + return [@"someValue" dataUsingEncoding:NSUTF8StringEncoding]; +} + +#pragma mark - + +@interface AFXMLDocumentResponseSerializerTests : AFTestCase +@property (nonatomic, strong) AFXMLDocumentResponseSerializer *responseSerializer; +@end + +#pragma mark - + +@implementation AFXMLDocumentResponseSerializerTests + +- (void)setUp { + [super setUp]; + self.responseSerializer = [AFXMLDocumentResponseSerializer serializer]; +} + +- (void)testThatXMLDocumentResponseSerializerAccpetsApplicationXMLMimeType { + NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:self.baseURL statusCode:200 HTTPVersion:@"1.1" headerFields:@{@"Content-Type": @"application/xml"}]; + NSError *error = nil; + [self.responseSerializer validateResponse:response data:AFXMLTestData() error:&error]; + + XCTAssertNil(error, @"Error handling application/xml"); +} + +- (void)testThatXMLDocumentResponseSerializerAccpetsTextXMLMimeType { + NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:self.baseURL statusCode:200 HTTPVersion:@"1.1" headerFields:@{@"Content-Type": @"text/xml"}]; + NSError *error = nil; + [self.responseSerializer validateResponse:response data:AFXMLTestData() error:&error]; + + XCTAssertNil(error, @"Error handling text/xml"); +} + +- (void)testThatXMLDocumentResponseSerializerDoesNotAcceptNonStandardXMLMimeType { + NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:self.baseURL statusCode:200 HTTPVersion:@"1.1" headerFields:@{@"Content-Type": @"nonstandard/xml"}]; + NSError *error = nil; + [self.responseSerializer validateResponse:response data:AFXMLTestData() error:&error]; + + XCTAssertNotNil(error, @"Error should have been thrown for nonstandard/xml"); +} + +- (void)testThatXMLDocumentResponseSerializerReturnsNSXMLDocumentObjectForValidXML { + NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:self.baseURL statusCode:200 HTTPVersion:@"1.1" headerFields:@{@"Content-Type": @"application/xml"}]; + NSError *error = nil; + id responseObject = [self.responseSerializer responseObjectForResponse:response data:AFXMLTestData() error:&error]; + + XCTAssertNil(error, @"Serialization error should be nil"); + XCTAssert([responseObject isKindOfClass:[NSXMLDocument class]], @"Expected response to be a NSXMLDocument"); +} + +- (void)testThatXMLDocumentResponseSerializerReturnsErrorForInvalidXML { + NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:self.baseURL statusCode:200 HTTPVersion:@"1.1" headerFields:@{@"Content-Type": @"application/xml"}]; + NSError *error = nil; + [self.responseSerializer responseObjectForResponse:response data:[@"someValue" dataUsingEncoding:NSUTF8StringEncoding]; +} + +#pragma mark - + +@interface AFXMLParserResponseSerializerTests : AFTestCase +@property (nonatomic, strong) AFXMLParserResponseSerializer *responseSerializer; +@end + +#pragma mark - + +@implementation AFXMLParserResponseSerializerTests + +- (void)setUp { + [super setUp]; + self.responseSerializer = [AFXMLParserResponseSerializer serializer]; +} + +- (void)testThatXMLParserResponseSerializerAccpetsApplicationXMLMimeType { + NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:self.baseURL statusCode:200 HTTPVersion:@"1.1" headerFields:@{@"Content-Type": @"application/xml"}]; + NSError *error = nil; + [self.responseSerializer validateResponse:response data:AFXMLTestData() error:&error]; + + XCTAssertNil(error, @"Error handling application/xml"); +} + +- (void)testThatXMLParserResponseSerializerAccpetsTextXMLMimeType { + NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:self.baseURL statusCode:200 HTTPVersion:@"1.1" headerFields:@{@"Content-Type": @"text/xml"}]; + NSError *error = nil; + [self.responseSerializer validateResponse:response data:AFXMLTestData() error:&error]; + + XCTAssertNil(error, @"Error handling text/xml"); +} + +- (void)testThatXMLParserResponseSerializerDoesNotAcceptNonStandardXMLMimeType { + NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:self.baseURL statusCode:200 HTTPVersion:@"1.1" headerFields:@{@"Content-Type": @"nonstandard/xml"}]; + NSError *error = nil; + [self.responseSerializer validateResponse:response data:AFXMLTestData() error:&error]; + + XCTAssertNotNil(error, @"Error should have been thrown for nonstandard/xml"); +} + +- (void)testThatXMLParserResponseSerializerReturnsNSXMLParserObjectForValidXML { + NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:self.baseURL statusCode:200 HTTPVersion:@"1.1" headerFields:@{@"Content-Type": @"application/xml"}]; + NSError *error = nil; + id responseObject = [self.responseSerializer responseObjectForResponse:response data:AFXMLTestData() error:&error]; + + XCTAssertNil(error, @"Serialization error should be nil"); + XCTAssert([responseObject isKindOfClass:[NSXMLParser class]], @"Expected response to be a NSXMLParser"); +} + +- (void)testThatXMLParserResponseSerializerCanBeCopied { + [self.responseSerializer setAcceptableStatusCodes:[NSIndexSet indexSetWithIndex:100]]; + [self.responseSerializer setAcceptableContentTypes:[NSSet setWithObject:@"test/type"]]; + + AFXMLParserResponseSerializer *copiedSerializer = [self.responseSerializer copy]; + XCTAssertNotEqual(copiedSerializer, self.responseSerializer); + XCTAssertEqual(copiedSerializer.acceptableStatusCodes, self.responseSerializer.acceptableStatusCodes); + XCTAssertEqual(copiedSerializer.acceptableContentTypes, self.responseSerializer.acceptableContentTypes); +} + +@end From 0840d05555745007ccc688bc032014bac0bac82a Mon Sep 17 00:00:00 2001 From: skyline75489 Date: Fri, 14 Oct 2016 22:33:03 +0800 Subject: [PATCH 004/159] Fix some typo --- Tests/Tests/AFXMLDocumentResponseSerializerTests.m | 6 +++--- Tests/Tests/AFXMLParserResponseSerializerTests.m | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Tests/Tests/AFXMLDocumentResponseSerializerTests.m b/Tests/Tests/AFXMLDocumentResponseSerializerTests.m index 6108d52743..4f9af2d435 100644 --- a/Tests/Tests/AFXMLDocumentResponseSerializerTests.m +++ b/Tests/Tests/AFXMLDocumentResponseSerializerTests.m @@ -45,7 +45,7 @@ - (void)setUp { self.responseSerializer = [AFXMLDocumentResponseSerializer serializer]; } -- (void)testThatXMLDocumentResponseSerializerAccpetsApplicationXMLMimeType { +- (void)testThatXMLDocumentResponseSerializerAcceptsApplicationXMLMimeType { NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:self.baseURL statusCode:200 HTTPVersion:@"1.1" headerFields:@{@"Content-Type": @"application/xml"}]; NSError *error = nil; [self.responseSerializer validateResponse:response data:AFXMLTestData() error:&error]; @@ -53,7 +53,7 @@ - (void)testThatXMLDocumentResponseSerializerAccpetsApplicationXMLMimeType { XCTAssertNil(error, @"Error handling application/xml"); } -- (void)testThatXMLDocumentResponseSerializerAccpetsTextXMLMimeType { +- (void)testThatXMLDocumentResponseSerializerAcceptsTextXMLMimeType { NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:self.baseURL statusCode:200 HTTPVersion:@"1.1" headerFields:@{@"Content-Type": @"text/xml"}]; NSError *error = nil; [self.responseSerializer validateResponse:response data:AFXMLTestData() error:&error]; @@ -61,7 +61,7 @@ - (void)testThatXMLDocumentResponseSerializerAccpetsTextXMLMimeType { XCTAssertNil(error, @"Error handling text/xml"); } -- (void)testThatXMLDocumentResponseSerializerDoesNotAcceptNonStandardXMLMimeType { +- (void)testThatXMLDocumentResponseSerializerDoesNotAcceptsNonStandardXMLMimeType { NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:self.baseURL statusCode:200 HTTPVersion:@"1.1" headerFields:@{@"Content-Type": @"nonstandard/xml"}]; NSError *error = nil; [self.responseSerializer validateResponse:response data:AFXMLTestData() error:&error]; diff --git a/Tests/Tests/AFXMLParserResponseSerializerTests.m b/Tests/Tests/AFXMLParserResponseSerializerTests.m index 2596c8bf23..09f85c774a 100644 --- a/Tests/Tests/AFXMLParserResponseSerializerTests.m +++ b/Tests/Tests/AFXMLParserResponseSerializerTests.m @@ -43,7 +43,7 @@ - (void)setUp { self.responseSerializer = [AFXMLParserResponseSerializer serializer]; } -- (void)testThatXMLParserResponseSerializerAccpetsApplicationXMLMimeType { +- (void)testThatXMLParserResponseSerializerAcceptsApplicationXMLMimeType { NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:self.baseURL statusCode:200 HTTPVersion:@"1.1" headerFields:@{@"Content-Type": @"application/xml"}]; NSError *error = nil; [self.responseSerializer validateResponse:response data:AFXMLTestData() error:&error]; @@ -51,7 +51,7 @@ - (void)testThatXMLParserResponseSerializerAccpetsApplicationXMLMimeType { XCTAssertNil(error, @"Error handling application/xml"); } -- (void)testThatXMLParserResponseSerializerAccpetsTextXMLMimeType { +- (void)testThatXMLParserResponseSerializerAcceptsTextXMLMimeType { NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:self.baseURL statusCode:200 HTTPVersion:@"1.1" headerFields:@{@"Content-Type": @"text/xml"}]; NSError *error = nil; [self.responseSerializer validateResponse:response data:AFXMLTestData() error:&error]; @@ -59,7 +59,7 @@ - (void)testThatXMLParserResponseSerializerAccpetsTextXMLMimeType { XCTAssertNil(error, @"Error handling text/xml"); } -- (void)testThatXMLParserResponseSerializerDoesNotAcceptNonStandardXMLMimeType { +- (void)testThatXMLParserResponseSerializerDoesNotAcceptsNonStandardXMLMimeType { NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:self.baseURL statusCode:200 HTTPVersion:@"1.1" headerFields:@{@"Content-Type": @"nonstandard/xml"}]; NSError *error = nil; [self.responseSerializer validateResponse:response data:AFXMLTestData() error:&error]; From 158dc56d301df6b9e221cf73e157d1abc90564b0 Mon Sep 17 00:00:00 2001 From: skyline75489 Date: Fri, 14 Oct 2016 22:49:21 +0800 Subject: [PATCH 005/159] Fix a failure description --- Tests/Tests/AFXMLDocumentResponseSerializerTests.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Tests/AFXMLDocumentResponseSerializerTests.m b/Tests/Tests/AFXMLDocumentResponseSerializerTests.m index 4f9af2d435..0682943982 100644 --- a/Tests/Tests/AFXMLDocumentResponseSerializerTests.m +++ b/Tests/Tests/AFXMLDocumentResponseSerializerTests.m @@ -83,7 +83,7 @@ - (void)testThatXMLDocumentResponseSerializerReturnsErrorForInvalidXML { NSError *error = nil; [self.responseSerializer responseObjectForResponse:response data:[@" Date: Thu, 13 Jul 2017 15:06:12 -0400 Subject: [PATCH 006/159] Fix CHANGELOG formatting (#3915) --- CHANGELOG.md | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fa18294b1f..f9ac60c34f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -173,7 +173,7 @@ For detailed information about migrating to AFNetworking 3.0.0, please reference * Implemented by Kevin Harwood in [#3034](https://github.com/AFNetworking/AFNetworking/pull/3034). -##[2.6.3](https://github.com/AFNetworking/AFNetworking/releases/tag/2.6.3) (11/11/2015) +## [2.6.3](https://github.com/AFNetworking/AFNetworking/releases/tag/2.6.3) (11/11/2015) Released on Wednesday, November 11, 2015. All issues associated with this milestone can be found using this [filter](https://github.com/AFNetworking/AFNetworking/issues?q=milestone%3A2.6.3+is%3Aclosed). #### Fixed @@ -183,7 +183,7 @@ Released on Wednesday, November 11, 2015. All issues associated with this milest * Fixed by [jcayzac](https://github.com/jcayzac) in [#3139](https://github.com/AFNetworking/AFNetworking/pull/3139). -##[2.6.2](https://github.com/AFNetworking/AFNetworking/releases/tag/2.6.2) (11/06/2015) +## [2.6.2](https://github.com/AFNetworking/AFNetworking/releases/tag/2.6.2) (11/06/2015) Released on Friday, November 06, 2015. All issues associated with this milestone can be found using this [filter](https://github.com/AFNetworking/AFNetworking/issues?q=milestone%3A2.6.2+is%3Aclosed). ### Important Upgrade Note for Swift @@ -225,10 +225,10 @@ Released on Friday, November 06, 2015. All issues associated with this milestone ## [2.6.1](https://github.com/AFNetworking/AFNetworking/releases/tag/2.6.1) (10-13-2015) Released on Tuesday, October 13th, 2015. All issues associated with this milestone can be found using this [filter](https://github.com/AFNetworking/AFNetworking/issues?q=milestone%3A2.6.1+is%3Aclosed). -###Future Compatibility Note +### Future Compatibility Note Note that AFNetworking 3.0 will soon be released, and will drop support for all `NSURLConnection` based API's (`AFHTTPRequestOperationManager`, `AFHTTPRequestOperation`, and `AFURLConnectionOperation`. If you have not already migrated to `NSURLSession` based API's, please do so soon. For more information, please see the [3.0 migration guide](https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-3.0-Migration-Guide). -####Fixed +#### Fixed * Fixed a bug that prevented empty x-www-form-urlencoded bodies. * Fixed by [Julien Cayzac](https://github.com/jcayzac) in [#2868](https://github.com/AFNetworking/AFNetworking/pull/2868). * Fixed bug that prevented AFNetworking from being installed for watchOS via Cocoapods. @@ -253,7 +253,7 @@ Note that AFNetworking 3.0 will soon be released, and will drop support for all ## [2.6.0](https://github.com/AFNetworking/AFNetworking/releases/tag/2.6.0) (08-19-2015) Released on Wednesday, August 19th, 2015. All issues associated with this milestone can be found using this [filter](https://github.com/AFNetworking/AFNetworking/issues?q=milestone%3A2.6.0+is%3Aclosed). -###Important Upgrade Notes +### Important Upgrade Notes Please note the following API/project changes have been made: * iOS 6 and OS X 10.8 support has been dropped from the project to facilitate support for watchOS 2. The final release supporting iOS 6 and OS X 10.8 is 2.5.4. @@ -280,7 +280,7 @@ Please note the following API/project changes have been made: **Note** that support for `NSURLConnection` based API's will be removed in a future update. If you have not already done so, it is recommended that you transition to the `NSURLSession` APIs in the very near future. -####Added +#### Added * Added watchOS 2.0 support. `AFNetworking` can now be added to watchOS targets using CocoaPods. * Added by [Kevin Harwood](https://github.com/Kevin Harwood) in [#2837](https://github.com/AFNetworking/AFNetworking/issues/2837). * Added nullability annotations to all of the header files to improve Swift interoperability. @@ -290,7 +290,7 @@ Please note the following API/project changes have been made: * Improved memory performance when download large objects. * Fixed by [Gabe Zabrino](https://github.com/gfzabarino) and [Kevin Harwood](https://github.com/Kevin Harwood) in [#2672](https://github.com/AFNetworking/AFNetworking/pull/2672). -####Fixed +#### Fixed * Fixed a crash related for objects that observe notifications but don't properly unregister. * Fixed by [Kevin Harwood](https://github.com/Kevin Harwood) and [bnickle](https://github.com/bnickel) in [#2741](https://github.com/AFNetworking/AFNetworking/pull/2741). * Fixed a race condition crash that occured with `AFImageResponseSerialization`. @@ -306,7 +306,7 @@ Please note the following API/project changes have been made: * Fixed potential memory leak in `AFNetworkReachabilityManager`. * Fixed by [Julien Cayzac](https://github.com/jcayzac) in [#2867](https://github.com/AFNetworking/AFNetworking/pull/2867). -####Documentation Improvements +#### Documentation Improvements * Clarified best practices for Reachability per Apple recommendations. * Fixed by [Steven Fisher](https://github.com/tewha) in [#2704](https://github.com/AFNetworking/AFNetworking/pull/2704). * Added `startMonitoring` call to the Reachability section of the README @@ -319,11 +319,11 @@ Please note the following API/project changes have been made: ## [2.5.4](https://github.com/AFNetworking/AFNetworking/releases/tag/2.5.4) (2015-05-14) Released on 2015-05-14. All issues associated with this milestone can be found using this [filter](https://github.com/AFNetworking/AFNetworking/issues?q=milestone%3A2.5.4+is%3Aclosed). -####Updated +#### Updated * Updated the CI test script to run iOS tests on all versions of iOS that are installed on the build machine. * Updated by [Kevin Harwood](https://github.com/Kevin Harwood) in [#2716](https://github.com/AFNetworking/AFNetworking/pull/2716). -####Fixed +#### Fixed * Fixed an issue where `AFNSURLSessionTaskDidResumeNotification` and `AFNSURLSessionTaskDidSuspendNotification` were not being properly called due to implementation differences in `NSURLSessionTask` in iOS 7 and iOS 8, which also affects the `AFNetworkActivityIndicatorManager`. * Fixed by [Kevin Harwood](https://github.com/Kevin Harwood) in [#2702](https://github.com/AFNetworking/AFNetworking/pull/2702). @@ -1065,7 +1065,7 @@ calls (Mindaugas Vaičiūnas) * Update files to remove executable privilege (Kyle Fuller) -## 2.0.1 (2013-10-10) +## [2.0.1](https://github.com/AFNetworking/AFNetworking/releases/tag/2.0.1) (2013-10-10) * Fix iOS 6 compatibility (Matt Baker, Mattt Thompson) @@ -1769,7 +1769,7 @@ Steven Fisher) renamed to `numberOfFinishedOperations` (Mattt Thompson) -## 0.10.0 / 2012-06-26 +## [0.10.0](https://github.com/AFNetworking/AFNetworking/releases/tag/0.10.0) / 2012-06-26 * Add Twitter Mac Example application (Mattt Thompson) @@ -1834,7 +1834,7 @@ renamed to `numberOfFinishedOperations` (Mattt Thompson) * Fix AFHTTPClient to not add unnecessary data when constructing multipart form request with nil parameters (Taeho Kim) -## 1.0RC1 / 2012-04-25 +## [1.0RC1](https://github.com/AFNetworking/AFNetworking/releases/tag/1.0RC1) / 2012-04-25 * Add `AFHTTPRequestOperation +addAcceptableStatusCodes / +addAcceptableContentTypes` to dynamically add acceptable status codes and @@ -1854,7 +1854,7 @@ Mattt Thompson) distinction between WWan and WiFi reachability (Kevin Harwood, Mattt Thompson) -## 0.9.2 / 2012-04-25 +## [0.9.2](https://github.com/AFNetworking/AFNetworking/releases/tag/0.9.2) / 2012-04-25 * Add thread safety to `AFNetworkActivityIndicator` (Peter Steinberger, Mattt Thompson) @@ -1899,7 +1899,7 @@ Mattt Thompson) * Remove @try-@catch block wrapping network thread entry point (Charles T. Ahn) -## 0.9.1 / 2012-03-19 +## [0.9.1](https://github.com/AFNetworking/AFNetworking/releases/tag/0.9.1) / 2012-03-19 * Create Twitter example application (Mattt Thompson) @@ -1957,7 +1957,7 @@ where % is used as a literal rather than as part of a percent escape code `AFImageRequestOperation` (Michael Schneider) -## 0.9.0 / 2012-01-23 +## [0.9.0](https://github.com/AFNetworking/AFNetworking/releases/tag/0.9.0) / 2012-01-23 * Add thread-safe behavior to `AFURLConnectionOperation` (Mattt Thompson) From c18c09a75c46755d111f27594b2d98d5e520bc0b Mon Sep 17 00:00:00 2001 From: leehonghwa Date: Wed, 19 Jul 2017 14:29:27 +0900 Subject: [PATCH 007/159] fix space used in Objective-C method (coding style) --- UIKit+AFNetworking/AFAutoPurgingImageCache.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UIKit+AFNetworking/AFAutoPurgingImageCache.m b/UIKit+AFNetworking/AFAutoPurgingImageCache.m index 1f40715c37..b147aacc24 100644 --- a/UIKit+AFNetworking/AFAutoPurgingImageCache.m +++ b/UIKit+AFNetworking/AFAutoPurgingImageCache.m @@ -37,7 +37,7 @@ @interface AFCachedImage : NSObject @implementation AFCachedImage --(instancetype)initWithImage:(UIImage *)image identifier:(NSString *)identifier { +- (instancetype)initWithImage:(UIImage *)image identifier:(NSString *)identifier { if (self = [self init]) { self.image = image; self.identifier = identifier; From 27c819537a664cfcaadd62f9f0c37a5325e6cb4c Mon Sep 17 00:00:00 2001 From: leehonghwa Date: Wed, 19 Jul 2017 15:08:26 +0900 Subject: [PATCH 008/159] Fix asterisk location in method declaration --- Tests/Tests/AFURLSessionManagerTests.m | 2 +- UIKit+AFNetworking/AFAutoPurgingImageCache.m | 2 +- UIKit+AFNetworking/AFImageDownloader.m | 14 +++++++------- UIKit+AFNetworking/UIImage+AFNetworking.h | 2 +- UIKit+AFNetworking/UIWebView+AFNetworking.m | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Tests/Tests/AFURLSessionManagerTests.m b/Tests/Tests/AFURLSessionManagerTests.m index 0dfd58716c..d8cbf5d096 100644 --- a/Tests/Tests/AFURLSessionManagerTests.m +++ b/Tests/Tests/AFURLSessionManagerTests.m @@ -459,7 +459,7 @@ - (NSURLRequest *)_delayURLRequest { return [NSURLRequest requestWithURL:self.delayURL]; } -- (IMP)_implementationForTask:(NSURLSessionTask *)task selector:(SEL)selector { +- (IMP)_implementationForTask:(NSURLSessionTask *)task selector:(SEL)selector { return [self _implementationForClass:[task class] selector:selector]; } diff --git a/UIKit+AFNetworking/AFAutoPurgingImageCache.m b/UIKit+AFNetworking/AFAutoPurgingImageCache.m index b147aacc24..a4ddd47577 100644 --- a/UIKit+AFNetworking/AFAutoPurgingImageCache.m +++ b/UIKit+AFNetworking/AFAutoPurgingImageCache.m @@ -51,7 +51,7 @@ - (instancetype)initWithImage:(UIImage *)image identifier:(NSString *)identifier return self; } -- (UIImage*)accessImage { +- (UIImage *)accessImage { self.lastAccessDate = [NSDate date]; return self.image; } diff --git a/UIKit+AFNetworking/AFImageDownloader.m b/UIKit+AFNetworking/AFImageDownloader.m index 5bb28ef13e..e0df803432 100644 --- a/UIKit+AFNetworking/AFImageDownloader.m +++ b/UIKit+AFNetworking/AFImageDownloader.m @@ -28,8 +28,8 @@ @interface AFImageDownloaderResponseHandler : NSObject @property (nonatomic, strong) NSUUID *uuid; -@property (nonatomic, copy) void (^successBlock)(NSURLRequest*, NSHTTPURLResponse*, UIImage*); -@property (nonatomic, copy) void (^failureBlock)(NSURLRequest*, NSHTTPURLResponse*, NSError*); +@property (nonatomic, copy) void (^successBlock)(NSURLRequest *, NSHTTPURLResponse *, UIImage *); +@property (nonatomic, copy) void (^failureBlock)(NSURLRequest *, NSHTTPURLResponse *, NSError *); @end @implementation AFImageDownloaderResponseHandler @@ -71,11 +71,11 @@ - (instancetype)initWithURLIdentifier:(NSString *)URLIdentifier identifier:(NSUU return self; } -- (void)addResponseHandler:(AFImageDownloaderResponseHandler*)handler { +- (void)addResponseHandler:(AFImageDownloaderResponseHandler *)handler { [self.responseHandlers addObject:handler]; } -- (void)removeResponseHandler:(AFImageDownloaderResponseHandler*)handler { +- (void)removeResponseHandler:(AFImageDownloaderResponseHandler *)handler { [self.responseHandlers removeObject:handler]; } @@ -257,7 +257,7 @@ - (nullable AFImageDownloadReceipt *)downloadImageForURLRequest:(NSURLRequest *) for (AFImageDownloaderResponseHandler *handler in mergedTask.responseHandlers) { if (handler.failureBlock) { dispatch_async(dispatch_get_main_queue(), ^{ - handler.failureBlock(request, (NSHTTPURLResponse*)response, error); + handler.failureBlock(request, (NSHTTPURLResponse *)response, error); }); } } @@ -267,7 +267,7 @@ - (nullable AFImageDownloadReceipt *)downloadImageForURLRequest:(NSURLRequest *) for (AFImageDownloaderResponseHandler *handler in mergedTask.responseHandlers) { if (handler.successBlock) { dispatch_async(dispatch_get_main_queue(), ^{ - handler.successBlock(request, (NSHTTPURLResponse*)response, responseObject); + handler.successBlock(request, (NSHTTPURLResponse *)response, responseObject); }); } } @@ -334,7 +334,7 @@ - (void)cancelTaskForImageDownloadReceipt:(AFImageDownloadReceipt *)imageDownloa }); } -- (AFImageDownloaderMergedTask*)safelyRemoveMergedTaskWithURLIdentifier:(NSString *)URLIdentifier { +- (AFImageDownloaderMergedTask *)safelyRemoveMergedTaskWithURLIdentifier:(NSString *)URLIdentifier { __block AFImageDownloaderMergedTask *mergedTask = nil; dispatch_sync(self.synchronizationQueue, ^{ mergedTask = [self removeMergedTaskWithURLIdentifier:URLIdentifier]; diff --git a/UIKit+AFNetworking/UIImage+AFNetworking.h b/UIKit+AFNetworking/UIImage+AFNetworking.h index 14744cddd5..c5de1a44cd 100644 --- a/UIKit+AFNetworking/UIImage+AFNetworking.h +++ b/UIKit+AFNetworking/UIImage+AFNetworking.h @@ -28,7 +28,7 @@ @interface UIImage (AFNetworking) -+ (UIImage*) safeImageWithData:(NSData*)data; ++ (UIImage *)safeImageWithData:(NSData *)data; @end diff --git a/UIKit+AFNetworking/UIWebView+AFNetworking.m b/UIKit+AFNetworking/UIWebView+AFNetworking.m index 030c3e9453..b760314f57 100644 --- a/UIKit+AFNetworking/UIWebView+AFNetworking.m +++ b/UIKit+AFNetworking/UIWebView+AFNetworking.m @@ -49,7 +49,7 @@ - (void)af_setURLSessionTask:(NSURLSessionDataTask *)af_URLSessionTask { @implementation UIWebView (AFNetworking) -- (AFHTTPSessionManager *)sessionManager { +- (AFHTTPSessionManager *)sessionManager { static AFHTTPSessionManager *_af_defaultHTTPSessionManager = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ From dd59ffa188f2685a3e8aa4ef096511652aebbb7e Mon Sep 17 00:00:00 2001 From: Dominik Gruber Date: Sat, 22 Jul 2017 16:01:50 -0700 Subject: [PATCH 009/159] Allow return value of HTTP redirection block to be NULL (#3975) * Allow return value of HTTP redirection block to be NULL * Make tests pass again (#3993) * Make tests pass again * Fix macOS builds in Fastlane. --- AFNetworking/AFURLSessionManager.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AFNetworking/AFURLSessionManager.h b/AFNetworking/AFURLSessionManager.h index 3824736a78..d2b28ce633 100644 --- a/AFNetworking/AFURLSessionManager.h +++ b/AFNetworking/AFURLSessionManager.h @@ -354,7 +354,7 @@ NS_ASSUME_NONNULL_BEGIN @param block A block object to be executed when an HTTP request is attempting to perform a redirection to a different URL. The block returns the request to be made for the redirection, and takes four arguments: the session, the task, the redirection response, and the request corresponding to the redirection response. */ -- (void)setTaskWillPerformHTTPRedirectionBlock:(nullable NSURLRequest * (^)(NSURLSession *session, NSURLSessionTask *task, NSURLResponse *response, NSURLRequest *request))block; +- (void)setTaskWillPerformHTTPRedirectionBlock:(nullable NSURLRequest * _Nullable (^)(NSURLSession *session, NSURLSessionTask *task, NSURLResponse *response, NSURLRequest *request))block; /** Sets a block to be executed when a session task has received a request specific authentication challenge, as handled by the `NSURLSessionTaskDelegate` method `URLSession:task:didReceiveChallenge:completionHandler:`. From 41897b19c6fb8b95944909f414a57323371508a3 Mon Sep 17 00:00:00 2001 From: Henddher Pedroza Date: Wed, 26 Jul 2017 18:10:07 -0500 Subject: [PATCH 010/159] Ability to set the defaultURLCache --- UIKit+AFNetworking/AFImageDownloader.h | 5 +++++ UIKit+AFNetworking/AFImageDownloader.m | 11 +++++++++++ 2 files changed, 16 insertions(+) diff --git a/UIKit+AFNetworking/AFImageDownloader.h b/UIKit+AFNetworking/AFImageDownloader.h index 3903eec239..51339db079 100644 --- a/UIKit+AFNetworking/AFImageDownloader.h +++ b/UIKit+AFNetworking/AFImageDownloader.h @@ -81,6 +81,11 @@ typedef NS_ENUM(NSInteger, AFImageDownloadPrioritization) { */ + (NSURLCache *)defaultURLCache; +/** + Sets the default `NSURLCache` + */ ++ (void) setDefaultURLCache:(NSURLCache *)defaultCache; + /** Default initializer diff --git a/UIKit+AFNetworking/AFImageDownloader.m b/UIKit+AFNetworking/AFImageDownloader.m index 5bb28ef13e..eef0da2605 100644 --- a/UIKit+AFNetworking/AFImageDownloader.m +++ b/UIKit+AFNetworking/AFImageDownloader.m @@ -106,10 +106,16 @@ @interface AFImageDownloader () @end +static NSURLCache* _defaultURLCache = nil; @implementation AFImageDownloader + (NSURLCache *)defaultURLCache { + + if (_defaultURLCache) { + return _defaultURLCache; + } + // It's been discovered that a crash will occur on certain versions // of iOS if you customize the cache. // @@ -125,6 +131,11 @@ + (NSURLCache *)defaultURLCache { diskPath:@"com.alamofire.imagedownloader"]; } ++ (void)setDefaultURLCache:(NSURLCache *)defaultCache { + + _defaultURLCache = defaultCache; +} + + (NSURLSessionConfiguration *)defaultURLSessionConfiguration { NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; From 8db67cdfa903a5c51ef6703ee90bf43fc1f032f2 Mon Sep 17 00:00:00 2001 From: Henddher Pedroza Date: Fri, 28 Jul 2017 08:45:02 -0500 Subject: [PATCH 011/159] Allow initialization of AFImageDownloader using custom NSURLSessionConfiguration. --- UIKit+AFNetworking/AFImageDownloader.h | 14 ++++++++++++++ UIKit+AFNetworking/AFImageDownloader.m | 6 +++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/UIKit+AFNetworking/AFImageDownloader.h b/UIKit+AFNetworking/AFImageDownloader.h index 51339db079..b1dc85bb06 100644 --- a/UIKit+AFNetworking/AFImageDownloader.h +++ b/UIKit+AFNetworking/AFImageDownloader.h @@ -86,6 +86,11 @@ typedef NS_ENUM(NSInteger, AFImageDownloadPrioritization) { */ + (void) setDefaultURLCache:(NSURLCache *)defaultCache; +/** + The default `NSURLSessionConfiguration` with common usage parameter values. + */ ++ (NSURLSessionConfiguration *)defaultURLSessionConfiguration; + /** Default initializer @@ -93,6 +98,15 @@ typedef NS_ENUM(NSInteger, AFImageDownloadPrioritization) { */ - (instancetype)init; +/** + Initializer with specific `URLSessionConfiguration` + + @param configuration The `NSURLSessionConfiguration` to be be used + + @return An instance of `AFImageDownloader` initialized with default values and custom `NSURLSessionConfiguration` + */ +- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration; + /** Initializes the `AFImageDownloader` instance with the given session manager, download prioritization, maximum active download count and image cache. diff --git a/UIKit+AFNetworking/AFImageDownloader.m b/UIKit+AFNetworking/AFImageDownloader.m index eef0da2605..36a113f0c7 100644 --- a/UIKit+AFNetworking/AFImageDownloader.m +++ b/UIKit+AFNetworking/AFImageDownloader.m @@ -154,7 +154,11 @@ + (NSURLSessionConfiguration *)defaultURLSessionConfiguration { - (instancetype)init { NSURLSessionConfiguration *defaultConfiguration = [self.class defaultURLSessionConfiguration]; - AFHTTPSessionManager *sessionManager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:defaultConfiguration]; + return [self initWithSessionConfiguration:defaultConfiguration]; +} + +- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration { + AFHTTPSessionManager *sessionManager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:configuration]; sessionManager.responseSerializer = [AFImageResponseSerializer serializer]; return [self initWithSessionManager:sessionManager From f6f64c83b35fed51633327ef15ad0dfc391dae8b Mon Sep 17 00:00:00 2001 From: Henddher Pedroza Date: Fri, 28 Jul 2017 08:48:58 -0500 Subject: [PATCH 012/159] Remove setter for defaultURLCache --- UIKit+AFNetworking/AFImageDownloader.h | 5 ----- UIKit+AFNetworking/AFImageDownloader.m | 11 ----------- 2 files changed, 16 deletions(-) diff --git a/UIKit+AFNetworking/AFImageDownloader.h b/UIKit+AFNetworking/AFImageDownloader.h index b1dc85bb06..7e25e3734d 100644 --- a/UIKit+AFNetworking/AFImageDownloader.h +++ b/UIKit+AFNetworking/AFImageDownloader.h @@ -81,11 +81,6 @@ typedef NS_ENUM(NSInteger, AFImageDownloadPrioritization) { */ + (NSURLCache *)defaultURLCache; -/** - Sets the default `NSURLCache` - */ -+ (void) setDefaultURLCache:(NSURLCache *)defaultCache; - /** The default `NSURLSessionConfiguration` with common usage parameter values. */ diff --git a/UIKit+AFNetworking/AFImageDownloader.m b/UIKit+AFNetworking/AFImageDownloader.m index 36a113f0c7..67532430b0 100644 --- a/UIKit+AFNetworking/AFImageDownloader.m +++ b/UIKit+AFNetworking/AFImageDownloader.m @@ -106,16 +106,10 @@ @interface AFImageDownloader () @end -static NSURLCache* _defaultURLCache = nil; - @implementation AFImageDownloader + (NSURLCache *)defaultURLCache { - if (_defaultURLCache) { - return _defaultURLCache; - } - // It's been discovered that a crash will occur on certain versions // of iOS if you customize the cache. // @@ -131,11 +125,6 @@ + (NSURLCache *)defaultURLCache { diskPath:@"com.alamofire.imagedownloader"]; } -+ (void)setDefaultURLCache:(NSURLCache *)defaultCache { - - _defaultURLCache = defaultCache; -} - + (NSURLSessionConfiguration *)defaultURLSessionConfiguration { NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; From 51a80847ed9e55d067436cef1f032b2d58bc0bc7 Mon Sep 17 00:00:00 2001 From: Henddher Pedroza Date: Fri, 28 Jul 2017 11:15:44 -0500 Subject: [PATCH 013/159] Ask implementor if an image should be cached. Implementors may prevent caching. --- UIKit+AFNetworking/AFAutoPurgingImageCache.h | 11 +++++++++++ UIKit+AFNetworking/AFAutoPurgingImageCache.m | 4 ++++ UIKit+AFNetworking/AFImageDownloader.m | 4 +++- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/UIKit+AFNetworking/AFAutoPurgingImageCache.h b/UIKit+AFNetworking/AFAutoPurgingImageCache.h index 9bdc15cc73..1a27bb435f 100644 --- a/UIKit+AFNetworking/AFAutoPurgingImageCache.h +++ b/UIKit+AFNetworking/AFAutoPurgingImageCache.h @@ -72,6 +72,17 @@ NS_ASSUME_NONNULL_BEGIN */ @protocol AFImageRequestCache +/** + Asks if the image should be cached using an identifier created from the request and additional identifier. + + @param image The image to be cached. + @param request The unique URL request identifing the image asset. + @param identifier The additional identifier to apply to the URL request to identify the image. + + @return A BOOL indicating whether or not the image should be added to the cache. YES will cache, NO will prevent caching. + */ +- (BOOL)shouldCacheImage:(UIImage *)image forRequest:(NSURLRequest *)request withAdditionalIdentifier:(nullable NSString *)identifier; + /** Adds the image to the cache using an identifier created from the request and additional identifier. diff --git a/UIKit+AFNetworking/AFAutoPurgingImageCache.m b/UIKit+AFNetworking/AFAutoPurgingImageCache.m index 1f40715c37..374eeac653 100644 --- a/UIKit+AFNetworking/AFAutoPurgingImageCache.m +++ b/UIKit+AFNetworking/AFAutoPurgingImageCache.m @@ -196,6 +196,10 @@ - (NSString *)imageCacheKeyFromURLRequest:(NSURLRequest *)request withAdditional return key; } +- (BOOL)shouldCacheImage:(UIImage *)image forRequest:(NSURLRequest *)request withAdditionalIdentifier:(nullable NSString *)identifier { + return YES; +} + @end #endif diff --git a/UIKit+AFNetworking/AFImageDownloader.m b/UIKit+AFNetworking/AFImageDownloader.m index 67532430b0..1fbc52378d 100644 --- a/UIKit+AFNetworking/AFImageDownloader.m +++ b/UIKit+AFNetworking/AFImageDownloader.m @@ -266,7 +266,9 @@ - (nullable AFImageDownloadReceipt *)downloadImageForURLRequest:(NSURLRequest *) } } } else { - [strongSelf.imageCache addImage:responseObject forRequest:request withAdditionalIdentifier:nil]; + if ([strongSelf.imageCache shouldCacheImage:responseObject forRequest:request withAdditionalIdentifier:nil]) { + [strongSelf.imageCache addImage:responseObject forRequest:request withAdditionalIdentifier:nil]; + } for (AFImageDownloaderResponseHandler *handler in mergedTask.responseHandlers) { if (handler.successBlock) { From 6babb5f039b08e23f96e833b4daa6ff7a03d6231 Mon Sep 17 00:00:00 2001 From: Henddher Pedroza Date: Fri, 28 Jul 2017 15:29:53 -0500 Subject: [PATCH 014/159] Test-cases. --- Tests/Tests/AFAutoPurgingImageCacheTests.m | 8 ++ Tests/Tests/AFImageDownloaderTests.m | 134 +++++++++++++++++++++ 2 files changed, 142 insertions(+) diff --git a/Tests/Tests/AFAutoPurgingImageCacheTests.m b/Tests/Tests/AFAutoPurgingImageCacheTests.m index e05f9ed370..d5e3224763 100644 --- a/Tests/Tests/AFAutoPurgingImageCacheTests.m +++ b/Tests/Tests/AFAutoPurgingImageCacheTests.m @@ -230,4 +230,12 @@ - (void)testThatPrioritizedImagesWithOldestLastAccessDatesAreRemovedDuringPurge } } +#pragma mark - Should Cache Image +- (void)testThatShouldCacheIsYes { + NSURL *url = [NSURL URLWithString:@"http://test.com/image"]; + NSString *identifier = @"filter"; + NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url]; + BOOL result = [self.cache shouldCacheImage:self.testImage forRequest:request withAdditionalIdentifier:identifier]; + XCTAssertTrue(result); +} @end diff --git a/Tests/Tests/AFImageDownloaderTests.m b/Tests/Tests/AFImageDownloaderTests.m index 4dc999badf..c5b743ae76 100644 --- a/Tests/Tests/AFImageDownloaderTests.m +++ b/Tests/Tests/AFImageDownloaderTests.m @@ -22,6 +22,11 @@ #import "AFTestCase.h" #import "AFImageDownloader.h" +@interface MockAFAutoPurgingImageCache : AFAutoPurgingImageCache +@property (nonatomic, strong) BOOL(^shouldCache)(UIImage*, NSURLRequest*, NSString*); +@property (nonatomic, strong) void(^addCache)(UIImage*, NSString*); +@end + @interface AFImageDownloaderTests : AFTestCase @property (nonatomic, strong) NSURLRequest *pngRequest; @property (nonatomic, strong) NSURLRequest *jpegRequest; @@ -234,6 +239,114 @@ - (void)testThatResponseIsNilWhenReturnedFromCache { XCTAssertEqual(responseImage1, responseImage2); } +- (void)testThatImageCacheIsPromptedShouldCache { + XCTestExpectation *expectation3 = [self expectationWithDescription:@"image 1 shouldCache called"]; + XCTestExpectation *expectation4 = [self expectationWithDescription:@"image 1 addCache called"]; + + MockAFAutoPurgingImageCache *mock = [[MockAFAutoPurgingImageCache alloc] init]; + mock.shouldCache = ^BOOL(UIImage *img, NSURLRequest *req, NSString *iden) { + [expectation3 fulfill]; + return YES; + }; + mock.addCache = ^(UIImage *img, NSString *ident) { + [expectation4 fulfill]; + }; + self.downloader.imageCache = mock; + + XCTestExpectation *expectation1 = [self expectationWithDescription:@"image 1 download should succeed"]; + __block NSHTTPURLResponse *urlResponse1 = nil; + __block UIImage *responseImage1 = nil; + + [self.downloader + downloadImageForURLRequest:self.pngRequest + success:^(NSURLRequest * _Nonnull request, NSHTTPURLResponse * _Nullable response, UIImage * _Nonnull responseObject) { + urlResponse1 = response; + responseImage1 = responseObject; + [expectation1 fulfill]; + } + failure:nil]; + + [self waitForExpectationsWithCommonTimeout]; + + XCTestExpectation *expectation2 = [self expectationWithDescription:@"image 2 download should succeed"]; + __block NSHTTPURLResponse *urlResponse2 = nil; + __block UIImage *responseImage2 = nil; + + [self.downloader + downloadImageForURLRequest:self.pngRequest + success:^(NSURLRequest * _Nonnull request, NSHTTPURLResponse * _Nullable response, UIImage * _Nonnull responseObject) { + urlResponse2 = response; + responseImage2 = responseObject; + [expectation2 fulfill]; + } + failure:nil]; + + [self waitForExpectationsWithCommonTimeout]; + + XCTAssertNotNil(urlResponse1); + XCTAssertNotNil(responseImage1); + XCTAssertNil(urlResponse2); + XCTAssertEqual(responseImage1, responseImage2); +} + +- (void)testThatImageCacheIsPromptedShouldCacheNot { + XCTestExpectation *expectation3 = [self expectationWithDescription:@"image 1 shouldCache called"]; + XCTestExpectation *expectation4 = [self expectationWithDescription:@"image 1 & 2 addCache NOT called"]; + expectation4.inverted = YES; + + MockAFAutoPurgingImageCache *mock = [[MockAFAutoPurgingImageCache alloc] init]; + mock.shouldCache = ^BOOL(UIImage *img, NSURLRequest *req, NSString *iden) { + [expectation3 fulfill]; + return NO; + }; + mock.addCache = ^(UIImage *img, NSString *ident) { + XCTFail(@"Not expected"); + }; + self.downloader.imageCache = mock; + + XCTestExpectation *expectation1 = [self expectationWithDescription:@"image 1 download should succeed"]; + __block NSHTTPURLResponse *urlResponse1 = nil; + __block UIImage *responseImage1 = nil; + + [self.downloader + downloadImageForURLRequest:self.pngRequest + success:^(NSURLRequest * _Nonnull request, NSHTTPURLResponse * _Nullable response, UIImage * _Nonnull responseObject) { + urlResponse1 = response; + responseImage1 = responseObject; + [expectation1 fulfill]; + } + failure:nil]; + + [self waitForExpectationsWithCommonTimeout]; + + XCTestExpectation *expectation2 = [self expectationWithDescription:@"image 2 download should succeed"]; + __block NSHTTPURLResponse *urlResponse2 = nil; + __block UIImage *responseImage2 = nil; + + XCTestExpectation *expectation5 = [self expectationWithDescription:@"image 2 shouldCache called"]; + + mock.shouldCache = ^BOOL(UIImage *img, NSURLRequest *req, NSString *iden) { + [expectation5 fulfill]; + return NO; + }; + + [self.downloader + downloadImageForURLRequest:self.pngRequest + success:^(NSURLRequest * _Nonnull request, NSHTTPURLResponse * _Nullable response, UIImage * _Nonnull responseObject) { + urlResponse2 = response; + responseImage2 = responseObject; + [expectation2 fulfill]; + } + failure:nil]; + + [self waitForExpectationsWithCommonTimeout]; + + XCTAssertNotNil(urlResponse1); + XCTAssertNotNil(responseImage1); + XCTAssertNotNil(urlResponse2); + XCTAssertNotEqual(responseImage1, responseImage2); +} + - (void)testThatImageDownloadReceiptIsNilForCachedImage { XCTestExpectation *expectation1 = [self expectationWithDescription:@"image 1 download should succeed"]; AFImageDownloadReceipt *receipt1; @@ -445,3 +558,24 @@ - (void)testThatReceiptIDMatchesReturnedID { } @end + +#pragma mark - + +@implementation MockAFAutoPurgingImageCache + +-(BOOL)shouldCacheImage:(UIImage *)image forRequest:(NSURLRequest *)request withAdditionalIdentifier:(NSString *)identifier { + if (self.shouldCache) { + return self.shouldCache(image, request, identifier); + } + else { + return [super shouldCacheImage:image forRequest:request withAdditionalIdentifier:identifier]; + } +} + +-(void)addImage:(UIImage *)image withIdentifier:(NSString *)identifier{ + [super addImage:image withIdentifier:identifier]; + if (self.addCache) { + self.addCache(image, identifier); + } +} +@end From a241b4fcdd42c40b653167501095a2795a4cac8a Mon Sep 17 00:00:00 2001 From: Henddher Pedroza Date: Fri, 28 Jul 2017 15:46:45 -0500 Subject: [PATCH 015/159] Remove usage of XCTestExpectation.inverted (not supported) --- Tests/Tests/AFImageDownloaderTests.m | 2 -- 1 file changed, 2 deletions(-) diff --git a/Tests/Tests/AFImageDownloaderTests.m b/Tests/Tests/AFImageDownloaderTests.m index c5b743ae76..9a94b86683 100644 --- a/Tests/Tests/AFImageDownloaderTests.m +++ b/Tests/Tests/AFImageDownloaderTests.m @@ -291,8 +291,6 @@ - (void)testThatImageCacheIsPromptedShouldCache { - (void)testThatImageCacheIsPromptedShouldCacheNot { XCTestExpectation *expectation3 = [self expectationWithDescription:@"image 1 shouldCache called"]; - XCTestExpectation *expectation4 = [self expectationWithDescription:@"image 1 & 2 addCache NOT called"]; - expectation4.inverted = YES; MockAFAutoPurgingImageCache *mock = [[MockAFAutoPurgingImageCache alloc] init]; mock.shouldCache = ^BOOL(UIImage *img, NSURLRequest *req, NSString *iden) { From c69c109da8d7f1e65cd05ccaee3f5dbe54a5d92f Mon Sep 17 00:00:00 2001 From: Henddher Pedroza Date: Fri, 28 Jul 2017 15:46:45 -0500 Subject: [PATCH 016/159] Remove usage of XCTestExpectation.inverted (not supported) --- Tests/Tests/AFImageDownloaderTests.m | 2 -- 1 file changed, 2 deletions(-) diff --git a/Tests/Tests/AFImageDownloaderTests.m b/Tests/Tests/AFImageDownloaderTests.m index c5b743ae76..9a94b86683 100644 --- a/Tests/Tests/AFImageDownloaderTests.m +++ b/Tests/Tests/AFImageDownloaderTests.m @@ -291,8 +291,6 @@ - (void)testThatImageCacheIsPromptedShouldCache { - (void)testThatImageCacheIsPromptedShouldCacheNot { XCTestExpectation *expectation3 = [self expectationWithDescription:@"image 1 shouldCache called"]; - XCTestExpectation *expectation4 = [self expectationWithDescription:@"image 1 & 2 addCache NOT called"]; - expectation4.inverted = YES; MockAFAutoPurgingImageCache *mock = [[MockAFAutoPurgingImageCache alloc] init]; mock.shouldCache = ^BOOL(UIImage *img, NSURLRequest *req, NSString *iden) { From 9b33c1699f3f94135fbc35cb06080cbfe9cf11d1 Mon Sep 17 00:00:00 2001 From: Henddher Pedroza Date: Fri, 28 Jul 2017 17:11:47 -0500 Subject: [PATCH 017/159] self in block --- UIKit+AFNetworking/AFImageDownloader.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UIKit+AFNetworking/AFImageDownloader.m b/UIKit+AFNetworking/AFImageDownloader.m index 1fbc52378d..36745b57a1 100644 --- a/UIKit+AFNetworking/AFImageDownloader.m +++ b/UIKit+AFNetworking/AFImageDownloader.m @@ -254,7 +254,7 @@ - (nullable AFImageDownloadReceipt *)downloadImageForURLRequest:(NSURLRequest *) completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { dispatch_async(self.responseQueue, ^{ __strong __typeof__(weakSelf) strongSelf = weakSelf; - AFImageDownloaderMergedTask *mergedTask = self.mergedTasks[URLIdentifier]; + AFImageDownloaderMergedTask *mergedTask = strongSelf.mergedTasks[URLIdentifier]; if ([mergedTask.identifier isEqual:mergedTaskIdentifier]) { mergedTask = [strongSelf safelyRemoveMergedTaskWithURLIdentifier:URLIdentifier]; if (error) { From 849dff7deeb1ca0ee9e26a5605bdeb71bc5373f3 Mon Sep 17 00:00:00 2001 From: Ash Furrow Date: Mon, 18 Sep 2017 10:45:40 -0400 Subject: [PATCH 018/159] Exposes C function prototype. --- AFNetworking/AFURLResponseSerialization.h | 5 +++++ AFNetworking/AFURLResponseSerialization.m | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/AFNetworking/AFURLResponseSerialization.h b/AFNetworking/AFURLResponseSerialization.h index 0f6d462b7c..30e81fe373 100644 --- a/AFNetworking/AFURLResponseSerialization.h +++ b/AFNetworking/AFURLResponseSerialization.h @@ -24,6 +24,11 @@ NS_ASSUME_NONNULL_BEGIN +/** + Recursively removes `NSNull` values from a JSON object. +*/ +id AFJSONObjectByRemovingKeysWithNullValues(id JSONObject, NSJSONReadingOptions readingOptions); + /** The `AFURLResponseSerialization` protocol is adopted by an object that decodes data into a more useful object representation, according to details in the server response. Response serializers may additionally perform validation on the incoming response and data. diff --git a/AFNetworking/AFURLResponseSerialization.m b/AFNetworking/AFURLResponseSerialization.m index b7be3d403c..fb2a223f4c 100755 --- a/AFNetworking/AFURLResponseSerialization.m +++ b/AFNetworking/AFURLResponseSerialization.m @@ -60,7 +60,7 @@ static BOOL AFErrorOrUnderlyingErrorHasCodeInDomain(NSError *error, NSInteger co return NO; } -static id AFJSONObjectByRemovingKeysWithNullValues(id JSONObject, NSJSONReadingOptions readingOptions) { +id AFJSONObjectByRemovingKeysWithNullValues(id JSONObject, NSJSONReadingOptions readingOptions) { if ([JSONObject isKindOfClass:[NSArray class]]) { NSMutableArray *mutableArray = [NSMutableArray arrayWithCapacity:[(NSArray *)JSONObject count]]; for (id value in (NSArray *)JSONObject) { From 75763005cb473908013a9d8473c94beff77541ce Mon Sep 17 00:00:00 2001 From: Ash Furrow Date: Mon, 18 Sep 2017 11:11:02 -0400 Subject: [PATCH 019/159] Modifies AFJSONObjectByRemovingKeysWithNullValues to remove NSArray null objects. --- AFNetworking/AFURLResponseSerialization.m | 4 +++- Tests/Tests/AFJSONSerializationTests.m | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/AFNetworking/AFURLResponseSerialization.m b/AFNetworking/AFURLResponseSerialization.m index b7be3d403c..bb378faa48 100755 --- a/AFNetworking/AFURLResponseSerialization.m +++ b/AFNetworking/AFURLResponseSerialization.m @@ -64,7 +64,9 @@ static id AFJSONObjectByRemovingKeysWithNullValues(id JSONObject, NSJSONReadingO if ([JSONObject isKindOfClass:[NSArray class]]) { NSMutableArray *mutableArray = [NSMutableArray arrayWithCapacity:[(NSArray *)JSONObject count]]; for (id value in (NSArray *)JSONObject) { - [mutableArray addObject:AFJSONObjectByRemovingKeysWithNullValues(value, readingOptions)]; + if (![value isEqual:[NSNull null]]) { + [mutableArray addObject:AFJSONObjectByRemovingKeysWithNullValues(value, readingOptions)]; + } } return (readingOptions & NSJSONReadingMutableContainers) ? mutableArray : [NSArray arrayWithArray:mutableArray]; diff --git a/Tests/Tests/AFJSONSerializationTests.m b/Tests/Tests/AFJSONSerializationTests.m index d1b15e97a5..8be5bfeccd 100644 --- a/Tests/Tests/AFJSONSerializationTests.m +++ b/Tests/Tests/AFJSONSerializationTests.m @@ -177,7 +177,7 @@ - (void)testThatJSONResponseSerializerReturnsNilObjectAndNilErrorForSingleSpace - (void)testThatJSONRemovesKeysWithNullValues { self.responseSerializer.removesKeysWithNullValues = YES; NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:self.baseURL statusCode:200 HTTPVersion:@"1.1" headerFields:@{@"Content-Type":@"text/json"}]; - NSData *data = [NSJSONSerialization dataWithJSONObject:@{@"key":@"value",@"nullkey":[NSNull null],@"array":@[@{@"subnullkey":[NSNull null]}]} + NSData *data = [NSJSONSerialization dataWithJSONObject:@{@"key":@"value",@"nullkey":[NSNull null],@"array":@[@{@"subnullkey":[NSNull null]}], @"arrayWithNulls": @[[NSNull null]]} options:(NSJSONWritingOptions)0 error:nil]; @@ -189,6 +189,7 @@ - (void)testThatJSONRemovesKeysWithNullValues { XCTAssertNotNil(responseObject[@"key"]); XCTAssertNil(responseObject[@"nullkey"]); XCTAssertNil(responseObject[@"array"][0][@"subnullkey"]); + XCTAssertEqualObjects(responseObject[@"arrayWithNulls"], @[]); } - (void)testThatJSONResponseSerializerCanBeCopied { From 1e03fb1a728ed455499fe13d84ef3d4927a49ae5 Mon Sep 17 00:00:00 2001 From: Matti Mustonen Date: Thu, 12 Oct 2017 13:49:40 +0300 Subject: [PATCH 020/159] Fixed CLANG_ENABLE_CODE_COVERAGE flag so release can be made --- AFNetworking.xcodeproj/project.pbxproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/AFNetworking.xcodeproj/project.pbxproj b/AFNetworking.xcodeproj/project.pbxproj index 7feb916cde..5b2a70b285 100644 --- a/AFNetworking.xcodeproj/project.pbxproj +++ b/AFNetworking.xcodeproj/project.pbxproj @@ -1223,6 +1223,7 @@ ALWAYS_SEARCH_USER_PATHS = NO; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_CODE_COVERAGE = YES; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_ASSIGN_ENUM = YES; @@ -1297,6 +1298,7 @@ ALWAYS_SEARCH_USER_PATHS = NO; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_CODE_COVERAGE = NO; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_ASSIGN_ENUM = YES; From d8f45e79e549c81ed9ade8dd4c18f267c0d38020 Mon Sep 17 00:00:00 2001 From: Matti Mustonen Date: Fri, 13 Oct 2017 10:28:52 +0300 Subject: [PATCH 021/159] Fixed init method nullability to default value --- AFNetworking/AFNetworkReachabilityManager.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AFNetworking/AFNetworkReachabilityManager.h b/AFNetworking/AFNetworkReachabilityManager.h index 72296d496a..91a802ac59 100644 --- a/AFNetworking/AFNetworkReachabilityManager.h +++ b/AFNetworking/AFNetworkReachabilityManager.h @@ -112,7 +112,7 @@ NS_ASSUME_NONNULL_BEGIN * * @return nil as this method is unavailable */ -- (nullable instancetype)init NS_UNAVAILABLE; +- (instancetype)init NS_UNAVAILABLE; ///-------------------------------------------------- /// @name Starting & Stopping Reachability Monitoring From c976cf3db87f84ce3cb112d78f7a3f79acb2f3c3 Mon Sep 17 00:00:00 2001 From: Jakub Kaspar Date: Sun, 12 Nov 2017 12:20:24 -0800 Subject: [PATCH 022/159] fix crashes --- AFNetworking/AFNetworkReachabilityManager.h | 2 +- AFNetworking/AFURLSessionManager.m | 52 +++++++++++++++------ 2 files changed, 38 insertions(+), 16 deletions(-) diff --git a/AFNetworking/AFNetworkReachabilityManager.h b/AFNetworking/AFNetworkReachabilityManager.h index 72296d496a..e14e27e4ea 100644 --- a/AFNetworking/AFNetworkReachabilityManager.h +++ b/AFNetworking/AFNetworkReachabilityManager.h @@ -112,7 +112,7 @@ NS_ASSUME_NONNULL_BEGIN * * @return nil as this method is unavailable */ -- (nullable instancetype)init NS_UNAVAILABLE; +- (nonnull instancetype)init NS_UNAVAILABLE; ///-------------------------------------------------- /// @name Starting & Stopping Reachability Monitoring diff --git a/AFNetworking/AFURLSessionManager.m b/AFNetworking/AFURLSessionManager.m index 2475595d77..4d494cfae9 100644 --- a/AFNetworking/AFURLSessionManager.m +++ b/AFNetworking/AFURLSessionManager.m @@ -39,13 +39,16 @@ static dispatch_queue_t url_session_manager_creation_queue() { } static void url_session_manager_create_task_safely(dispatch_block_t block) { - if (NSFoundationVersionNumber < NSFoundationVersionNumber_With_Fixed_5871104061079552_bug) { - // Fix of bug - // Open Radar:http://openradar.appspot.com/radar?id=5871104061079552 (status: Fixed in iOS8) - // Issue about:https://github.com/AFNetworking/AFNetworking/issues/2093 - dispatch_sync(url_session_manager_creation_queue(), block); - } else { - block(); + + if (block != nil) { + if (NSFoundationVersionNumber < NSFoundationVersionNumber_With_Fixed_5871104061079552_bug) { + // Fix of bug + // Open Radar:http://openradar.appspot.com/radar?id=5871104061079552 (status: Fixed in iOS8) + // Issue about:https://github.com/AFNetworking/AFNetworking/issues/2093 + dispatch_sync(url_session_manager_creation_queue(), block); + } else { + block(); + } } } @@ -373,8 +376,7 @@ + (void)load { 7) If the current class implementation of `resume` is not equal to the super class implementation of `resume` AND the current implementation of `resume` is not equal to the original implementation of `af_resume`, THEN swizzle the methods 8) Set the current class to the super class, and repeat steps 3-8 */ - NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration ephemeralSessionConfiguration]; - NSURLSession * session = [NSURLSession sessionWithConfiguration:configuration]; + NSURLSession * session = [NSURLSession sharedSession]; #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wnonnull" NSURLSessionDataTask *localDataTask = [session dataTaskWithURL:nil]; @@ -394,7 +396,6 @@ + (void)load { } [localDataTask cancel]; - [session finishTasksAndInvalidate]; } } @@ -484,8 +485,6 @@ - (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)config self.operationQueue = [[NSOperationQueue alloc] init]; self.operationQueue.maxConcurrentOperationCount = 1; - self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue]; - self.responseSerializer = [AFJSONResponseSerializer serializer]; self.securityPolicy = [AFSecurityPolicy defaultPolicy]; @@ -499,17 +498,20 @@ - (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)config self.lock = [[NSLock alloc] init]; self.lock.name = AFURLSessionManagerLockName; + __weak typeof(self) weakSelf = self; [self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) { + + __strong typeof(weakSelf) strongSelf = weakSelf; for (NSURLSessionDataTask *task in dataTasks) { - [self addDelegateForDataTask:task uploadProgress:nil downloadProgress:nil completionHandler:nil]; + [strongSelf addDelegateForDataTask:task uploadProgress:nil downloadProgress:nil completionHandler:nil]; } for (NSURLSessionUploadTask *uploadTask in uploadTasks) { - [self addDelegateForUploadTask:uploadTask progress:nil completionHandler:nil]; + [strongSelf addDelegateForUploadTask:uploadTask progress:nil completionHandler:nil]; } for (NSURLSessionDownloadTask *downloadTask in downloadTasks) { - [self addDelegateForDownloadTask:downloadTask progress:nil destination:nil completionHandler:nil]; + [strongSelf addDelegateForDownloadTask:downloadTask progress:nil destination:nil completionHandler:nil]; } }]; @@ -522,6 +524,19 @@ - (void)dealloc { #pragma mark - +- (NSURLSession *)session { + + @synchronized (self) { + if (!_session) { + _session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue]; + } + } + return _session; +} + +#pragma mark - + + - (NSString *)taskDescriptionForSessionTasks { return [NSString stringWithFormat:@"%p", self]; } @@ -683,6 +698,7 @@ - (void)invalidateSessionCancelingTasks:(BOOL)cancelPendingTasks { } else { [self.session finishTasksAndInvalidate]; } + self.session = nil; } #pragma mark - @@ -1058,6 +1074,12 @@ - (void)URLSession:(NSURLSession *)session if (self.taskDidComplete) { self.taskDidComplete(session, task, error); } + + if (self.mutableTaskDelegatesKeyedByTaskIdentifier.allKeys.count == 0) { + @synchronized (self) { + [self invalidateSessionCancelingTasks:NO]; + } + } } #pragma mark - NSURLSessionDataDelegate From 3297dfe5f047fe78ceda8986bdd4194145459675 Mon Sep 17 00:00:00 2001 From: Jeff Kelley Date: Wed, 22 Nov 2017 23:47:31 -0500 Subject: [PATCH 023/159] Update security policy test certificates (#4103) --- AFNetworking.xcodeproj/project.pbxproj | 16 ++++++++-------- .../HTTPBinOrgServerTrustChain/httpbin_0.cer | Bin 1295 -> 1294 bytes .../HTTPBin.org/httpbinorg_02102018.cer | Bin 0 -> 1294 bytes .../HTTPBin.org/httpbinorg_08132017.cer | Bin 1295 -> 0 bytes Tests/Tests/AFSecurityPolicyTests.m | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) create mode 100644 Tests/Resources/HTTPBin.org/httpbinorg_02102018.cer delete mode 100644 Tests/Resources/HTTPBin.org/httpbinorg_08132017.cer diff --git a/AFNetworking.xcodeproj/project.pbxproj b/AFNetworking.xcodeproj/project.pbxproj index 7feb916cde..a40878b4a0 100644 --- a/AFNetworking.xcodeproj/project.pbxproj +++ b/AFNetworking.xcodeproj/project.pbxproj @@ -10,15 +10,15 @@ 1BF9F9601C87832B00F1F35A /* AFImageResponseSerializerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BF9F95F1C87832B00F1F35A /* AFImageResponseSerializerTests.m */; }; 1BF9F9611C87843200F1F35A /* AFImageResponseSerializerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BF9F95F1C87832B00F1F35A /* AFImageResponseSerializerTests.m */; }; 1BF9F9621C87843300F1F35A /* AFImageResponseSerializerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BF9F95F1C87832B00F1F35A /* AFImageResponseSerializerTests.m */; }; + 1F0EEE581FC5E7EC00DAF282 /* httpbinorg_02102018.cer in Resources */ = {isa = PBXBuildFile; fileRef = 1F0EEE571FC5E74A00DAF282 /* httpbinorg_02102018.cer */; }; + 1F0EEE591FC5E7F100DAF282 /* httpbinorg_02102018.cer in Resources */ = {isa = PBXBuildFile; fileRef = 1F0EEE571FC5E74A00DAF282 /* httpbinorg_02102018.cer */; }; + 1F0EEE5A1FC5E7F200DAF282 /* httpbinorg_02102018.cer in Resources */ = {isa = PBXBuildFile; fileRef = 1F0EEE571FC5E74A00DAF282 /* httpbinorg_02102018.cer */; }; 1F6F7DF71F17051000C979D0 /* DST Root CA X3.cer in Resources */ = {isa = PBXBuildFile; fileRef = 1F6F7DF61F1703A100C979D0 /* DST Root CA X3.cer */; }; 1F6F7DF81F17051000C979D0 /* Let's Encrypt Authority X3.cer in Resources */ = {isa = PBXBuildFile; fileRef = 1F6F7DF51F1703A100C979D0 /* Let's Encrypt Authority X3.cer */; }; - 1F6F7DF91F17051000C979D0 /* httpbinorg_08132017.cer in Resources */ = {isa = PBXBuildFile; fileRef = 1F6F7DF41F1703A100C979D0 /* httpbinorg_08132017.cer */; }; 1F6F7DFA1F17051000C979D0 /* DST Root CA X3.cer in Resources */ = {isa = PBXBuildFile; fileRef = 1F6F7DF61F1703A100C979D0 /* DST Root CA X3.cer */; }; 1F6F7DFB1F17051000C979D0 /* Let's Encrypt Authority X3.cer in Resources */ = {isa = PBXBuildFile; fileRef = 1F6F7DF51F1703A100C979D0 /* Let's Encrypt Authority X3.cer */; }; - 1F6F7DFC1F17051000C979D0 /* httpbinorg_08132017.cer in Resources */ = {isa = PBXBuildFile; fileRef = 1F6F7DF41F1703A100C979D0 /* httpbinorg_08132017.cer */; }; 1F6F7DFD1F17051100C979D0 /* DST Root CA X3.cer in Resources */ = {isa = PBXBuildFile; fileRef = 1F6F7DF61F1703A100C979D0 /* DST Root CA X3.cer */; }; 1F6F7DFE1F17051100C979D0 /* Let's Encrypt Authority X3.cer in Resources */ = {isa = PBXBuildFile; fileRef = 1F6F7DF51F1703A100C979D0 /* Let's Encrypt Authority X3.cer */; }; - 1F6F7DFF1F17051100C979D0 /* httpbinorg_08132017.cer in Resources */ = {isa = PBXBuildFile; fileRef = 1F6F7DF41F1703A100C979D0 /* httpbinorg_08132017.cer */; }; 2960BAC31C1B2F1A00BA02F0 /* AFUIButtonTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 2960BAC21C1B2F1A00BA02F0 /* AFUIButtonTests.m */; }; 297824A31BC2D69A0041C395 /* adn_0.cer in Resources */ = {isa = PBXBuildFile; fileRef = 297824A01BC2D69A0041C395 /* adn_0.cer */; }; 297824A41BC2D69A0041C395 /* adn_0.cer in Resources */ = {isa = PBXBuildFile; fileRef = 297824A01BC2D69A0041C395 /* adn_0.cer */; }; @@ -225,7 +225,7 @@ /* Begin PBXFileReference section */ 1BF9F95F1C87832B00F1F35A /* AFImageResponseSerializerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFImageResponseSerializerTests.m; sourceTree = ""; }; - 1F6F7DF41F1703A100C979D0 /* httpbinorg_08132017.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = httpbinorg_08132017.cer; sourceTree = ""; }; + 1F0EEE571FC5E74A00DAF282 /* httpbinorg_02102018.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = httpbinorg_02102018.cer; sourceTree = ""; }; 1F6F7DF51F1703A100C979D0 /* Let's Encrypt Authority X3.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Let's Encrypt Authority X3.cer"; sourceTree = ""; }; 1F6F7DF61F1703A100C979D0 /* DST Root CA X3.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = "DST Root CA X3.cer"; sourceTree = ""; }; 2960BAC21C1B2F1A00BA02F0 /* AFUIButtonTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFUIButtonTests.m; sourceTree = ""; }; @@ -401,7 +401,7 @@ 298D7CE21BC2CB7C00FD3B3E /* HTTPBinOrgServerTrustChain */, 1F6F7DF61F1703A100C979D0 /* DST Root CA X3.cer */, 1F6F7DF51F1703A100C979D0 /* Let's Encrypt Authority X3.cer */, - 1F6F7DF41F1703A100C979D0 /* httpbinorg_08132017.cer */, + 1F0EEE571FC5E74A00DAF282 /* httpbinorg_02102018.cer */, ); path = HTTPBin.org; sourceTree = ""; @@ -831,11 +831,11 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 1F0EEE5A1FC5E7F200DAF282 /* httpbinorg_02102018.cer in Resources */, 2987B0DE1BC40AFB00179A4C /* foobar.com.cer in Resources */, 2987B0D61BC40AEC00179A4C /* ADNNetServerTrustChain in Resources */, 2987B0DF1BC40AFB00179A4C /* NoDomains.cer in Resources */, 2987B0D41BC40AE900179A4C /* adn_1.cer in Resources */, - 1F6F7DFF1F17051100C979D0 /* httpbinorg_08132017.cer in Resources */, 2987B0DD1BC40AFB00179A4C /* AltName.cer in Resources */, 2987B0D71BC40AF000179A4C /* HTTPBinOrgServerTrustChain in Resources */, 2987B0D31BC40AE900179A4C /* adn_0.cer in Resources */, @@ -857,11 +857,11 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 1F0EEE581FC5E7EC00DAF282 /* httpbinorg_02102018.cer in Resources */, 298D7CBF1BC2CA9D00FD3B3E /* foobar.com.cer in Resources */, 298D7CBA1BC2CA9800FD3B3E /* logo.png in Resources */, 297824A31BC2D69A0041C395 /* adn_0.cer in Resources */, 298D7CE31BC2CB7C00FD3B3E /* HTTPBinOrgServerTrustChain in Resources */, - 1F6F7DF91F17051000C979D0 /* httpbinorg_08132017.cer in Resources */, 297824A71BC2D69A0041C395 /* adn_2.cer in Resources */, 297824A51BC2D69A0041C395 /* adn_1.cer in Resources */, 298D7CC01BC2CA9D00FD3B3E /* NoDomains.cer in Resources */, @@ -883,11 +883,11 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 1F0EEE591FC5E7F100DAF282 /* httpbinorg_02102018.cer in Resources */, 298D7CBC1BC2CA9C00FD3B3E /* foobar.com.cer in Resources */, 298D7CB91BC2CA9800FD3B3E /* logo.png in Resources */, 297824A41BC2D69A0041C395 /* adn_0.cer in Resources */, 298D7CE41BC2CB7C00FD3B3E /* HTTPBinOrgServerTrustChain in Resources */, - 1F6F7DFC1F17051000C979D0 /* httpbinorg_08132017.cer in Resources */, 297824A81BC2D69A0041C395 /* adn_2.cer in Resources */, 297824A61BC2D69A0041C395 /* adn_1.cer in Resources */, 298D7CBD1BC2CA9C00FD3B3E /* NoDomains.cer in Resources */, diff --git a/Tests/Resources/HTTPBin.org/HTTPBinOrgServerTrustChain/httpbin_0.cer b/Tests/Resources/HTTPBin.org/HTTPBinOrgServerTrustChain/httpbin_0.cer index f2ee78266ef5c032bc4f0b9af540e5a5e658c879..0fe81041550bc2b37d5baabbed958567d57b155f 100644 GIT binary patch delta 669 zcmV;O0%HA-3XTdPFoFdNFoFZ}paTK{0s;~P&o1i*M2A#r9lcPpSx9FZYm88I<2 zGBPtWGB7n-7Y#8uFfuVPGBYzWFg1~zI)BBmN)^lf)HlS!kgB|{&GQd?)#yC-c@c+* zPCmYm^pVV+Q#MyDJ$6FtUeypbU6iTn>=0RJQm_gV7~D0BC6K%dID#MU7An<8ayV+* zEwZg7OXxk2Qq*9{(_oDyG)4QXiF26=vd}sj0@4Knp*rQZ`X+U%%%?n&7v4TV3x9bl z!v-wDB!6jft_2F}x-X>P0@cKLWi>^lPpujJ3$aRK^a|+J)4Bk987|RQY~hYM7*yLg z#RaXWI#_NJ56i*1ImYp4i^)lma#wwVBfpix-?)yxiceA52ZjhO5mGyg+~&}jVr!{v zD-+RxD9l=5>jYcaF}SHDXk5AhSr2}D0s{d60i%Kf958|c7?a`wNEFt@1z-0UP2h63 z4lNp&ZrrW>o_>=)0wNu61_&z#0R;sI0RaSKFkvt*1_&z#0R;sIFad@llYIgrv!DWR z0e@KJk!|q&K93?To@~BA{m?#8Pc!P(@vJi=mAwI8avEhnHA%sfAfLi`MJOo$p!`6H z+k06b%m|4&^=N5F=FtK{#s^Bs;f!wZ4mqYrk{sOtSDmE$do8|`-VfSyMYw~s=CxA`qt2$w2m%o)Qrqa2>%KV*{{VhD&|Or|Dyt7dVrYLY*B3vN2TmG?tCvd4Jc< z!GPd53!{#Gj3uGimrM0wA zG^`1$jEbV2VZl0E0Bt8Nags`Exhz7LPJ0s{d60i%Kf9Wa6d8I$4xNEH8Ou<#T{v-GT2 z2vMZ0+e{U<#b1*?0wNu71_&z#0R;sI0RaSLFk&z-1_&z#0R;sIFad@mlYIgr0WY(k z0&f9-NAlx!M^uV7>D4WIQ@}s0JqpIfd7zBi|Gq~(R2(bQ#-Vg-{E!{a z3@DrV+O`i2`EW~uL0sMx6%}Jam6}N_#bEn?9&7r@)_GE8921nVPW~v#cn>EeIjdE$ zw|Qav!T0M3nhaRy=MiRe=DtX1kfzb%G1@g%%uv;jM`uznqr54@m&VyS$Med9_xReq zt@{u;64Ywu4{T|z_zU^`_7Yl3K#MGHZS@uQ3jhY>J}a11h_Y>>`=3nudJ)9U@*M2~ FJW%01E3^Or diff --git a/Tests/Resources/HTTPBin.org/httpbinorg_02102018.cer b/Tests/Resources/HTTPBin.org/httpbinorg_02102018.cer new file mode 100644 index 0000000000000000000000000000000000000000..0fe81041550bc2b37d5baabbed958567d57b155f GIT binary patch literal 1294 zcmXqLV&yVuV*a#%nTe5!Nr?Hp-fK3O_K>W{Pdo0EYcKGXG2mt6)N1o+`_9YA$j!=N z;AO~dz{$oO%EBhh6dG(OW*`FMa0&DJq?V``E4bz*7gZLN7%Cemg2b7HrBK8b97{_w z@{2M{DitD(4dldm4b2S=4ULS9jg1UUqkvos10zENDAz#DP{cq8VhndiNl8IcW}aSt zQMy4BqY|>S7+D#Zn;7{SfZ|+CO^l2TM>lwhp8k8q{K%mRtM;rr`I<81m4fXZ zes=r%zf3$cH`pv($F|Jrb=*|}v)CysU%e5COb^4KFM(g;r0u{ZcDkb!NHEMDcre z4&0U6huL%vs?=u|u4CnTwM&1=eWt5NDpE~dm-w%h{KLJ`E9nc@i>sG+F;q$FT@1^4 z*k>sba@+hU>)Pd35qU!Vrw{J5JoYiY`=sZ@qVU=#<^59+-QUr-uggF1CVLx)u3(UL z_nl`KW+Y{=%+VIU*r0JHD&aLt^bNxuD^)ULb}>fQRWmU&GB7S~Vv;dvVv;c61BRe1 zKO^IR78YhE)&&N#AigRKDCRh{*%(<_*_j#PEG7dUkhCyJIgmfYBdqb? z#eE+XZRgXKnx1!O?Vovd2J#@q$}AEFVhtiIyt0y6YVYoPcF}VCGS}4ipI5wDXpj#x znURqt*&xwC55_lOY*PZosg=HdesXbvUS?j2ZiTU4PHIVUDkKeoqgo%Xo~cb4sy;cj zs04?4eFJrniv(E|4CI=S(@Yb8d3m`Waw2N{2U4lP()i7w@v{L38(VrK4h60d(%|H$22qs1`DVQS)iZLA9xEijI$)Ir_Pvh*6jLc#MXP|pC(=wA2 zOHvhb6Dt++^KvQ`l2R3lQgbp>Qxr-I^79muDiwlKb1F0Q(iH*{fyz^h6%zAOAWAdy z6cUq@^NUgv^O92)$}>wc6iPBuQH%}9&&f=#R7lG&1!_txQ2;rz7#Or@!Kq)AT999y zS(0B=sgIn4fEgQ@gBTeio=nXB@W-xSNq1h(K8L>->;n9aUtRsU##njkUdFg0sZ@JY z&x4Z{<{zqX)zJ9A;EzMc?dnMRGaQ``Ho~F{jlV9tx~}%Vs6iK#)9Z6wf1WyA^i;K% z`<8t@>$TAQ&#&UPyEM=JBzvxD2g|+at*et{k}kff6WSvd|99z=EwiN-MD$M9ad{@7 zdq12-ESLM*^xIRFoR}TXG~84!SR5RZ6SMlfBj=8-_V)`e`Xx%Y8g5DrU-h!Ps$}(( z_gg>9_L&^!ZoI#kzwFYA*F0*HrN2aWhD$g7z1(=`@r&P%Oa*FD>KgKQ!sjmeU9G!s e^5avAu2o0BcpaIocIDvFdyO}GOjkZAwFCfSSJ6WN literal 0 HcmV?d00001 diff --git a/Tests/Resources/HTTPBin.org/httpbinorg_08132017.cer b/Tests/Resources/HTTPBin.org/httpbinorg_08132017.cer deleted file mode 100644 index f2ee78266ef5c032bc4f0b9af540e5a5e658c879..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1295 zcmXqLV&yhyV*b2Rh;S%QcNi9(?R&dQrE~+djF;q5C1c@^XOQDD>IF^=V z$h9*$1ftaC)fe^$P?u?R>f~3qmz5Jqd zgC<5LWM?t5GB7tW@-qO%xtN+585wSWKD*?o%TMk9lI;<~v9b4sZgO5`dHuZ6Y?Y_4 ztao1ira3bfyy#mJ+Iz|4>Qa8D=eHIv$hsY*qaHMQruq5TPfT_vzy7|)Yhb;;3|Kcho~Vh+Fsi^TENTmWx<2QrG&juW9Z0U_Wj7*FMjnCM)f#Jf! z*mNHl3_$)h12vednHa^Spsr3XC`Na!LE~z;LMDU8c|47?Lozap6`X=87E(+dkFEhpBFb^s>E^e>K!_ z-q%WRyKHx%uGrgW@zI3_Z_|D;9}LazW3n|NGo+ zLu9lsA6rUPDPwk@#zvZ%jow!yRlqw@U zWrN>8jguAp>MEA2LpN-%O#FTD`)iI_JQ2^I3#Ju6+vkxnVcEq;hPO;Z&jeiUcTW#8 zSiDE`@bqIhEsuXb)%5+xt-Wi13s?$W$$G}0lezW>_s>7ygrdA0x^?n$zlwh2W?*|_ ar#&O2V^i*;-}8NbRS6zB`$^`lO#lGVCf0@k diff --git a/Tests/Tests/AFSecurityPolicyTests.m b/Tests/Tests/AFSecurityPolicyTests.m index 2ebbd80d34..953b2c7114 100644 --- a/Tests/Tests/AFSecurityPolicyTests.m +++ b/Tests/Tests/AFSecurityPolicyTests.m @@ -58,7 +58,7 @@ static SecTrustRef AFUTADNNetServerTrust() { } static SecCertificateRef AFUTHTTPBinOrgCertificate() { - NSString *certPath = [[NSBundle bundleForClass:[AFSecurityPolicyTests class]] pathForResource:@"httpbinorg_08132017" ofType:@"cer"]; + NSString *certPath = [[NSBundle bundleForClass:[AFSecurityPolicyTests class]] pathForResource:@"httpbinorg_02102018" ofType:@"cer"]; NSCAssert(certPath != nil, @"Path for certificate should not be nil"); NSData *certData = [NSData dataWithContentsOfFile:certPath]; From 1f2ffbb41b689b4ba1594714820a4c7111bcef92 Mon Sep 17 00:00:00 2001 From: Jeff Kelley Date: Thu, 23 Nov 2017 00:05:16 -0500 Subject: [PATCH 024/159] Update project settings to Xcode 9.1 defaults. --- AFNetworking.xcodeproj/project.pbxproj | 20 +++++++- .../xcschemes/AFNetworking OS X.xcscheme | 4 +- .../xcschemes/AFNetworking iOS.xcscheme | 8 +-- .../xcschemes/AFNetworking tvOS.xcscheme | 10 ++-- .../xcschemes/AFNetworking watchOS.xcscheme | 4 +- .../project.pbxproj | 51 ++++++++++++++++++- .../xcschemes/OS X Example.xcscheme | 14 ++++- .../Today Extension Example.xcscheme | 14 ++++- .../xcschemes/iOS Example.xcscheme | 14 ++++- .../xcschemes/tvOS Example.xcscheme | 14 ++++- .../xcschemes/watchOS Example.xcscheme | 4 +- 11 files changed, 141 insertions(+), 16 deletions(-) diff --git a/AFNetworking.xcodeproj/project.pbxproj b/AFNetworking.xcodeproj/project.pbxproj index 2120c9123b..67132209e5 100644 --- a/AFNetworking.xcodeproj/project.pbxproj +++ b/AFNetworking.xcodeproj/project.pbxproj @@ -776,7 +776,7 @@ 299522301BBF104D00859F49 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0800; + LastUpgradeCheck = 0910; ORGANIZATIONNAME = AFNetworking; TargetAttributes = { 2987B0A41BC408A200179A4C = { @@ -1100,6 +1100,7 @@ 2987B0B61BC408A200179A4C /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; BITCODE_GENERATION_MODE = marker; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; DEFINES_MODULE = YES; @@ -1123,6 +1124,7 @@ 2987B0B71BC408A200179A4C /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; BITCODE_GENERATION_MODE = bitcode; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; DEFINES_MODULE = YES; @@ -1238,7 +1240,9 @@ CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_ASSIGN_ENUM = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; @@ -1248,10 +1252,14 @@ CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_EXPLICIT_OWNERSHIP_TYPE = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__ARC_BRIDGE_CAST_NONARC = YES; @@ -1312,7 +1320,9 @@ CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_ASSIGN_ENUM = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; @@ -1322,10 +1332,14 @@ CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_EXPLICIT_OWNERSHIP_TYPE = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__ARC_BRIDGE_CAST_NONARC = YES; @@ -1374,6 +1388,7 @@ 299522421BBF104D00859F49 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; BITCODE_GENERATION_MODE = marker; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1396,6 +1411,7 @@ 299522431BBF104D00859F49 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; BITCODE_GENERATION_MODE = bitcode; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1464,6 +1480,7 @@ 2995227D1BBF136400859F49 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; BITCODE_GENERATION_MODE = marker; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; COMBINE_HIDPI_IMAGES = YES; @@ -1489,6 +1506,7 @@ 2995227E1BBF136400859F49 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; BITCODE_GENERATION_MODE = bitcode; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; COMBINE_HIDPI_IMAGES = YES; diff --git a/AFNetworking.xcodeproj/xcshareddata/xcschemes/AFNetworking OS X.xcscheme b/AFNetworking.xcodeproj/xcshareddata/xcschemes/AFNetworking OS X.xcscheme index a03e886df4..f7bb4dd3ad 100644 --- a/AFNetworking.xcodeproj/xcshareddata/xcschemes/AFNetworking OS X.xcscheme +++ b/AFNetworking.xcodeproj/xcshareddata/xcschemes/AFNetworking OS X.xcscheme @@ -1,6 +1,6 @@ @@ -68,6 +69,7 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + language = "" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" diff --git a/AFNetworking.xcodeproj/xcshareddata/xcschemes/AFNetworking iOS.xcscheme b/AFNetworking.xcodeproj/xcshareddata/xcschemes/AFNetworking iOS.xcscheme index e4fb0852b7..53e858db39 100644 --- a/AFNetworking.xcodeproj/xcshareddata/xcschemes/AFNetworking iOS.xcscheme +++ b/AFNetworking.xcodeproj/xcshareddata/xcschemes/AFNetworking iOS.xcscheme @@ -1,6 +1,6 @@ + codeCoverageEnabled = "YES"> @@ -88,6 +89,7 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + language = "" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" diff --git a/AFNetworking.xcodeproj/xcshareddata/xcschemes/AFNetworking tvOS.xcscheme b/AFNetworking.xcodeproj/xcshareddata/xcschemes/AFNetworking tvOS.xcscheme index dca989fffe..85776e2d2c 100644 --- a/AFNetworking.xcodeproj/xcshareddata/xcschemes/AFNetworking tvOS.xcscheme +++ b/AFNetworking.xcodeproj/xcshareddata/xcschemes/AFNetworking tvOS.xcscheme @@ -1,6 +1,6 @@ + enableAddressSanitizer = "YES" + language = "" + shouldUseLaunchSchemeArgsEnv = "NO"> @@ -78,11 +79,12 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + enableThreadSanitizer = "YES" + language = "" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" - enableThreadSanitizer = "YES" stopOnEveryThreadSanitizerIssue = "YES" debugServiceExtension = "internal" allowLocationSimulation = "YES"> diff --git a/AFNetworking.xcodeproj/xcshareddata/xcschemes/AFNetworking watchOS.xcscheme b/AFNetworking.xcodeproj/xcshareddata/xcschemes/AFNetworking watchOS.xcscheme index f38ee5828a..04419c4a82 100644 --- a/AFNetworking.xcodeproj/xcshareddata/xcschemes/AFNetworking watchOS.xcscheme +++ b/AFNetworking.xcodeproj/xcshareddata/xcschemes/AFNetworking watchOS.xcscheme @@ -1,6 +1,6 @@ @@ -36,6 +37,7 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + language = "" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" diff --git a/Example/AFNetworking Example.xcodeproj/project.pbxproj b/Example/AFNetworking Example.xcodeproj/project.pbxproj index 3e883ca87f..b1acb2a4c8 100644 --- a/Example/AFNetworking Example.xcodeproj/project.pbxproj +++ b/Example/AFNetworking Example.xcodeproj/project.pbxproj @@ -500,7 +500,7 @@ 29E6F16B1BB9DA2E00A4466C /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0710; + LastUpgradeCheck = 0910; TargetAttributes = { 291BFDB81BB9E85400FFB029 = { CreatedOnToolsVersion = 7.1; @@ -1074,12 +1074,61 @@ 29E6F16F1BB9DA2E00A4466C /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + ONLY_ACTIVE_ARCH = YES; }; name = Debug; }; 29E6F1701BB9DA2E00A4466C /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; }; name = Release; }; diff --git a/Example/AFNetworking Example.xcodeproj/xcshareddata/xcschemes/OS X Example.xcscheme b/Example/AFNetworking Example.xcodeproj/xcshareddata/xcschemes/OS X Example.xcscheme index f02f6a4b6f..674e9b3384 100644 --- a/Example/AFNetworking Example.xcodeproj/xcshareddata/xcschemes/OS X Example.xcscheme +++ b/Example/AFNetworking Example.xcodeproj/xcshareddata/xcschemes/OS X Example.xcscheme @@ -1,6 +1,6 @@ + + + + + + + + + + + + + + + + @@ -87,6 +88,7 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + language = "" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" From 00addee8a11a21b3a32b140f404d7443664b1e4f Mon Sep 17 00:00:00 2001 From: Jeff Kelley Date: Thu, 23 Nov 2017 00:05:25 -0500 Subject: [PATCH 025/159] Fix analyzer warning about mutable copies. --- AFNetworking/AFURLRequestSerialization.m | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/AFNetworking/AFURLRequestSerialization.m b/AFNetworking/AFURLRequestSerialization.m index 68c2c2d7be..a4d5d9dfee 100644 --- a/AFNetworking/AFURLRequestSerialization.m +++ b/AFNetworking/AFURLRequestSerialization.m @@ -679,6 +679,11 @@ - (instancetype)initWithURLRequest:(NSMutableURLRequest *)urlRequest return self; } +- (void)setRequest:(NSMutableURLRequest *)request +{ + _request = [request mutableCopy]; +} + - (BOOL)appendPartWithFileURL:(NSURL *)fileURL name:(NSString *)name error:(NSError * __autoreleasing *)error From 20ff51cb8eeaaf3df582d6d9bb94fa11ab67cebe Mon Sep 17 00:00:00 2001 From: Jeff Kelley Date: Thu, 23 Nov 2017 00:05:43 -0500 Subject: [PATCH 026/159] Fix analyzer warning about NULL dereference. --- Tests/Tests/AFHTTPRequestSerializationTests.m | 4 +++- Tests/Tests/AFHTTPSessionManagerTests.m | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Tests/Tests/AFHTTPRequestSerializationTests.m b/Tests/Tests/AFHTTPRequestSerializationTests.m index a81c632ef5..2d9ef13053 100644 --- a/Tests/Tests/AFHTTPRequestSerializationTests.m +++ b/Tests/Tests/AFHTTPRequestSerializationTests.m @@ -169,7 +169,9 @@ - (void)testQueryStringSerializationCanFailWithError { NSError *serializerError = [NSError errorWithDomain:@"TestDomain" code:0 userInfo:nil]; [serializer setQueryStringSerializationWithBlock:^NSString *(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error) { - *error = serializerError; + if (error != NULL) { + *error = serializerError; + } return nil; }]; diff --git a/Tests/Tests/AFHTTPSessionManagerTests.m b/Tests/Tests/AFHTTPSessionManagerTests.m index 48da64535c..6fbbdf2b5d 100644 --- a/Tests/Tests/AFHTTPSessionManagerTests.m +++ b/Tests/Tests/AFHTTPSessionManagerTests.m @@ -178,7 +178,9 @@ - (void)testThatSerializationErrorGeneratesErrorAndNullTaskForGET { XCTestExpectation *expectation = [self expectationWithDescription:@"Serialization should fail"]; [self.manager.requestSerializer setQueryStringSerializationWithBlock:^NSString * _Nonnull(NSURLRequest * _Nonnull request, id _Nonnull parameters, NSError * _Nullable __autoreleasing * _Nullable error) { - *error = [NSError errorWithDomain:@"Custom" code:-1 userInfo:nil]; + if (error != NULL) { + *error = [NSError errorWithDomain:@"Custom" code:-1 userInfo:nil]; + } return @""; }]; From f45a3abf087798f30d7b6a578c9b76082614c7c5 Mon Sep 17 00:00:00 2001 From: Jeff Kelley Date: Thu, 23 Nov 2017 00:05:51 -0500 Subject: [PATCH 027/159] Fix analyzer warning about memory leak. --- Tests/Tests/AFSecurityPolicyTests.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Tests/AFSecurityPolicyTests.m b/Tests/Tests/AFSecurityPolicyTests.m index 953b2c7114..8ef0c7dd4f 100644 --- a/Tests/Tests/AFSecurityPolicyTests.m +++ b/Tests/Tests/AFSecurityPolicyTests.m @@ -32,7 +32,7 @@ static SecTrustRef AFUTTrustChainForCertsInDirectory(NSString *directoryPath) { for (NSString *path in certFileNames) { NSData *certData = [NSData dataWithContentsOfFile:[directoryPath stringByAppendingPathComponent:path]]; SecCertificateRef cert = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)(certData)); - [certs addObject:(__bridge id)(cert)]; + [certs addObject:(__bridge_transfer id)(cert)]; } SecPolicyRef policy = SecPolicyCreateBasicX509(); From 4b64a60d4b6a2bcd4c54646d6e9028222de8b9c8 Mon Sep 17 00:00:00 2001 From: Jeff Kelley Date: Thu, 23 Nov 2017 00:19:44 -0500 Subject: [PATCH 028/159] =?UTF-8?q?Change=20=E2=80=9COS=20X=E2=80=9D=20to?= =?UTF-8?q?=20=E2=80=9CmacOS=E2=80=9D=20across=20the=20board.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also change the “Today Extension Example” to specify iOS now that macOS has those too. --- AFNetworking.xcodeproj/project.pbxproj | 28 +++++----- ...X.xcscheme => AFNetworking macOS.xcscheme} | 12 ++--- .../project.pbxproj | 52 +++++++++---------- ...e => iOS Today Extension Example.xcscheme} | 4 +- ...xample.xcscheme => macOS Example.xcscheme} | 24 ++++----- .../AppDelegate.h | 0 .../AppDelegate.m | 0 .../AppIcon.appiconset/Contents.json | 0 .../Info.plist | 0 .../MainMenu.xib | 31 +++++------ .../{OS X Example => macOS Example}/main.m | 0 Framework/Info.plist | 4 +- README.md | 8 +-- 13 files changed, 82 insertions(+), 81 deletions(-) rename AFNetworking.xcodeproj/xcshareddata/xcschemes/{AFNetworking OS X.xcscheme => AFNetworking macOS.xcscheme} (92%) rename Example/AFNetworking Example.xcodeproj/xcshareddata/xcschemes/{Today Extension Example.xcscheme => iOS Today Extension Example.xcscheme} (97%) rename Example/AFNetworking Example.xcodeproj/xcshareddata/xcschemes/{OS X Example.xcscheme => macOS Example.xcscheme} (86%) rename Example/{OS X Example => macOS Example}/AppDelegate.h (100%) rename Example/{OS X Example => macOS Example}/AppDelegate.m (100%) rename Example/{OS X Example => macOS Example}/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename Example/{OS X Example => macOS Example}/Info.plist (100%) rename Example/{OS X Example => macOS Example}/MainMenu.xib (94%) rename Example/{OS X Example => macOS Example}/main.m (100%) diff --git a/AFNetworking.xcodeproj/project.pbxproj b/AFNetworking.xcodeproj/project.pbxproj index 67132209e5..976d11fb46 100644 --- a/AFNetworking.xcodeproj/project.pbxproj +++ b/AFNetworking.xcodeproj/project.pbxproj @@ -239,7 +239,7 @@ 2987B0A51BC408A200179A4C /* AFNetworking.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AFNetworking.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 2987B0AE1BC408A200179A4C /* AFNetworking tvOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "AFNetworking tvOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 298D7C3B1BC2C79500FD3B3E /* AFNetworking iOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "AFNetworking iOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 298D7C4A1BC2C7B200FD3B3E /* AFNetworking Mac OS X Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "AFNetworking Mac OS X Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 298D7C4A1BC2C7B200FD3B3E /* AFNetworking macOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "AFNetworking macOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 298D7C771BC2C88F00FD3B3E /* logo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = logo.png; sourceTree = ""; }; 298D7C791BC2C88F00FD3B3E /* AltName.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = AltName.cer; sourceTree = ""; }; 298D7C7A1BC2C88F00FD3B3E /* foobar.com.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = foobar.com.cer; sourceTree = ""; }; @@ -489,7 +489,7 @@ 299522651BBF129200859F49 /* AFNetworking.framework */, 299522771BBF136400859F49 /* AFNetworking.framework */, 298D7C3B1BC2C79500FD3B3E /* AFNetworking iOS Tests.xctest */, - 298D7C4A1BC2C7B200FD3B3E /* AFNetworking Mac OS X Tests.xctest */, + 298D7C4A1BC2C7B200FD3B3E /* AFNetworking macOS Tests.xctest */, 2987B0A51BC408A200179A4C /* AFNetworking.framework */, 2987B0AE1BC408A200179A4C /* AFNetworking tvOS Tests.xctest */, ); @@ -698,9 +698,9 @@ productReference = 298D7C3B1BC2C79500FD3B3E /* AFNetworking iOS Tests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; - 298D7C491BC2C7B200FD3B3E /* AFNetworking Mac OS X Tests */ = { + 298D7C491BC2C7B200FD3B3E /* AFNetworking macOS Tests */ = { isa = PBXNativeTarget; - buildConfigurationList = 298D7C521BC2C7B200FD3B3E /* Build configuration list for PBXNativeTarget "AFNetworking Mac OS X Tests" */; + buildConfigurationList = 298D7C521BC2C7B200FD3B3E /* Build configuration list for PBXNativeTarget "AFNetworking macOS Tests" */; buildPhases = ( 298D7C461BC2C7B200FD3B3E /* Sources */, 298D7C471BC2C7B200FD3B3E /* Frameworks */, @@ -711,9 +711,9 @@ dependencies = ( 298D7C511BC2C7B200FD3B3E /* PBXTargetDependency */, ); - name = "AFNetworking Mac OS X Tests"; + name = "AFNetworking macOS Tests"; productName = "AFNetworking Mac OS X Tests"; - productReference = 298D7C4A1BC2C7B200FD3B3E /* AFNetworking Mac OS X Tests.xctest */; + productReference = 298D7C4A1BC2C7B200FD3B3E /* AFNetworking macOS Tests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; 299522381BBF104D00859F49 /* AFNetworking iOS */ = { @@ -752,9 +752,9 @@ productReference = 299522651BBF129200859F49 /* AFNetworking.framework */; productType = "com.apple.product-type.framework"; }; - 299522761BBF136400859F49 /* AFNetworking OS X */ = { + 299522761BBF136400859F49 /* AFNetworking macOS */ = { isa = PBXNativeTarget; - buildConfigurationList = 2995227C1BBF136400859F49 /* Build configuration list for PBXNativeTarget "AFNetworking OS X" */; + buildConfigurationList = 2995227C1BBF136400859F49 /* Build configuration list for PBXNativeTarget "AFNetworking macOS" */; buildPhases = ( 299522721BBF136400859F49 /* Sources */, 299522731BBF136400859F49 /* Frameworks */, @@ -765,7 +765,7 @@ ); dependencies = ( ); - name = "AFNetworking OS X"; + name = "AFNetworking macOS"; productName = "AFNetworking OS X"; productReference = 299522771BBF136400859F49 /* AFNetworking.framework */; productType = "com.apple.product-type.framework"; @@ -818,10 +818,10 @@ targets = ( 299522381BBF104D00859F49 /* AFNetworking iOS */, 299522641BBF129200859F49 /* AFNetworking watchOS */, - 299522761BBF136400859F49 /* AFNetworking OS X */, + 299522761BBF136400859F49 /* AFNetworking macOS */, 2987B0A41BC408A200179A4C /* AFNetworking tvOS */, 298D7C3A1BC2C79500FD3B3E /* AFNetworking iOS Tests */, - 298D7C491BC2C7B200FD3B3E /* AFNetworking Mac OS X Tests */, + 298D7C491BC2C7B200FD3B3E /* AFNetworking macOS Tests */, 2987B0AD1BC408A200179A4C /* AFNetworking tvOS Tests */, ); }; @@ -1091,7 +1091,7 @@ }; 298D7C511BC2C7B200FD3B3E /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 299522761BBF136400859F49 /* AFNetworking OS X */; + target = 299522761BBF136400859F49 /* AFNetworking macOS */; targetProxy = 298D7C501BC2C7B200FD3B3E /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -1559,7 +1559,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 298D7C521BC2C7B200FD3B3E /* Build configuration list for PBXNativeTarget "AFNetworking Mac OS X Tests" */ = { + 298D7C521BC2C7B200FD3B3E /* Build configuration list for PBXNativeTarget "AFNetworking macOS Tests" */ = { isa = XCConfigurationList; buildConfigurations = ( 298D7C531BC2C7B200FD3B3E /* Debug */, @@ -1595,7 +1595,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 2995227C1BBF136400859F49 /* Build configuration list for PBXNativeTarget "AFNetworking OS X" */ = { + 2995227C1BBF136400859F49 /* Build configuration list for PBXNativeTarget "AFNetworking macOS" */ = { isa = XCConfigurationList; buildConfigurations = ( 2995227D1BBF136400859F49 /* Debug */, diff --git a/AFNetworking.xcodeproj/xcshareddata/xcschemes/AFNetworking OS X.xcscheme b/AFNetworking.xcodeproj/xcshareddata/xcschemes/AFNetworking macOS.xcscheme similarity index 92% rename from AFNetworking.xcodeproj/xcshareddata/xcschemes/AFNetworking OS X.xcscheme rename to AFNetworking.xcodeproj/xcshareddata/xcschemes/AFNetworking macOS.xcscheme index f7bb4dd3ad..0517056db6 100644 --- a/AFNetworking.xcodeproj/xcshareddata/xcschemes/AFNetworking OS X.xcscheme +++ b/AFNetworking.xcodeproj/xcshareddata/xcschemes/AFNetworking macOS.xcscheme @@ -16,7 +16,7 @@ BuildableIdentifier = "primary" BlueprintIdentifier = "299522761BBF136400859F49" BuildableName = "AFNetworking.framework" - BlueprintName = "AFNetworking OS X" + BlueprintName = "AFNetworking macOS" ReferencedContainer = "container:AFNetworking.xcodeproj"> @@ -35,8 +35,8 @@ @@ -51,7 +51,7 @@ BuildableIdentifier = "primary" BlueprintIdentifier = "299522761BBF136400859F49" BuildableName = "AFNetworking.framework" - BlueprintName = "AFNetworking OS X" + BlueprintName = "AFNetworking macOS" ReferencedContainer = "container:AFNetworking.xcodeproj"> @@ -81,7 +81,7 @@ BuildableIdentifier = "primary" BlueprintIdentifier = "299522761BBF136400859F49" BuildableName = "AFNetworking.framework" - BlueprintName = "AFNetworking OS X" + BlueprintName = "AFNetworking macOS" ReferencedContainer = "container:AFNetworking.xcodeproj"> @@ -99,7 +99,7 @@ BuildableIdentifier = "primary" BlueprintIdentifier = "299522761BBF136400859F49" BuildableName = "AFNetworking.framework" - BlueprintName = "AFNetworking OS X" + BlueprintName = "AFNetworking macOS" ReferencedContainer = "container:AFNetworking.xcodeproj"> diff --git a/Example/AFNetworking Example.xcodeproj/project.pbxproj b/Example/AFNetworking Example.xcodeproj/project.pbxproj index b1acb2a4c8..52055bfabd 100644 --- a/Example/AFNetworking Example.xcodeproj/project.pbxproj +++ b/Example/AFNetworking Example.xcodeproj/project.pbxproj @@ -38,7 +38,7 @@ 29E6F1E91BB9E37200A4466C /* NotificationCenter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29E6F1E81BB9E37200A4466C /* NotificationCenter.framework */; }; 29E6F1ED1BB9E37200A4466C /* TodayViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 29E6F1EC1BB9E37200A4466C /* TodayViewController.m */; }; 29E6F1F01BB9E37200A4466C /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 29E6F1EE1BB9E37200A4466C /* MainInterface.storyboard */; }; - 29E6F1F41BB9E37200A4466C /* Today Extension Example.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 29E6F1E61BB9E37200A4466C /* Today Extension Example.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 29E6F1F41BB9E37200A4466C /* iOS Today Extension Example.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 29E6F1E61BB9E37200A4466C /* iOS Today Extension Example.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 29E6F1F91BB9E56200A4466C /* Post.m in Sources */ = {isa = PBXBuildFile; fileRef = 29E6F19A1BB9DD7300A4466C /* Post.m */; }; 29E6F1FA1BB9E56500A4466C /* User.m in Sources */ = {isa = PBXBuildFile; fileRef = 29E6F19C1BB9DD7300A4466C /* User.m */; }; C2BFE0251C11870800BB258D /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = C2BFE0241C11870800BB258D /* AppDelegate.m */; }; @@ -87,7 +87,7 @@ dstPath = ""; dstSubfolderSpec = 13; files = ( - 29E6F1F41BB9E37200A4466C /* Today Extension Example.appex in Embed App Extensions */, + 29E6F1F41BB9E37200A4466C /* iOS Today Extension Example.appex in Embed App Extensions */, ); name = "Embed App Extensions"; runOnlyForDeploymentPostprocessing = 0; @@ -108,7 +108,7 @@ /* Begin PBXFileReference section */ 291BFDB91BB9E85400FFB029 /* watchOS Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "watchOS Example.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 291BFDC51BB9E85500FFB029 /* watchOS Example Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "watchOS Example Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; - 291BFDE71BB9E8C700FFB029 /* OS X Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "OS X Example.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 291BFDE71BB9E8C700FFB029 /* macOS Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "macOS Example.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 291BFDED1BB9E8C700FFB029 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 291BFDF21BB9E8C700FFB029 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 291BFDF71BB9E8C700FFB029 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -137,7 +137,7 @@ 29E6F19F1BB9DD7300A4466C /* AFAppDotNetAPIClient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFAppDotNetAPIClient.m; sourceTree = ""; }; 29E6F1AB1BB9DDB600A4466C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 29E6F1E01BB9E03600A4466C /* Launchscreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = Launchscreen.storyboard; path = "iOS Example/Launchscreen.storyboard"; sourceTree = SOURCE_ROOT; }; - 29E6F1E61BB9E37200A4466C /* Today Extension Example.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "Today Extension Example.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; + 29E6F1E61BB9E37200A4466C /* iOS Today Extension Example.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "iOS Today Extension Example.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; 29E6F1E81BB9E37200A4466C /* NotificationCenter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NotificationCenter.framework; path = System/Library/Frameworks/NotificationCenter.framework; sourceTree = SDKROOT; }; 29E6F1EB1BB9E37200A4466C /* TodayViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TodayViewController.h; sourceTree = ""; }; 29E6F1EC1BB9E37200A4466C /* TodayViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TodayViewController.m; sourceTree = ""; }; @@ -205,7 +205,7 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 291BFDE81BB9E8C700FFB029 /* OS X Example */ = { + 291BFDE81BB9E8C700FFB029 /* macOS Example */ = { isa = PBXGroup; children = ( C2BFE0231C11870800BB258D /* AppDelegate.h */, @@ -215,7 +215,7 @@ 291BFDF71BB9E8C700FFB029 /* Info.plist */, 291BFDEC1BB9E8C700FFB029 /* Supporting Files */, ); - path = "OS X Example"; + path = "macOS Example"; sourceTree = ""; }; 291BFDEC1BB9E8C700FFB029 /* Supporting Files */ = { @@ -267,7 +267,7 @@ 29E6F1EA1BB9E37200A4466C /* Today Extension Example */, 29E6F20F1BB9E76A00A4466C /* watchOS Example */, 29E6F21E1BB9E76A00A4466C /* watchOS Example Extension */, - 291BFDE81BB9E8C700FFB029 /* OS X Example */, + 291BFDE81BB9E8C700FFB029 /* macOS Example */, 291BFE161BB9ECEE00FFB029 /* tvOS Example */, 29E6F1E71BB9E37200A4466C /* Frameworks */, 29E6F1761BB9DCB500A4466C /* Products */, @@ -281,10 +281,10 @@ isa = PBXGroup; children = ( 29E6F1751BB9DCB500A4466C /* iOS Example.app */, - 29E6F1E61BB9E37200A4466C /* Today Extension Example.appex */, + 29E6F1E61BB9E37200A4466C /* iOS Today Extension Example.appex */, 291BFDB91BB9E85400FFB029 /* watchOS Example.app */, 291BFDC51BB9E85500FFB029 /* watchOS Example Extension.appex */, - 291BFDE71BB9E8C700FFB029 /* OS X Example.app */, + 291BFDE71BB9E8C700FFB029 /* macOS Example.app */, 291BFE151BB9ECEE00FFB029 /* tvOS Example.app */, ); name = Products; @@ -422,9 +422,9 @@ productReference = 291BFDC51BB9E85500FFB029 /* watchOS Example Extension.appex */; productType = "com.apple.product-type.watchkit2-extension"; }; - 291BFDE61BB9E8C700FFB029 /* OS X Example */ = { + 291BFDE61BB9E8C700FFB029 /* macOS Example */ = { isa = PBXNativeTarget; - buildConfigurationList = 291BFDF81BB9E8C700FFB029 /* Build configuration list for PBXNativeTarget "OS X Example" */; + buildConfigurationList = 291BFDF81BB9E8C700FFB029 /* Build configuration list for PBXNativeTarget "macOS Example" */; buildPhases = ( 291BFDE31BB9E8C700FFB029 /* Sources */, 291BFDE41BB9E8C700FFB029 /* Frameworks */, @@ -434,9 +434,9 @@ ); dependencies = ( ); - name = "OS X Example"; + name = "macOS Example"; productName = "OS X Example"; - productReference = 291BFDE71BB9E8C700FFB029 /* OS X Example.app */; + productReference = 291BFDE71BB9E8C700FFB029 /* macOS Example.app */; productType = "com.apple.product-type.application"; }; 291BFE141BB9ECEE00FFB029 /* tvOS Example */ = { @@ -477,9 +477,9 @@ productReference = 29E6F1751BB9DCB500A4466C /* iOS Example.app */; productType = "com.apple.product-type.application"; }; - 29E6F1E51BB9E37200A4466C /* Today Extension Example */ = { + 29E6F1E51BB9E37200A4466C /* iOS Today Extension Example */ = { isa = PBXNativeTarget; - buildConfigurationList = 29E6F1F51BB9E37200A4466C /* Build configuration list for PBXNativeTarget "Today Extension Example" */; + buildConfigurationList = 29E6F1F51BB9E37200A4466C /* Build configuration list for PBXNativeTarget "iOS Today Extension Example" */; buildPhases = ( 29E6F1E21BB9E37200A4466C /* Sources */, 29E6F1E31BB9E37200A4466C /* Frameworks */, @@ -489,9 +489,9 @@ ); dependencies = ( ); - name = "Today Extension Example"; + name = "iOS Today Extension Example"; productName = "Today Extension Example"; - productReference = 29E6F1E61BB9E37200A4466C /* Today Extension Example.appex */; + productReference = 29E6F1E61BB9E37200A4466C /* iOS Today Extension Example.appex */; productType = "com.apple.product-type.app-extension"; }; /* End PBXNativeTarget section */ @@ -537,10 +537,10 @@ projectRoot = ""; targets = ( 29E6F1741BB9DCB500A4466C /* iOS Example */, - 29E6F1E51BB9E37200A4466C /* Today Extension Example */, + 29E6F1E51BB9E37200A4466C /* iOS Today Extension Example */, 291BFDB81BB9E85400FFB029 /* watchOS Example */, 291BFDC41BB9E85500FFB029 /* watchOS Example Extension */, - 291BFDE61BB9E8C700FFB029 /* OS X Example */, + 291BFDE61BB9E8C700FFB029 /* macOS Example */, 291BFE141BB9ECEE00FFB029 /* tvOS Example */, ); }; @@ -668,7 +668,7 @@ }; 29E6F1F31BB9E37200A4466C /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 29E6F1E51BB9E37200A4466C /* Today Extension Example */; + target = 29E6F1E51BB9E37200A4466C /* iOS Today Extension Example */; targetProxy = 29E6F1F21BB9E37200A4466C /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -921,12 +921,12 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - INFOPLIST_FILE = "OS X Example/Info.plist"; + INFOPLIST_FILE = "macOS Example/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.10; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; - PRODUCT_BUNDLE_IDENTIFIER = "com.alamofire.OS-X-Example"; + PRODUCT_BUNDLE_IDENTIFIER = "com.alamofire.macOS-Example"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; }; @@ -964,11 +964,11 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - INFOPLIST_FILE = "OS X Example/Info.plist"; + INFOPLIST_FILE = "macOS Example/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.10; MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "com.alamofire.OS-X-Example"; + PRODUCT_BUNDLE_IDENTIFIER = "com.alamofire.macOS-Example"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; }; @@ -1333,7 +1333,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 291BFDF81BB9E8C700FFB029 /* Build configuration list for PBXNativeTarget "OS X Example" */ = { + 291BFDF81BB9E8C700FFB029 /* Build configuration list for PBXNativeTarget "macOS Example" */ = { isa = XCConfigurationList; buildConfigurations = ( 291BFDF91BB9E8C700FFB029 /* Debug */, @@ -1369,7 +1369,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 29E6F1F51BB9E37200A4466C /* Build configuration list for PBXNativeTarget "Today Extension Example" */ = { + 29E6F1F51BB9E37200A4466C /* Build configuration list for PBXNativeTarget "iOS Today Extension Example" */ = { isa = XCConfigurationList; buildConfigurations = ( 29E6F1F61BB9E37200A4466C /* Debug */, diff --git a/Example/AFNetworking Example.xcodeproj/xcshareddata/xcschemes/Today Extension Example.xcscheme b/Example/AFNetworking Example.xcodeproj/xcshareddata/xcschemes/iOS Today Extension Example.xcscheme similarity index 97% rename from Example/AFNetworking Example.xcodeproj/xcshareddata/xcschemes/Today Extension Example.xcscheme rename to Example/AFNetworking Example.xcodeproj/xcshareddata/xcschemes/iOS Today Extension Example.xcscheme index 4956a835a3..8d190cf50d 100644 --- a/Example/AFNetworking Example.xcodeproj/xcshareddata/xcschemes/Today Extension Example.xcscheme +++ b/Example/AFNetworking Example.xcodeproj/xcshareddata/xcschemes/iOS Today Extension Example.xcscheme @@ -30,8 +30,8 @@ diff --git a/Example/AFNetworking Example.xcodeproj/xcshareddata/xcschemes/OS X Example.xcscheme b/Example/AFNetworking Example.xcodeproj/xcshareddata/xcschemes/macOS Example.xcscheme similarity index 86% rename from Example/AFNetworking Example.xcodeproj/xcshareddata/xcschemes/OS X Example.xcscheme rename to Example/AFNetworking Example.xcodeproj/xcshareddata/xcschemes/macOS Example.xcscheme index 674e9b3384..b9b6290e43 100644 --- a/Example/AFNetworking Example.xcodeproj/xcshareddata/xcschemes/OS X Example.xcscheme +++ b/Example/AFNetworking Example.xcodeproj/xcshareddata/xcschemes/macOS Example.xcscheme @@ -15,8 +15,8 @@ @@ -29,8 +29,8 @@ @@ -48,8 +48,8 @@ @@ -58,8 +58,8 @@ @@ -82,8 +82,8 @@ @@ -101,8 +101,8 @@ diff --git a/Example/OS X Example/AppDelegate.h b/Example/macOS Example/AppDelegate.h similarity index 100% rename from Example/OS X Example/AppDelegate.h rename to Example/macOS Example/AppDelegate.h diff --git a/Example/OS X Example/AppDelegate.m b/Example/macOS Example/AppDelegate.m similarity index 100% rename from Example/OS X Example/AppDelegate.m rename to Example/macOS Example/AppDelegate.m diff --git a/Example/OS X Example/Assets.xcassets/AppIcon.appiconset/Contents.json b/Example/macOS Example/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from Example/OS X Example/Assets.xcassets/AppIcon.appiconset/Contents.json rename to Example/macOS Example/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/Example/OS X Example/Info.plist b/Example/macOS Example/Info.plist similarity index 100% rename from Example/OS X Example/Info.plist rename to Example/macOS Example/Info.plist diff --git a/Example/OS X Example/MainMenu.xib b/Example/macOS Example/MainMenu.xib similarity index 94% rename from Example/OS X Example/MainMenu.xib rename to Example/macOS Example/MainMenu.xib index 9ec30caa42..9b662b41e0 100644 --- a/Example/OS X Example/MainMenu.xib +++ b/Example/macOS Example/MainMenu.xib @@ -1,7 +1,9 @@ - - + + - + + + @@ -13,10 +15,10 @@ - - + + - + @@ -31,7 +33,7 @@ - + @@ -50,7 +52,7 @@ - + @@ -148,7 +150,7 @@ - + @@ -158,11 +160,11 @@ - - + + - + @@ -176,13 +178,13 @@ - + - + @@ -261,7 +263,6 @@ - - + - - + + - + - + - + - - + + - + - @@ -194,11 +193,11 @@ - + - + @@ -223,14 +222,12 @@ - + - - - + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad mi. @@ -241,15 +238,14 @@ - - + - - - + + + @@ -264,23 +260,24 @@ - - - - - + + + + + diff --git a/Framework/Info.plist b/Framework/Info.plist index 3a389bb15d..36e428553d 100644 --- a/Framework/Info.plist +++ b/Framework/Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 3.1.0 + $(MARKETING_VERSION) CFBundleSignature ???? CFBundleVersion - 3.2.1 + $(MARKETING_VERSION) NSPrincipalClass diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000000..a43c93aa2f --- /dev/null +++ b/Gemfile @@ -0,0 +1,5 @@ +source "https://rubygems.org" + +gem "fastlane" +gem "cocoapods" +gem "xcode-install" \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000000..70dc844f2a --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,248 @@ +GEM + remote: https://rubygems.org/ + specs: + CFPropertyList (3.0.2) + activesupport (4.2.11.1) + i18n (~> 0.7) + minitest (~> 5.1) + thread_safe (~> 0.3, >= 0.3.4) + tzinfo (~> 1.1) + addressable (2.7.0) + public_suffix (>= 2.0.2, < 5.0) + algoliasearch (1.27.1) + httpclient (~> 2.8, >= 2.8.3) + json (>= 1.5.1) + atomos (0.1.3) + aws-eventstream (1.0.3) + aws-partitions (1.290.0) + aws-sdk-core (3.92.0) + aws-eventstream (~> 1.0, >= 1.0.2) + aws-partitions (~> 1, >= 1.239.0) + aws-sigv4 (~> 1.1) + jmespath (~> 1.0) + aws-sdk-kms (1.30.0) + aws-sdk-core (~> 3, >= 3.71.0) + aws-sigv4 (~> 1.1) + aws-sdk-s3 (1.61.1) + aws-sdk-core (~> 3, >= 3.83.0) + aws-sdk-kms (~> 1) + aws-sigv4 (~> 1.1) + aws-sigv4 (1.1.1) + aws-eventstream (~> 1.0, >= 1.0.2) + babosa (1.0.3) + claide (1.0.3) + cocoapods (1.9.1) + activesupport (>= 4.0.2, < 5) + claide (>= 1.0.2, < 2.0) + cocoapods-core (= 1.9.1) + cocoapods-deintegrate (>= 1.0.3, < 2.0) + cocoapods-downloader (>= 1.2.2, < 2.0) + cocoapods-plugins (>= 1.0.0, < 2.0) + cocoapods-search (>= 1.0.0, < 2.0) + cocoapods-stats (>= 1.0.0, < 2.0) + cocoapods-trunk (>= 1.4.0, < 2.0) + cocoapods-try (>= 1.1.0, < 2.0) + colored2 (~> 3.1) + escape (~> 0.0.4) + fourflusher (>= 2.3.0, < 3.0) + gh_inspector (~> 1.0) + molinillo (~> 0.6.6) + nap (~> 1.0) + ruby-macho (~> 1.4) + xcodeproj (>= 1.14.0, < 2.0) + cocoapods-core (1.9.1) + activesupport (>= 4.0.2, < 6) + algoliasearch (~> 1.0) + concurrent-ruby (~> 1.1) + fuzzy_match (~> 2.0.4) + nap (~> 1.0) + netrc (~> 0.11) + typhoeus (~> 1.0) + cocoapods-deintegrate (1.0.4) + cocoapods-downloader (1.3.0) + cocoapods-plugins (1.0.0) + nap + cocoapods-search (1.0.0) + cocoapods-stats (1.1.0) + cocoapods-trunk (1.4.1) + nap (>= 0.8, < 2.0) + netrc (~> 0.11) + cocoapods-try (1.1.0) + colored (1.2) + colored2 (3.1.2) + commander-fastlane (4.4.6) + highline (~> 1.7.2) + concurrent-ruby (1.1.6) + declarative (0.0.10) + declarative-option (0.1.0) + digest-crc (0.5.1) + domain_name (0.5.20190701) + unf (>= 0.0.5, < 1.0.0) + dotenv (2.7.5) + emoji_regex (1.0.1) + escape (0.0.4) + ethon (0.12.0) + ffi (>= 1.3.0) + excon (0.73.0) + faraday (0.17.3) + multipart-post (>= 1.2, < 3) + faraday-cookie_jar (0.0.6) + faraday (>= 0.7.4) + http-cookie (~> 1.0.0) + faraday_middleware (0.13.1) + faraday (>= 0.7.4, < 1.0) + fastimage (2.1.7) + fastlane (2.144.0) + CFPropertyList (>= 2.3, < 4.0.0) + addressable (>= 2.3, < 3.0.0) + aws-sdk-s3 (~> 1.0) + babosa (>= 1.0.2, < 2.0.0) + bundler (>= 1.12.0, < 3.0.0) + colored + commander-fastlane (>= 4.4.6, < 5.0.0) + dotenv (>= 2.1.1, < 3.0.0) + emoji_regex (>= 0.1, < 2.0) + excon (>= 0.71.0, < 1.0.0) + faraday (~> 0.17) + faraday-cookie_jar (~> 0.0.6) + faraday_middleware (~> 0.13.1) + fastimage (>= 2.1.0, < 3.0.0) + gh_inspector (>= 1.1.2, < 2.0.0) + google-api-client (>= 0.29.2, < 0.37.0) + google-cloud-storage (>= 1.15.0, < 2.0.0) + highline (>= 1.7.2, < 2.0.0) + json (< 3.0.0) + jwt (~> 2.1.0) + mini_magick (>= 4.9.4, < 5.0.0) + multi_xml (~> 0.5) + multipart-post (~> 2.0.0) + plist (>= 3.1.0, < 4.0.0) + public_suffix (~> 2.0.0) + rubyzip (>= 1.3.0, < 2.0.0) + security (= 0.1.3) + simctl (~> 1.6.3) + slack-notifier (>= 2.0.0, < 3.0.0) + terminal-notifier (>= 2.0.0, < 3.0.0) + terminal-table (>= 1.4.5, < 2.0.0) + tty-screen (>= 0.6.3, < 1.0.0) + tty-spinner (>= 0.8.0, < 1.0.0) + word_wrap (~> 1.0.0) + xcodeproj (>= 1.13.0, < 2.0.0) + xcpretty (~> 0.3.0) + xcpretty-travis-formatter (>= 0.0.3) + ffi (1.12.2) + fourflusher (2.3.1) + fuzzy_match (2.0.4) + gh_inspector (1.1.3) + google-api-client (0.36.4) + addressable (~> 2.5, >= 2.5.1) + googleauth (~> 0.9) + httpclient (>= 2.8.1, < 3.0) + mini_mime (~> 1.0) + representable (~> 3.0) + retriable (>= 2.0, < 4.0) + signet (~> 0.12) + google-cloud-core (1.5.0) + google-cloud-env (~> 1.0) + google-cloud-errors (~> 1.0) + google-cloud-env (1.3.1) + faraday (>= 0.17.3, < 2.0) + google-cloud-errors (1.0.0) + google-cloud-storage (1.25.1) + addressable (~> 2.5) + digest-crc (~> 0.4) + google-api-client (~> 0.33) + google-cloud-core (~> 1.2) + googleauth (~> 0.9) + mini_mime (~> 1.0) + googleauth (0.11.0) + faraday (>= 0.17.3, < 2.0) + jwt (>= 1.4, < 3.0) + memoist (~> 0.16) + multi_json (~> 1.11) + os (>= 0.9, < 2.0) + signet (~> 0.12) + highline (1.7.10) + http-cookie (1.0.3) + domain_name (~> 0.5) + httpclient (2.8.3) + i18n (0.9.5) + concurrent-ruby (~> 1.0) + jmespath (1.4.0) + json (2.3.0) + jwt (2.1.0) + memoist (0.16.2) + mini_magick (4.10.1) + mini_mime (1.0.2) + minitest (5.14.0) + molinillo (0.6.6) + multi_json (1.14.1) + multi_xml (0.6.0) + multipart-post (2.0.0) + nanaimo (0.2.6) + nap (1.1.0) + naturally (2.2.0) + netrc (0.11.0) + os (1.0.1) + plist (3.5.0) + public_suffix (2.0.5) + representable (3.0.4) + declarative (< 0.1.0) + declarative-option (< 0.2.0) + uber (< 0.2.0) + retriable (3.1.2) + rouge (2.0.7) + ruby-macho (1.4.0) + rubyzip (1.3.0) + security (0.1.3) + signet (0.13.2) + addressable (~> 2.3) + faraday (>= 0.17.3, < 2.0) + jwt (>= 1.5, < 3.0) + multi_json (~> 1.10) + simctl (1.6.8) + CFPropertyList + naturally + slack-notifier (2.3.2) + terminal-notifier (2.0.0) + terminal-table (1.8.0) + unicode-display_width (~> 1.1, >= 1.1.1) + thread_safe (0.3.6) + tty-cursor (0.7.1) + tty-screen (0.7.1) + tty-spinner (0.9.3) + tty-cursor (~> 0.7) + typhoeus (1.3.1) + ethon (>= 0.9.0) + tzinfo (1.2.6) + thread_safe (~> 0.1) + uber (0.1.0) + unf (0.1.4) + unf_ext + unf_ext (0.0.7.6) + unicode-display_width (1.7.0) + word_wrap (1.0.0) + xcode-install (2.6.3) + claide (>= 0.9.1, < 1.1.0) + fastlane (>= 2.1.0, < 3.0.0) + xcodeproj (1.15.0) + CFPropertyList (>= 2.3.3, < 4.0) + atomos (~> 0.1.3) + claide (>= 1.0.2, < 2.0) + colored2 (~> 3.1) + nanaimo (~> 0.2.6) + xcpretty (0.3.0) + rouge (~> 2.0.7) + xcpretty-travis-formatter (1.0.0) + xcpretty (~> 0.2, >= 0.0.7) + +PLATFORMS + ruby + +DEPENDENCIES + cocoapods + fastlane + xcode-install + +BUNDLED WITH + 2.1.2 diff --git a/LICENSE b/LICENSE index d7076267c4..f611f42f35 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2011-2016 Alamofire Software Foundation (http://alamofire.org/) +Copyright (c) 2011-2020 Alamofire Software Foundation (http://alamofire.org/) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Package.swift b/Package.swift new file mode 100644 index 0000000000..fe6e38db65 --- /dev/null +++ b/Package.swift @@ -0,0 +1,37 @@ +// swift-tools-version:5.0 +// +// Package.swift +// +// Copyright (c) 2020 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import PackageDescription + +let package = Package(name: "AFNetworking", + platforms: [.macOS(.v10_10), + .iOS(.v9), + .tvOS(.v9), + .watchOS(.v2)], + products: [.library(name: "AFNetworking", + targets: ["AFNetworking"])], + targets: [.target(name: "AFNetworking", + path: "AFNetworking", + publicHeadersPath: "AFNetworking")]) diff --git a/README.md b/README.md index 2852c8b971..f416c949ad 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,7 @@ AFNetworking

-[![Build Status](https://travis-ci.org/AFNetworking/AFNetworking.svg)](https://travis-ci.org/AFNetworking/AFNetworking) -[![codecov.io](https://codecov.io/github/AFNetworking/AFNetworking/coverage.svg?branch=master)](https://codecov.io/github/AFNetworking/AFNetworking?branch=master) +[![Build Status](https://github.com/AFNetworking/AFNetworking/workflows/AFNetworking%20CI/badge.svg?branch=master)](https://github.com/AFNetworking/AFNetworking/actions) [![CocoaPods Compatible](https://img.shields.io/cocoapods/v/AFNetworking.svg)](https://img.shields.io/cocoapods/v/AFNetworking.svg) [![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) [![Platform](https://img.shields.io/cocoapods/p/AFNetworking.svg?style=flat)](http://cocoadocs.org/docsets/AFNetworking) @@ -20,7 +19,6 @@ Choose AFNetworking for your next project, or migrate over your existing project - [Download AFNetworking](https://github.com/AFNetworking/AFNetworking/archive/master.zip) and try out the included Mac and iPhone example apps - Read the ["Getting Started" guide](https://github.com/AFNetworking/AFNetworking/wiki/Getting-Started-with-AFNetworking), [FAQ](https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-FAQ), or [other articles on the Wiki](https://github.com/AFNetworking/AFNetworking/wiki) - Check out the [documentation](http://cocoadocs.org/docsets/AFNetworking/) for a comprehensive look at all of the APIs available in AFNetworking -- Read the [AFNetworking 3.0 Migration Guide](https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-3.0-Migration-Guide) for an overview of the architectural changes from 2.0. ## Communication @@ -35,48 +33,31 @@ AFNetworking supports multiple methods for installing the library in a project. ## Installation with CocoaPods -[CocoaPods](http://cocoapods.org) is a dependency manager for Objective-C, which automates and simplifies the process of using 3rd-party libraries like AFNetworking in your projects. See the ["Getting Started" guide for more information](https://github.com/AFNetworking/AFNetworking/wiki/Getting-Started-with-AFNetworking). You can install it with the following command: +To integrate AFNetworking into your Xcode project using CocoaPods, specify it in your `Podfile`: -```bash -$ gem install cocoapods +```ruby +pod 'AFNetworking', '~> 4.0' ``` -> CocoaPods 0.39.0+ is required to build AFNetworking 3.0.0+. - -#### Podfile -To integrate AFNetworking into your Xcode project using CocoaPods, specify it in your `Podfile`: +### Installation with Swift Package Manager -```ruby -source 'https://cdn.cocoapods.org/' -platform :ios, '8.0' +Once you have your Swift package set up, adding AFNetworking as a dependency is as easy as adding it to the `dependencies` value of your `Package.swift`. -target 'TargetName' do -pod 'AFNetworking', '~> 3.0' -end +```swift +dependencies: [ + .package(url: "https://github.com/AFNetworking/AFNetworking.git", .upToNextMajor(from: "4.0.0")) +] ``` -Then, run the following command: - -```bash -$ pod install -``` +> Note: AFNetworking's Swift package does not include it's UIKit extensions. ### Installation with Carthage [Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks. -You can install Carthage with [Homebrew](http://brew.sh/) using the following command: - -```bash -$ brew update -$ brew install carthage -``` - -To integrate AFNetworking into your Xcode project using Carthage, specify it in your `Cartfile`: - ```ogdl -github "AFNetworking/AFNetworking" ~> 3.0 +github "AFNetworking/AFNetworking" ~> 4.0 ``` Run `carthage` to build the framework and drag the built `AFNetworking.framework` into your Xcode project. @@ -85,6 +66,7 @@ Run `carthage` to build the framework and drag the built `AFNetworking.framework | AFNetworking Version | Minimum iOS Target | Minimum macOS Target | Minimum watchOS Target | Minimum tvOS Target | Notes | |:--------------------:|:---------------------------:|:----------------------------:|:----------------------------:|:----------------------------:|:-------------------------------------------------------------------------:| +| 4.x | iOS 9 | macOS 10.10 | watchOS 2.0 | tvOS 9.0 | Xcode +9+ is required. | | 3.x | iOS 7 | OS X 10.9 | watchOS 2.0 | tvOS 9.0 | Xcode 7+ is required. `NSURLConnectionOperation` support has been removed. | | 2.6 -> 2.6.3 | iOS 7 | OS X 10.9 | watchOS 2.0 | n/a | Xcode 7+ is required. | | 2.0 -> 2.5.4 | iOS 6 | OS X 10.8 | n/a | n/a | Xcode 5+ is required. `NSURLSession` subspec requires iOS 7 or OS X 10.9. | diff --git a/Tests/Info.plist b/Tests/Info.plist index 32379bec19..169b6f710e 100644 --- a/Tests/Info.plist +++ b/Tests/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - com.alamofire.afnetworking.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType diff --git a/Tests/Resources/HTTPBin.org/HTTPBinOrgServerTrustChain/httpbin_0.cer b/Tests/Resources/HTTPBin.org/HTTPBinOrgServerTrustChain/httpbin_0.cer index b2b0c26c417e32f158c82dd1c400d6ba0edcd3af..8ba123fbcfdfae8d3b54c7c39a5365dd71db3038 100644 GIT binary patch delta 908 zcmV;719SZG3i1jcFoFecFoFbDpaTK{0s;^Vt5)?d$@d}1!(04V>C8NlA6peNFfcJO zI503UFfcG$7Y#BoFfuVXk&i%sq+Dkj`j{C5 z$6d@#yW-w3ONIve<=9J{aRNqOkeKu90?brqa3*Xr)bml;`bYE|Ssu<7H~MF+H3A}> zan9l@R8$xHRs!k^uU7gm--&z)2?0X)Qszn4hV|DeJKm%!hYJP%K&FxOP#PW7#EwK2^R*%NR7z$&o~7%`CK* z3ctdIUNe|Doa$D(SkBhR3DJ~WM{+*go8A~lcd-b(d!gi5TS%B`C59^3#82(>p^x*c zK3%*g01^x@U7^#{H<>aIY7+tj0RRD`f&zvxf&zk*+yN{UO-I)o+B)U?&@n*D&NbFl zxybLOvm63F0e=Jr3M&Qy1Oe800t5mCf%OD|@&NDvb^z{6y|;DFV7lQ#X&b6{Cu(^%7k{qIP;p^8W{@&N7c6x}0CoU} zb-(9XeE5t*nP0v0ZvR$|M^-lfO0{6YwCev}po0$p00D2dLK3O~00aX7M=(VKAP~%A zDYmd*9v+poXTS18Sz=EHyde~$iO^m3l}N$vrUD@V>@&_yq+oOR2i)w)87sPUww`;D ze_YS3`$$o|XZEa62C~td|d|7A+2JRkZjFb&8fz5T&S8O0Q#{e(X`` z{M`qLj$#_pZX?H4BEeEb!M!15bN8?5sTUJ7K7U4(h(NlqcWEDzGJF7H%FP6EzOJYg zz}08c9had}Ufo=4S7b0ueq_uX2K<|~_^4`<`#$&cH&U`-sPV9h%LmbK2Z4p5DN+)U z-L8wCQGv17Kz0LPOPGLSx``7p9C=PhTh6H%1iev(<_`jJt;Ei_ttp}852oMJnbH&S iI~{T|m(Boqm+pLa!(1U+Jz@d_;}!->s#<#6C|q&1)Q-jg delta 907 zcmV;619bfI3h@dbFoFebFoFbCpaTK{0s;^Q3|&6-&@T1CtO<^@4mqolA6peMIWRIY zH!v_TFfcG$7Y#BnFf%bXk&i%stk1k`vkQP`jbv&JEr^s6_BL0_j5uyvP#e)PJP1^? zE>|C2VVrMm{6W#Bc@L1U_VCA11{IxVnd5kkZ6#`gJn>fBkpi$xXy7wlWye715Ww5n z@)sI@jU1oTVV$Rb{<-7D_jZ3 zKJFv!jHfH6b)A`=9;%3j>QFJBqw2ANsrqwk&im6E2fDb|Ve((>AOnI+6lox{`d>iN z-F_abRq|Cm?$nngKrhe_@4Es60RRD`f&zswf&zh)+yN{U&gKUj33mr}6E_kVWBe>u zZ~DPVvm63F0e=Gq3M&Qy1Oe800t5mCf%F7{@c{1tb^xTg36QiHSQLl56Qay#a0)y% zm<0J7-?-y<%?`*7+z5CDie(X0=7qS0CfOw zQ+BK|@G%+KnE<3w75{e?91+<9!2l@+jj{-uH`x;a00C(I0YAV100aX7MleJIAW^%> zce{`Mzab?fby(dh1YPGxjg>olQ4>d6qhPWP*Z3&^0mnKh^5731 zyGv9UQltL8j9q@hYyFVT2<(-CScwhv%D*9#CtDY6u$VS0KK~QuETinXf1q)z$p=Ep zTgfL@P1!dAc2y%q6d{A{GJtE1sZuc^=Nj7UgMaF#3JDSa9me#Edwtk1{rjCYoSckK-=Bt7|NEr#rLAUXl5>kg*+IY6u9NrO z6v&rJwqE$aw{&g&%+*VJHb=~uzw)T&>y093+RNPobRr+`C<~mCd{ec_E_9#AX$h0_ zCnvh3pViqijcfm*);QxC7IR*O?TR>e?KtPfDbemlc6VmqlW;HJ$g!t-;gg7Hj~SV& zZCcll_`m(Uu>bRFyVyPI3_?8mu?sI>HlJyfCCtRk$iTR`iK)$?iK)pz9vFhM$}AEF zVhtjZOVZea7F182WV3h*yZW?}=%2P13}itH_*lePM10+^OW(43`ul>R!>Mzo*Ftul zc)!#@6(lXlB4;4egd7V^yjpt5k-`U3#?Q$3pM`~)iFE2sk(&7@mnGoj6cvF&dTBa;CK8(VrK44`;L4eh99Du|HQZq(20S2#34;QG$pDldS=hLMerI94R>{P|#M1bcrSTKP z2Zl0+ciwxqm!3=5_0TC(e)Yq7X^Z*m;x`oCXl6K4-C4Eb?`Z}G#{6wgLeUHiEX)k< z2Chts42=v;6z+YTQ>IP0X0)qmP_dfyDsfo9^hY&*nj!5>|ZN z&~=*qVm^Cg>q5;Sp$T`_b+Zr*20BG3z AJOBUy literal 0 HcmV?d00001 diff --git a/Tests/Resources/HTTPBin.org/httpbinorg_03172020.cer b/Tests/Resources/HTTPBin.org/httpbinorg_03172020.cer deleted file mode 100644 index b2b0c26c417e32f158c82dd1c400d6ba0edcd3af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1393 zcmXqLV$C&ZVhLTq%*4pVB*4ZKYxm`X-q(X`IQus9S*|wVW#iOp^Jx3d%gD&h%3$DT z$Zf#M#vIDRCd?EXY{(Ck2XeTC*&K5dtMc;qznwA48#mY41_=?F$;5Nl#~=CW#;MS7o{6C zF)ATDiIJ6oxrvdV0VvMJ)Wpchu;%=poXy+~X}u{~Jh~lI1izVupX#y5iw=;!XlTO` zvRN-&J~nYqe(oQ~i%To{C#?VW;dmgM=-jlKk1Kj}RkNCGK8D?%$h5&HT!n` z0tas2{3Nc^!&tMZH%X|*cE^R1YqD0?H=Gv#X)BX} zTJ+YI@Rv)I8NJjV8Rupzo>yAHH@jZ4_3AgK>{DMi1xO@K^8Z{CrS-=9qs|7`YF`*-IeJo4*D0~?`C3VWMEv}#MElg#MEdY4-7$BWflno zu?CUIC24Fy3#zA1vROQZU42?f^iSIh2C^Upd@N!tBIlm5OLLa9mkFB-NhJT#3CsU= z(8E9#BrV7yXCTvr91BgnT6)Nl!Us~u&&c?ng@u`kbpgawRTeP=5jGBOHbz!fc4kI6 zi^;$mq+FiG!~huA3-lJ~v}u71v(nd3F3Qm>PEIsT(n|!Vrjnx4;u5{&{9JvAC{W%& z0i;=hMbbdrfSZjoq0NJ_?QaevlK}@CTY4i8BNL-RDamyXJNcn$;86M()fj?@gu`~ zhBAgFJ2@w8k%$m!-z~i8OnL#Ajp+=QpVIetJT5=WcY^nh00RSK#$QIe0tN;aW(Icy zS0+VgJTsuwne(%2%lz8#L=k&}&x@Qgc{y&l#dhbo~gSAWw`rcYROE%>Hun}Y~ ze|ot1q0_&Ai+tQyoYxZWWn|jsUdT|&kRM#O#_)ro-efw+pvl&| ziDQ=eO<{<=_6NZBx*51IDFp65QNFwX?|wy9<sc1mXs=(3%m{l1W0)^e97AI`t zz5YYvKjU#LjZY8w<#v0ANCYkZx3?#@?ojsM31>OpOl^$la{er^PC)u4&MW0j;^Sx=#SQe`6Dx%o@)~F%7cV&>F;&Z86ubcnw)^z6Z z$ewTZxSw0$sN#ZkpTyhV3Uy40%3yZZ-Ev<=^sc~)Nv~S#AFe+0^Xr4tQ)@-aVoO@d}6nGg~!vk%WoCrbng3fXoh<2nd-EUx!0@JFC3a~ zxh`wsl-~zz&9B9k-G4aaM4p2C^OTco8~+}zT97gI-1Npa#gp3kB8FK()n6HSn(fyv Hy}1GaF3$Q) diff --git a/Tests/Tests/AFAutoPurgingImageCacheTests.m b/Tests/Tests/AFAutoPurgingImageCacheTests.m index d5679151c0..2e2b83f954 100644 --- a/Tests/Tests/AFAutoPurgingImageCacheTests.m +++ b/Tests/Tests/AFAutoPurgingImageCacheTests.m @@ -211,7 +211,7 @@ - (void)testThatPrioritizedImagesWithOldestLastAccessDatesAreRemovedDuringPurge [self.cache addImage:self.testImage withIdentifier:identifier]; } - NSString * firstIdentifier = [NSString stringWithFormat:@"image-%ld",(long)0]; + NSString *firstIdentifier = [NSString stringWithFormat:@"image-%ld",(long)0]; UIImage *firstImage = [self.cache imageWithIdentifier:firstIdentifier]; XCTAssertNotNil(firstImage, @"first image should not be nil"); UInt64 prePurgeMemoryUsage = self.cache.memoryUsage; diff --git a/Tests/Tests/AFCompoundResponseSerializerTests.m b/Tests/Tests/AFCompoundResponseSerializerTests.m index c399c24da1..894158f3ea 100644 --- a/Tests/Tests/AFCompoundResponseSerializerTests.m +++ b/Tests/Tests/AFCompoundResponseSerializerTests.m @@ -81,9 +81,9 @@ - (void)testCompoundSerializerCanBeArchivedAndUnarchived { AFImageResponseSerializer *imageSerializer = [AFImageResponseSerializer serializer]; AFJSONResponseSerializer *jsonSerializer = [AFJSONResponseSerializer serializer]; AFCompoundResponseSerializer *compoundSerializer = [AFCompoundResponseSerializer compoundSerializerWithResponseSerializers:@[imageSerializer, jsonSerializer]]; - NSData *data = [NSKeyedArchiver archivedDataWithRootObject:compoundSerializer]; + NSData *data = [self archivedDataWithRootObject:compoundSerializer]; XCTAssertNotNil(data); - AFCompoundResponseSerializer *unarchivedSerializer = [NSKeyedUnarchiver unarchiveObjectWithData:data]; + AFCompoundResponseSerializer *unarchivedSerializer = [self unarchivedObjectOfClass:[AFCompoundResponseSerializer class] fromData:data]; XCTAssertNotNil(unarchivedSerializer); XCTAssertNotEqual(unarchivedSerializer, compoundSerializer); XCTAssertTrue(compoundSerializer.responseSerializers.count == compoundSerializer.responseSerializers.count); diff --git a/Tests/Tests/AFHTTPSessionManagerTests.m b/Tests/Tests/AFHTTPSessionManagerTests.m index 2cc40cad7e..a6c7b1b2f2 100644 --- a/Tests/Tests/AFHTTPSessionManagerTests.m +++ b/Tests/Tests/AFHTTPSessionManagerTests.m @@ -207,13 +207,13 @@ - (void)testSupportsSecureCoding { } - (void)testCanBeEncoded { - NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self.sessionManager]; + NSData *data = [self archivedDataWithRootObject:self.sessionManager]; XCTAssertNotNil(data); } - (void)testCanBeDecoded { - NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self.sessionManager]; - AFHTTPSessionManager *newManager = [NSKeyedUnarchiver unarchiveObjectWithData:data]; + NSData *data = [self archivedDataWithRootObject:self.sessionManager]; + AFHTTPSessionManager *newManager = [self unarchivedObjectOfClass:[AFHTTPSessionManager class] fromData:data];; XCTAssertNotNil(newManager.securityPolicy); XCTAssertNotNil(newManager.requestSerializer); XCTAssertNotNil(newManager.responseSerializer); @@ -294,75 +294,6 @@ - (void)testUploadProgressIsReportedForStreamingPost { [self waitForExpectationsWithCommonTimeout]; } -# pragma mark - Deprecated Progress - -- (void)testDownloadProgressIsReportedForDeprecatedGET { - __weak XCTestExpectation *expectation = [self expectationWithDescription:@"Progress Should equal 1.0"]; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - [self.sessionManager - GET:@"image" - parameters:nil - progress:^(NSProgress * _Nonnull downloadProgress) { - if (downloadProgress.fractionCompleted == 1.0) { - [expectation fulfill]; - } - } - success:nil - failure:nil]; -#pragma clang diagnostic pop - [self waitForExpectationsWithCommonTimeout]; -} - -- (void)testUploadProgressIsReportedForDeprecatedPOST { - NSMutableString *payload = [NSMutableString stringWithString:@"AFNetworking"]; - while ([payload lengthOfBytesUsingEncoding:NSUTF8StringEncoding] < 20000) { - [payload appendString:@"AFNetworking"]; - } - - __weak XCTestExpectation *expectation = [self expectationWithDescription:@"Progress Should equal 1.0"]; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - [self.sessionManager - POST:@"post" - parameters:payload - progress:^(NSProgress * _Nonnull uploadProgress) { - if (uploadProgress.fractionCompleted == 1.0) { - [expectation fulfill]; - } - } - success:nil - failure:nil]; -#pragma clang diagnostic pop - [self waitForExpectationsWithCommonTimeout]; -} - -- (void)testUploadProgressIsReportedForStreamingDeprecatedPost { - NSMutableString *payload = [NSMutableString stringWithString:@"AFNetworking"]; - while ([payload lengthOfBytesUsingEncoding:NSUTF8StringEncoding] < 20000) { - [payload appendString:@"AFNetworking"]; - } - - __weak XCTestExpectation *expectation = [self expectationWithDescription:@"Progress Should equal 1.0"]; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - [self.sessionManager - POST:@"post" - parameters:nil - constructingBodyWithBlock:^(id _Nonnull formData) { - [formData appendPartWithFileData:[payload dataUsingEncoding:NSUTF8StringEncoding] name:@"AFNetworking" fileName:@"AFNetworking" mimeType:@"text/html"]; - } - progress:^(NSProgress * _Nonnull uploadProgress) { - if (uploadProgress.fractionCompleted == 1.0) { - [expectation fulfill]; - } - } - success:nil - failure:nil]; -#pragma clang diagnostic pop - [self waitForExpectationsWithCommonTimeout]; -} - # pragma mark - HTTP Status Codes - (void)testThatSuccessBlockIsCalledFor200 { @@ -526,186 +457,6 @@ - (void)testPATCH { [self waitForExpectationsWithCommonTimeout]; } -#pragma mark - Deprecated Rest Interface - -- (void)testDeprecatedGETWithoutProgress { - XCTestExpectation *expectation = [self expectationWithDescription:@"Request should succeed"]; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - [self.sessionManager - GET:@"get" - parameters:nil - success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { - XCTAssertNotNil(responseObject); - [expectation fulfill]; - } - failure:nil]; -#pragma clang diagnostic pop - [self waitForExpectationsWithCommonTimeout]; -} - -- (void)testDeprecatedPOSTWithoutProgress { - XCTestExpectation *expectation = [self expectationWithDescription:@"Request should succeed"]; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - [self.sessionManager - POST:@"post" - parameters:@{@"key":@"value"} - success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { - XCTAssertTrue([responseObject[@"form"][@"key"] isEqualToString:@"value"]); - [expectation fulfill]; - } - failure:nil]; -#pragma clang diagnostic pop - [self waitForExpectationsWithCommonTimeout]; -} - -- (void)testDeprecatedPOSTWithoutProgressWithConstructingBody { - XCTestExpectation *expectation = [self expectationWithDescription:@"Request should succeed"]; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - [self.sessionManager - POST:@"post" - parameters:@{@"key":@"value"} - constructingBodyWithBlock:^(id _Nonnull formData) { - [formData appendPartWithFileData:[@"Data" dataUsingEncoding:NSUTF8StringEncoding] - name:@"DataName" - fileName:@"DataFileName" - mimeType:@"data"]; - } - success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { - XCTAssertTrue([responseObject[@"files"][@"DataName"] isEqualToString:@"Data"]); - XCTAssertTrue([responseObject[@"form"][@"key"] isEqualToString:@"value"]); - [expectation fulfill]; - } - failure:nil]; -#pragma clang diagnostic pop - [self waitForExpectationsWithCommonTimeout]; -} - - -- (void)testDeprecatedGETWithoutHeaders { - XCTestExpectation *expectation = [self expectationWithDescription:@"Request should succeed"]; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - [self.sessionManager - GET:@"get" - parameters:nil - progress:nil - success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { - XCTAssertNotNil(responseObject); - [expectation fulfill]; - } - failure:nil]; -#pragma clang diagnostic pop - [self waitForExpectationsWithCommonTimeout]; -} - -- (void)testDeprecatedHEADWithoutHeaders { - XCTestExpectation *expectation = [self expectationWithDescription:@"Request should succeed"]; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - [self.sessionManager - HEAD:@"get" - parameters:nil - success:^(NSURLSessionDataTask * _Nonnull task) { - XCTAssertNotNil(task); - [expectation fulfill]; - } - failure:nil]; -#pragma clang diagnostic pop - [self waitForExpectationsWithCommonTimeout]; -} - -- (void)testDeprecatedPOSTWithoutHeaders { - XCTestExpectation *expectation = [self expectationWithDescription:@"Request should succeed"]; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - [self.sessionManager - POST:@"post" - parameters:@{@"key":@"value"} - progress:nil - success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { - XCTAssertTrue([responseObject[@"form"][@"key"] isEqualToString:@"value"]); - [expectation fulfill]; - } - failure:nil]; -#pragma clang diagnostic pop - [self waitForExpectationsWithCommonTimeout]; -} - -- (void)testDeprecatedPOSTWithoutHeadersWithConstructingBody { - XCTestExpectation *expectation = [self expectationWithDescription:@"Request should succeed"]; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - [self.sessionManager - POST:@"post" - parameters:@{@"key":@"value"} - constructingBodyWithBlock:^(id _Nonnull formData) { - [formData appendPartWithFileData:[@"Data" dataUsingEncoding:NSUTF8StringEncoding] - name:@"DataName" - fileName:@"DataFileName" - mimeType:@"data"]; - } - progress:nil - success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { - XCTAssertTrue([responseObject[@"files"][@"DataName"] isEqualToString:@"Data"]); - XCTAssertTrue([responseObject[@"form"][@"key"] isEqualToString:@"value"]); - [expectation fulfill]; - } - failure:nil]; -#pragma clang diagnostic pop - [self waitForExpectationsWithCommonTimeout]; -} - -- (void)testDeprecatedPUTWithoutHeaders { - XCTestExpectation *expectation = [self expectationWithDescription:@"Request should succeed"]; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - [self.sessionManager - PUT:@"put" - parameters:@{@"key":@"value"} - success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { - XCTAssertTrue([responseObject[@"form"][@"key"] isEqualToString:@"value"]); - [expectation fulfill]; - } - failure:nil]; -#pragma clang diagnostic pop - [self waitForExpectationsWithCommonTimeout]; -} - -- (void)testDeprecatedDELETEWithoutHeaders { - XCTestExpectation *expectation = [self expectationWithDescription:@"Request should succeed"]; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - [self.sessionManager - DELETE:@"delete" - parameters:@{@"key":@"value"} - success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { - XCTAssertTrue([responseObject[@"args"][@"key"] isEqualToString:@"value"]); - [expectation fulfill]; - } - failure:nil]; -#pragma clang diagnostic pop - [self waitForExpectationsWithCommonTimeout]; -} - -- (void)testDeprecatedPATCHWithoutHeaders { - XCTestExpectation *expectation = [self expectationWithDescription:@"Request should succeed"]; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - [self.sessionManager - PATCH:@"patch" - parameters:@{@"key":@"value"} - success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { - XCTAssertTrue([responseObject[@"form"][@"key"] isEqualToString:@"value"]); - [expectation fulfill]; - } - failure:nil]; -#pragma clang diagnostic pop - [self waitForExpectationsWithCommonTimeout]; -} - #pragma mark - Auth - (void)testHiddenBasicAuthentication { @@ -833,16 +584,17 @@ - (void)testInvalidServerTrustProducesCorrectErrorForPublicKeyPinning { - (void)testAuthenticationChallengeHandlerCredentialResult { __weak XCTestExpectation *expectation = [self expectationWithDescription:@"Request succeed with provided credentials"]; - self.manager.responseSerializer = [AFHTTPResponseSerializer serializer]; - [self.manager setAuthenticationChallengeHandler:^id _Nonnull(NSURLSession * _Nonnull session, NSURLSessionTask * _Nonnull task, NSURLAuthenticationChallenge * _Nonnull challenge, void (^ _Nonnull completionHandler)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable)) { + self.sessionManager.responseSerializer = [AFHTTPResponseSerializer serializer]; + [self.sessionManager setAuthenticationChallengeHandler:^id _Nonnull(NSURLSession * _Nonnull session, NSURLSessionTask * _Nonnull task, NSURLAuthenticationChallenge * _Nonnull challenge, void (^ _Nonnull completionHandler)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable)) { if ([challenge.protectionSpace.realm isEqualToString:@"Fake Realm"]) { return [NSURLCredential credentialWithUser:@"user" password:@"passwd" persistence:NSURLCredentialPersistenceNone]; } return @(NSURLSessionAuthChallengePerformDefaultHandling); }]; - [self.manager + [self.sessionManager GET:@"basic-auth/user/passwd" parameters:nil + headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { [expectation fulfill]; @@ -852,7 +604,6 @@ - (void)testAuthenticationChallengeHandlerCredentialResult { [expectation fulfill]; }]; [self waitForExpectationsWithCommonTimeoutUsingHandler:nil]; - [self.manager invalidateSessionCancelingTasks:YES]; } @end diff --git a/Tests/Tests/AFImageResponseSerializerTests.m b/Tests/Tests/AFImageResponseSerializerTests.m index b075041736..c65587c60f 100644 --- a/Tests/Tests/AFImageResponseSerializerTests.m +++ b/Tests/Tests/AFImageResponseSerializerTests.m @@ -56,11 +56,11 @@ - (void)testImageSerializerSupportsSecureCoding { - (void)testImageSerializerCanBeArchivedAndUnarchived { AFImageResponseSerializer *responseSerializer = [AFImageResponseSerializer serializer]; - NSData *archive = nil; + NSData *archive = nil; - archive = [NSKeyedArchiver archivedDataWithRootObject:responseSerializer]; + archive = [self archivedDataWithRootObject:responseSerializer]; XCTAssertNotNil(archive); - AFImageResponseSerializer *unarchivedSerializer = [NSKeyedUnarchiver unarchiveObjectWithData:archive]; + AFImageResponseSerializer *unarchivedSerializer = [self unarchivedObjectOfClass:[AFImageResponseSerializer class] fromData:archive]; XCTAssertNotNil(unarchivedSerializer); XCTAssertNotEqual(unarchivedSerializer, responseSerializer); XCTAssertTrue([unarchivedSerializer.acceptableContentTypes isEqualToSet:responseSerializer.acceptableContentTypes]); @@ -83,9 +83,9 @@ - (void)testImageSerializerCanBeArchivedAndUnarchivedWithNonDefaultPropertyValue responseSerializer.imageScale = responseSerializer.imageScale * 2.0f; #endif - archive = [NSKeyedArchiver archivedDataWithRootObject:responseSerializer]; + archive = [self archivedDataWithRootObject:responseSerializer]; XCTAssertNotNil(archive); - AFImageResponseSerializer *unarchivedSerializer = [NSKeyedUnarchiver unarchiveObjectWithData:archive]; + AFImageResponseSerializer *unarchivedSerializer = [self unarchivedObjectOfClass:[AFImageResponseSerializer class] fromData:archive]; XCTAssertNotNil(unarchivedSerializer); XCTAssertNotEqual(unarchivedSerializer, responseSerializer); diff --git a/Tests/Tests/AFJSONSerializationTests.m b/Tests/Tests/AFJSONSerializationTests.m index 8be5bfeccd..e17b1932a3 100644 --- a/Tests/Tests/AFJSONSerializationTests.m +++ b/Tests/Tests/AFJSONSerializationTests.m @@ -206,4 +206,23 @@ - (void)testThatJSONResponseSerializerCanBeCopied { XCTAssertEqual(copiedSerializer.removesKeysWithNullValues, self.responseSerializer.removesKeysWithNullValues); } +#pragma mark NSSecureCoding + +- (void)testJSONSerializerSupportsSecureCoding { + XCTAssertTrue([AFJSONResponseSerializer supportsSecureCoding]); +} + +- (void)testJSONSerializerCanBeArchivedAndUnarchived { + AFJSONResponseSerializer *responseSerializer = [AFJSONResponseSerializer serializer]; + NSData *archive = nil; + + archive = [self archivedDataWithRootObject:responseSerializer]; + XCTAssertNotNil(archive); + AFJSONResponseSerializer *unarchivedSerializer = [self unarchivedObjectOfClass:[AFJSONResponseSerializer class] fromData:archive]; + XCTAssertNotNil(unarchivedSerializer); + XCTAssertNotEqual(unarchivedSerializer, responseSerializer); + XCTAssertTrue([unarchivedSerializer.acceptableContentTypes isEqualToSet:responseSerializer.acceptableContentTypes]); + XCTAssertTrue([unarchivedSerializer.acceptableStatusCodes isEqualToIndexSet:responseSerializer.acceptableStatusCodes]); +} + @end diff --git a/Tests/Tests/AFPropertyListResponseSerializerTests.m b/Tests/Tests/AFPropertyListResponseSerializerTests.m index ec5953e1c0..7bbeb57f9d 100644 --- a/Tests/Tests/AFPropertyListResponseSerializerTests.m +++ b/Tests/Tests/AFPropertyListResponseSerializerTests.m @@ -82,9 +82,9 @@ - (void)testResponseSerializerCanBeCopied { } - (void)testResponseSerializerCanBeArchivedAndUnarchived { - NSData *archive = [NSKeyedArchiver archivedDataWithRootObject:self.responseSerializer]; + NSData *archive = [self archivedDataWithRootObject:self.responseSerializer]; XCTAssertNotNil(archive); - AFPropertyListResponseSerializer *unarchivedSerializer = [NSKeyedUnarchiver unarchiveObjectWithData:archive]; + AFPropertyListResponseSerializer *unarchivedSerializer = [self unarchivedObjectOfClass:[AFPropertyListResponseSerializer class] fromData:archive]; XCTAssertNotNil(unarchivedSerializer); XCTAssertNotEqual(unarchivedSerializer, self.responseSerializer); XCTAssertTrue(unarchivedSerializer.format == self.responseSerializer.format); diff --git a/Tests/Tests/AFSecurityPolicyTests.m b/Tests/Tests/AFSecurityPolicyTests.m index 790f9906c3..ff81dcd5d6 100644 --- a/Tests/Tests/AFSecurityPolicyTests.m +++ b/Tests/Tests/AFSecurityPolicyTests.m @@ -58,7 +58,7 @@ static SecTrustRef AFUTADNNetServerTrust() { } static SecCertificateRef AFUTHTTPBinOrgCertificate() { - NSString *certPath = [[NSBundle bundleForClass:[AFSecurityPolicyTests class]] pathForResource:@"httpbinorg_03172020" ofType:@"cer"]; + NSString *certPath = [[NSBundle bundleForClass:[AFSecurityPolicyTests class]] pathForResource:@"httpbinorg_02182021" ofType:@"cer"]; NSCAssert(certPath != nil, @"Path for certificate should not be nil"); NSData *certData = [NSData dataWithContentsOfFile:certPath]; @@ -552,13 +552,8 @@ - (void)testThatPolicyCanBeEncodedAndDecoded { policy.validatesDomainName = NO; policy.pinnedCertificates = [NSSet setWithObject:(__bridge_transfer id)SecCertificateCopyData(AFUTHTTPBinOrgCertificate())]; - NSMutableData *archiveData = [NSMutableData new]; - NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:archiveData]; - [archiver encodeObject:policy forKey:@"policy"]; - [archiver finishEncoding]; - - NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:archiveData]; - AFSecurityPolicy *unarchivedPolicy = [unarchiver decodeObjectOfClass:[AFSecurityPolicy class] forKey:@"policy"]; + NSData *archive = [self archivedDataWithRootObject:policy]; + AFSecurityPolicy *unarchivedPolicy = [self unarchivedObjectOfClass:[AFSecurityPolicy class] fromData:archive]; XCTAssertNotEqual(unarchivedPolicy, policy); XCTAssertEqual(unarchivedPolicy.allowInvalidCertificates, policy.allowInvalidCertificates); diff --git a/Tests/Tests/AFTestCase.h b/Tests/Tests/AFTestCase.h index b57e088531..2d508a7c24 100644 --- a/Tests/Tests/AFTestCase.h +++ b/Tests/Tests/AFTestCase.h @@ -33,5 +33,7 @@ - (void)waitForExpectationsWithCommonTimeout; - (void)waitForExpectationsWithCommonTimeoutUsingHandler:(XCWaitCompletionHandler)handler; +- (NSData *)archivedDataWithRootObject:(id)object; +- (id)unarchivedObjectOfClass:(Class)class fromData:(NSData *)data; @end diff --git a/Tests/Tests/AFTestCase.m b/Tests/Tests/AFTestCase.m index 4726807b8f..00bac17f29 100644 --- a/Tests/Tests/AFTestCase.m +++ b/Tests/Tests/AFTestCase.m @@ -63,4 +63,18 @@ - (void)waitForExpectationsWithCommonTimeoutUsingHandler:(XCWaitCompletionHandle [self waitForExpectationsWithTimeout:self.networkTimeout handler:handler]; } +- (NSData *)archivedDataWithRootObject:(id)object { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + return [NSKeyedArchiver archivedDataWithRootObject:object]; +#pragma clang diagnostic pop +} + +- (id)unarchivedObjectOfClass:(Class)class fromData:(NSData *)data { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + return [NSKeyedUnarchiver unarchiveObjectWithData:data]; +#pragma clang diagnostic pop +} + @end diff --git a/Tests/Tests/AFUIActivityIndicatorViewTests.m b/Tests/Tests/AFUIActivityIndicatorViewTests.m index 94094c02ba..ed591c9ec6 100644 --- a/Tests/Tests/AFUIActivityIndicatorViewTests.m +++ b/Tests/Tests/AFUIActivityIndicatorViewTests.m @@ -33,7 +33,11 @@ @implementation AFUIActivityIndicatorViewTests - (void)setUp { [super setUp]; +#if TARGET_OS_MACCATALYST + self.activityIndicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleMedium]; +#else self.activityIndicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; +#endif self.request = [NSURLRequest requestWithURL:self.delayURL]; self.sessionManager = [[AFURLSessionManager alloc] initWithSessionConfiguration:nil]; } diff --git a/UIKit+AFNetworking/AFImageDownloader.h b/UIKit+AFNetworking/AFImageDownloader.h index 7e25e3734d..3bf5a32025 100644 --- a/UIKit+AFNetworking/AFImageDownloader.h +++ b/UIKit+AFNetworking/AFImageDownloader.h @@ -67,7 +67,7 @@ typedef NS_ENUM(NSInteger, AFImageDownloadPrioritization) { /** Defines the order prioritization of incoming download requests being inserted into the queue. `AFImageDownloadPrioritizationFIFO` by default. */ -@property (nonatomic, assign) AFImageDownloadPrioritization downloadPrioritizaton; +@property (nonatomic, assign) AFImageDownloadPrioritization downloadPrioritization; /** The shared default instance of `AFImageDownloader` initialized with default values. diff --git a/UIKit+AFNetworking/AFImageDownloader.m b/UIKit+AFNetworking/AFImageDownloader.m index 0385fe28e5..008a78286d 100644 --- a/UIKit+AFNetworking/AFImageDownloader.m +++ b/UIKit+AFNetworking/AFImageDownloader.m @@ -109,20 +109,24 @@ @interface AFImageDownloader () @implementation AFImageDownloader + (NSURLCache *)defaultURLCache { + NSUInteger memoryCapacity = 20 * 1024 * 1024; // 20MB + NSUInteger diskCapacity = 150 * 1024 * 1024; // 150MB + NSURL *cacheURL = [[[NSFileManager defaultManager] URLForDirectory:NSCachesDirectory + inDomain:NSUserDomainMask + appropriateForURL:nil + create:YES + error:nil] + URLByAppendingPathComponent:@"com.alamofire.imagedownloader"]; - // It's been discovered that a crash will occur on certain versions - // of iOS if you customize the cache. - // - // More info can be found here: https://devforums.apple.com/message/1102182#1102182 - // - // When iOS 7 support is dropped, this should be modified to use - // NSProcessInfo methods instead. - if ([[[UIDevice currentDevice] systemVersion] compare:@"8.2" options:NSNumericSearch] == NSOrderedAscending) { - return [NSURLCache sharedURLCache]; - } - return [[NSURLCache alloc] initWithMemoryCapacity:20 * 1024 * 1024 - diskCapacity:150 * 1024 * 1024 - diskPath:@"com.alamofire.imagedownloader"]; +#if TARGET_OS_MACCATALYST + return [[NSURLCache alloc] initWithMemoryCapacity:memoryCapacity + diskCapacity:diskCapacity + directoryURL:cacheURL]; +#else + return [[NSURLCache alloc] initWithMemoryCapacity:memoryCapacity + diskCapacity:diskCapacity + diskPath:[cacheURL path]]; +#endif } + (NSURLSessionConfiguration *)defaultURLSessionConfiguration { @@ -163,7 +167,7 @@ - (instancetype)initWithSessionManager:(AFHTTPSessionManager *)sessionManager if (self = [super init]) { self.sessionManager = sessionManager; - self.downloadPrioritizaton = downloadPrioritization; + self.downloadPrioritization = downloadPrioritization; self.maximumActiveDownloads = maximumActiveDownloads; self.imageCache = imageCache; @@ -383,7 +387,7 @@ - (void)startMergedTask:(AFImageDownloaderMergedTask *)mergedTask { } - (void)enqueueMergedTask:(AFImageDownloaderMergedTask *)mergedTask { - switch (self.downloadPrioritizaton) { + switch (self.downloadPrioritization) { case AFImageDownloadPrioritizationFIFO: [self.queuedMergedTasks addObject:mergedTask]; break; diff --git a/fastlane/.env.catalyst b/fastlane/.env.catalyst new file mode 100644 index 0000000000..37ecfc1f78 --- /dev/null +++ b/fastlane/.env.catalyst @@ -0,0 +1,2 @@ +SCAN_SCHEME="AFNetworking iOS" +SCAN_DESTINATION="platform=macOS" diff --git a/fastlane/.env.default b/fastlane/.env.default index bf9d815f1e..4abfaec165 100644 --- a/fastlane/.env.default +++ b/fastlane/.env.default @@ -1,14 +1,4 @@ -AF_IOS_SDK=iphonesimulator13.0 -AF_MAC_SDK=macosx10.15 -AF_TVOS_SDK=appletvsimulator13.0 - AF_CONFIGURATION=Release SCAN_WORKSPACE=$AF_WORKSPACE -SCAN_SCHEME=$AF_IOS_FRAMEWORK_SCHEME -SCAN_SDK=$AF_IOS_SDK SCAN_OUTPUT_DIRECTORY=fastlane/test-output - -EXAMPLE_WORKSPACE=$AF_WORKSPACE -EXAMPLE_SCHEME=$AF_IOS_EXAMPLE_SCHEME -EXAMPLE_DESTINATION="platform=iOS Simulator,name=iPhone 8" diff --git a/fastlane/.env.ios11_xcode9 b/fastlane/.env.ios11_xcode9 deleted file mode 100644 index e886bbffb6..0000000000 --- a/fastlane/.env.ios11_xcode9 +++ /dev/null @@ -1,3 +0,0 @@ -SCAN_DEVICE="iPhone 8" -SCAN_SDK=iphonesimulator11.0 -EXAMPLE_DESTINATION="platform=iOS Simulator,name=iPhone 8" diff --git a/fastlane/.env.ios11_xcode91 b/fastlane/.env.ios11_xcode91 deleted file mode 100644 index 30c1a68adf..0000000000 --- a/fastlane/.env.ios11_xcode91 +++ /dev/null @@ -1,3 +0,0 @@ -SCAN_DEVICE="iPhone 8" -SCAN_SDK=iphonesimulator11.1 -EXAMPLE_DESTINATION="platform=iOS Simulator,name=iPhone 8" diff --git a/fastlane/.env.ios11_xcode92 b/fastlane/.env.ios11_xcode92 deleted file mode 100644 index 55ecee3cb8..0000000000 --- a/fastlane/.env.ios11_xcode92 +++ /dev/null @@ -1,3 +0,0 @@ -SCAN_DEVICE="iPhone 8" -SCAN_SDK=iphonesimulator11.2 -EXAMPLE_DESTINATION="platform=iOS Simulator,name=iPhone 8" diff --git a/fastlane/.env.ios11_xcode93 b/fastlane/.env.ios11_xcode93 deleted file mode 100644 index c96dad75c8..0000000000 --- a/fastlane/.env.ios11_xcode93 +++ /dev/null @@ -1,3 +0,0 @@ -SCAN_DEVICE="iPhone 8" -SCAN_SDK=iphonesimulator11.3 -EXAMPLE_DESTINATION="platform=iOS Simulator,name=iPhone 8" diff --git a/fastlane/.env.ios11_xcode94 b/fastlane/.env.ios11_xcode94 index d27768fdf2..f91d853efb 100644 --- a/fastlane/.env.ios11_xcode94 +++ b/fastlane/.env.ios11_xcode94 @@ -1,3 +1,2 @@ -SCAN_DEVICE="iPhone 8" -SCAN_SDK=iphonesimulator11.4 -EXAMPLE_DESTINATION="platform=iOS Simulator,name=iPhone 8" +SCAN_DEVICE="iPhone X" +SCAN_SCHEME="AFNetworking iOS" diff --git a/fastlane/.env.ios12_xcode10 b/fastlane/.env.ios12_xcode10 index dddba54385..85d5de099d 100644 --- a/fastlane/.env.ios12_xcode10 +++ b/fastlane/.env.ios12_xcode10 @@ -1,3 +1,3 @@ -SCAN_DEVICE="iPhone 8" -SCAN_SDK=iphonesimulator12.0 -EXAMPLE_DESTINATION="platform=iOS Simulator,name=iPhone 8" +SCAN_DEVICE="iPhone XS" +SCAN_SCHEME="AFNetworking iOS" +SCAN_DESTINATION="OS=12.4,name=iPhone XS" diff --git a/fastlane/.env.ios13_xcode11 b/fastlane/.env.ios13_xcode11 index f5c776fea5..bcafbadf1e 100644 --- a/fastlane/.env.ios13_xcode11 +++ b/fastlane/.env.ios13_xcode11 @@ -1,3 +1,3 @@ -SCAN_DEVICE="iPhone 8" -SCAN_SDK=$AF_IOS_SDK -EXAMPLE_DESTINATION="platform=iOS Simulator,name=iPhone 8" +SCAN_DEVICE="iPhone 11 Pro" +SCAN_SCHEME="AFNetworking iOS" +SCAN_DESTINATION="OS=13.3,name=iPhone 11 Pro" diff --git a/fastlane/.env.macos b/fastlane/.env.macos index 223e5c66d1..dded8b5128 100644 --- a/fastlane/.env.macos +++ b/fastlane/.env.macos @@ -1,5 +1,2 @@ -SCAN_SCHEME=$AF_OSX_FRAMEWORK_SCHEME -SCAN_SDK="macosx10.15" - -EXAMPLE_SCHEME=$AF_OSX_EXAMPLE_SCHEME -EXAMPLE_DESTINATION="platform=macOS" +SCAN_SCHEME="AFNetworking macOS" +SCAN_DESTINATION="platform=macOS" diff --git a/fastlane/.env.tvos13_xcode11 b/fastlane/.env.tvos13_xcode11 index 2d805b350d..7f797226ad 100644 --- a/fastlane/.env.tvos13_xcode11 +++ b/fastlane/.env.tvos13_xcode11 @@ -1,6 +1,3 @@ -SCAN_SCHEME=$AF_TVOS_FRAMEWORK_SCHEME +SCAN_SCHEME="AFNetworking tvOS" SCAN_DEVICE="Apple TV 4K" -SCAN_SDK=$AF_TVOS_SDK - -EXAMPLE_SCHEME=$AF_TVOS_EXAMPLE_SCHEME -EXAMPLE_DESTINATION="platform=tvOS Simulator,name=Apple TV 4K" +SCAN_DESTINATION="OS=13.3,name=Apple TV 4K" diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 5cb97727ff..5e53259441 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -1,4 +1,4 @@ import_from_git( url: 'https://github.com/AFNetworking/fastlane.git', - branch: '0.0.8' + branch: 'master' ) From 6ec99c9134c7eef2c10a93a80bd26db33f921bb4 Mon Sep 17 00:00:00 2001 From: Jon Shier Date: Sun, 29 Mar 2020 16:48:58 -0400 Subject: [PATCH 133/159] Prepare 4.0.0. (#4527) --- AFNetworking/AFURLSessionManager.m | 1 - CHANGELOG.md | 79 ++++++++++++++++++++++++++++++ README.md | 9 +--- 3 files changed, 81 insertions(+), 8 deletions(-) diff --git a/AFNetworking/AFURLSessionManager.m b/AFNetworking/AFURLSessionManager.m index a976c51191..d23bd33c27 100644 --- a/AFNetworking/AFURLSessionManager.m +++ b/AFNetworking/AFURLSessionManager.m @@ -85,7 +85,6 @@ static dispatch_group_t url_session_manager_completion_group() { typedef void (^AFURLSessionTaskCompletionHandler)(NSURLResponse *response, id responseObject, NSError *error); - #pragma mark - @interface AFURLSessionManagerTaskDelegate : NSObject diff --git a/CHANGELOG.md b/CHANGELOG.md index 3699a0bb58..e2e7617e27 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,85 @@ All notable changes to this project will be documented in this file. --- +## [4.0.0](https://github.com/AFNetworking/AFNetworking/releases/tag/4.0.0) (03/29/2020) +Released on Sunday, March 29, 2020. All issues associated with this milestone can be found using this [filter](https://github.com/AFNetworking/AFNetworking/milestone/16?closed=1). + +#### Added +* Notificate when a downloaded file has been moved successfully. + * Implemented by xingheng in [#4393](https://github.com/AFNetworking/AFNetworking/pull/4393). +* Specific error for certificate pinning failure. + * Implemented by 0xced in [#3425](https://github.com/AFNetworking/AFNetworking/pull/3425). +* `WKWebView` extensions. + * Implemented by tjanela in [#4439](https://github.com/AFNetworking/AFNetworking/pull/4439). +* Automatic location of certificates in the main bundle for certificate pinning. + * Implemented by 0xced in [#3752](https://github.com/AFNetworking/AFNetworking/pull/3752). +* User-Agent support for tvOS. + * Implemented by ghking in [#4014](https://github.com/AFNetworking/AFNetworking/pull/4014). +* Ability for `AFHTTPSessionManager` to recreate its underlying `NSURLSession`. + * Implemented by Kaspik in [#4256](https://github.com/AFNetworking/AFNetworking/pull/4256). +* Ability to set HTTP headers per request. + * Implemented by stnslw in [#4113](https://github.com/AFNetworking/AFNetworking/pull/4113). +* Ability to capture `NSURLSessionTaskMetrics`. + * Implemented by Caelink in [#4237](https://github.com/AFNetworking/AFNetworking/pull/4237). + +#### Updated +* `dataTaskWithHTTPMethod` to be public. + * Implemented by smartinspereira in [#4007](https://github.com/AFNetworking/AFNetworking/pull/4007). +* Reachability notification to include the instance which issued the notification. + * Implemented by LMsgSendNilSelf in [#4051](https://github.com/AFNetworking/AFNetworking/pull/4051). +* `AFJSONObjectByRemovingKeysWithNullValues` to be public. + * Implemented by ashfurrow in [#4051](https://github.com/AFNetworking/AFNetworking/pull/4051). +* `AFJSONObjectByRemovingKeysWithNullValues` to remove `NSNull` values from `NSArray`s. + * Implemented by ashfurrow in [#4052](https://github.com/AFNetworking/AFNetworking/pull/4052). + +#### Changed +* Automated CI to GitHub Actions. + * Implemented by jshier in [#4523](https://github.com/AFNetworking/AFNetworking/pull/4523). + +#### Fixed +* Explicit `NSSecureCoding` support. + * Implemented by jshier in [#4523](https://github.com/AFNetworking/AFNetworking/pull/4523). +* Deprecated API usage on Catalyst. + * Implemented by jshier in [#4523](https://github.com/AFNetworking/AFNetworking/pull/4523). +* Nullability annotations. + * Implemented by jshier in [#4523](https://github.com/AFNetworking/AFNetworking/pull/4523). +* `AFImageDownloader` to more accurately cancel downloads. + * Implemented by kinarobin in [#4407](https://github.com/AFNetworking/AFNetworking/pull/4407). +* Double KVO notifications in `AFNetworkActivityManager`. + * Implemented by kinarobin in [#4406](https://github.com/AFNetworking/AFNetworking/pull/4406). +* Availability annotations around `NSURLSessionTaskMetrics`. + * Implemented by ElfSundae in [#4516](https://github.com/AFNetworking/AFNetworking/pull/4516). +* Issues with `associated_object` and subclasses. + * Implemented by welcommand in [#3872](https://github.com/AFNetworking/AFNetworking/pull/3872). +* Memory leak in example application. + * Implemented by svoit in [#4196](https://github.com/AFNetworking/AFNetworking/pull/4196). +* Crashes in mulithreaded scenarios and `dispatch_barrier`. + * Implemetned by streeter in [#4474](https://github.com/AFNetworking/AFNetworking/pull/4474). +* Issues with `NSSecureCoding`. + * Implemented by ElfSudae in [#4409](https://github.com/AFNetworking/AFNetworking/pull/4409). +* Code style issues. + * Implemented by svoit in [#4200](https://github.com/AFNetworking/AFNetworking/pull/4200). +* Race condition in `AFImageDownloader`. + * Implemented by bbeversdorf in [#4246](https://github.com/AFNetworking/AFNetworking/pull/4246). +* Coding style issues. + * Implemented by LeeHongHwa in [#4002](https://github.com/AFNetworking/AFNetworking/pull/4002). + +#### Removed +* Support for iOS < 9, macOS < 10.10. + * Implemented by jshier in [#4523](https://github.com/AFNetworking/AFNetworking/pull/4523). +* All previously deprecated APIs. + * Implemented by jshier in [#4523](https://github.com/AFNetworking/AFNetworking/pull/4523). +* Unnecessary `__block` capture. + * Implemented by kinarobin in [#4526](https://github.com/AFNetworking/AFNetworking/pull/4526). +* Workaround for `NSURLSessionUploadTask` creation on iOS 7. + * Implemented by kinarobin in [#4525](https://github.com/AFNetworking/AFNetworking/pull/4525). +* Workaround for safe `NSURLSessionTask` creation on iOS < 8. + * Implemented by kinarobin in [#4401](https://github.com/AFNetworking/AFNetworking/pull/4401). +* `UIWebView` extensions. + * Implemented by tjanela in [#4439](https://github.com/AFNetworking/AFNetworking/pull/4439). + +--- + ## [3.2.1](https://github.com/AFNetworking/AFNetworking/releases/tag/3.2.1) (05/04/2018) Released on Friday, May 04, 2018. All issues associated with this milestone can be found using this [filter](https://github.com/AFNetworking/AFNetworking/issues?q=milestone%3A3.2.1+is%3Aclosed). diff --git a/README.md b/README.md index f416c949ad..b5bdae9a79 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,6 @@ AFNetworking is a delightful networking library for iOS, macOS, watchOS, and tvO Perhaps the most important feature of all, however, is the amazing community of developers who use and contribute to AFNetworking every day. AFNetworking powers some of the most popular and critically-acclaimed apps on the iPhone, iPad, and Mac. -Choose AFNetworking for your next project, or migrate over your existing projects—you'll be happy you did! - ## How To Get Started - [Download AFNetworking](https://github.com/AFNetworking/AFNetworking/archive/master.zip) and try out the included Mac and iPhone example apps @@ -39,7 +37,6 @@ To integrate AFNetworking into your Xcode project using CocoaPods, specify it in pod 'AFNetworking', '~> 4.0' ``` - ### Installation with Swift Package Manager Once you have your Swift package set up, adding AFNetworking as a dependency is as easy as adding it to the `dependencies` value of your `Package.swift`. @@ -54,19 +51,17 @@ dependencies: [ ### Installation with Carthage -[Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks. +[Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks. To integrate AFNetworking, add the following to your `Cartfile`. ```ogdl github "AFNetworking/AFNetworking" ~> 4.0 ``` -Run `carthage` to build the framework and drag the built `AFNetworking.framework` into your Xcode project. - ## Requirements | AFNetworking Version | Minimum iOS Target | Minimum macOS Target | Minimum watchOS Target | Minimum tvOS Target | Notes | |:--------------------:|:---------------------------:|:----------------------------:|:----------------------------:|:----------------------------:|:-------------------------------------------------------------------------:| -| 4.x | iOS 9 | macOS 10.10 | watchOS 2.0 | tvOS 9.0 | Xcode +9+ is required. | +| 4.x | iOS 9 | macOS 10.10 | watchOS 2.0 | tvOS 9.0 | Xcode 11+ is required. | | 3.x | iOS 7 | OS X 10.9 | watchOS 2.0 | tvOS 9.0 | Xcode 7+ is required. `NSURLConnectionOperation` support has been removed. | | 2.6 -> 2.6.3 | iOS 7 | OS X 10.9 | watchOS 2.0 | n/a | Xcode 7+ is required. | | 2.0 -> 2.5.4 | iOS 6 | OS X 10.8 | n/a | n/a | Xcode 5+ is required. `NSURLSession` subspec requires iOS 7 or OS X 10.9. | From 03a9156fe0fc872a71cc4d05296e5e8bce74b4fb Mon Sep 17 00:00:00 2001 From: Elf Sundae Date: Mon, 30 Mar 2020 11:38:32 +0800 Subject: [PATCH 134/159] Improve podspec (#4528) * Remove submodules, requires_arc * Removed redundant public_header_files * Fixed bundle identifier for CocoaPods generated framework * Remove prefix_header_contents attribute --- AFNetworking.podspec | 32 +++++++------------------------- 1 file changed, 7 insertions(+), 25 deletions(-) diff --git a/AFNetworking.podspec b/AFNetworking.podspec index 00d0c5094c..b882b3414e 100644 --- a/AFNetworking.podspec +++ b/AFNetworking.podspec @@ -6,35 +6,21 @@ Pod::Spec.new do |s| s.homepage = 'https://github.com/AFNetworking/AFNetworking' s.social_media_url = 'https://twitter.com/AFNetworking' s.authors = { 'Mattt Thompson' => 'm@mattt.me' } - s.source = { :git => 'https://github.com/AFNetworking/AFNetworking.git', :tag => s.version, :submodules => true } - s.requires_arc = true - - s.public_header_files = 'AFNetworking/AFNetworking.h' - s.source_files = 'AFNetworking/AFNetworking.h' - - pch_AF = <<-EOS -#ifndef TARGET_OS_IOS - #define TARGET_OS_IOS TARGET_OS_IPHONE -#endif + s.source = { :git => 'https://github.com/AFNetworking/AFNetworking.git', :tag => s.version } + + s.pod_target_xcconfig = { + 'PRODUCT_BUNDLE_IDENTIFIER' => 'com.alamofire.AFNetworking' + } -#ifndef TARGET_OS_WATCH - #define TARGET_OS_WATCH 0 -#endif + s.source_files = 'AFNetworking/AFNetworking.h' -#ifndef TARGET_OS_TV - #define TARGET_OS_TV 0 -#endif -EOS - s.prefix_header_contents = pch_AF - s.ios.deployment_target = '9.0' s.osx.deployment_target = '10.10' s.watchos.deployment_target = '2.0' s.tvos.deployment_target = '9.0' - + s.subspec 'Serialization' do |ss| ss.source_files = 'AFNetworking/AFURL{Request,Response}Serialization.{h,m}' - ss.public_header_files = 'AFNetworking/AFURL{Request,Response}Serialization.h' ss.watchos.frameworks = 'MobileCoreServices', 'CoreGraphics' ss.ios.frameworks = 'MobileCoreServices', 'CoreGraphics' ss.osx.frameworks = 'CoreServices' @@ -42,7 +28,6 @@ EOS s.subspec 'Security' do |ss| ss.source_files = 'AFNetworking/AFSecurityPolicy.{h,m}' - ss.public_header_files = 'AFNetworking/AFSecurityPolicy.h' ss.frameworks = 'Security' end @@ -52,7 +37,6 @@ EOS ss.tvos.deployment_target = '9.0' ss.source_files = 'AFNetworking/AFNetworkReachabilityManager.{h,m}' - ss.public_header_files = 'AFNetworking/AFNetworkReachabilityManager.h' ss.frameworks = 'SystemConfiguration' end @@ -65,7 +49,6 @@ EOS ss.dependency 'AFNetworking/Security' ss.source_files = 'AFNetworking/AF{URL,HTTP}SessionManager.{h,m}', 'AFNetworking/AFCompatibilityMacros.h' - ss.public_header_files = 'AFNetworking/AF{URL,HTTP}SessionManager.h', 'AFNetworking/AFCompatibilityMacros.h' end s.subspec 'UIKit' do |ss| @@ -73,7 +56,6 @@ EOS ss.tvos.deployment_target = '9.0' ss.dependency 'AFNetworking/NSURLSession' - ss.public_header_files = 'UIKit+AFNetworking/*.h' ss.source_files = 'UIKit+AFNetworking' end end From 16f9a8ceadb5de1ad0a67503596780a6ab172eef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Ka=C5=A1par?= Date: Mon, 30 Mar 2020 19:58:53 +0200 Subject: [PATCH 135/159] (Infra) Make infra changes to cleanup project and simplify its maintenance (#4531) * Update readme, add stale bot, add issue template, add pull request template * Update copy from Alamofire --- .github/issue_template.md | 33 ++++++++++++++++++++++++++++++++ .github/pull_request_template.md | 13 +++++++++++++ .github/stale.yml | 33 ++++++++++++++++++++++++++++++++ README.md | 1 - 4 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 .github/issue_template.md create mode 100644 .github/pull_request_template.md create mode 100644 .github/stale.yml diff --git a/.github/issue_template.md b/.github/issue_template.md new file mode 100644 index 0000000000..7d2ed51c3c --- /dev/null +++ b/.github/issue_template.md @@ -0,0 +1,33 @@ +> ℹ Please fill out this template when filing an issue. +> All lines beginning with an ℹ symbol instruct you with what info we expect. You can delete those lines once you've filled in the info. +> +> Per our [*CONTRIBUTING guidelines](https://github.com/AFNetworking/AFNetworking/blob/master/CONTRIBUTING.md), we use GitHub for +> bugs and feature requests, not general support. Other issues should be opened on Stack Overflow with the tag `afnetworking`. +> +> Please remove this line and everything above it before submitting. + +* [ ] I've read, understood, and done my best to follow the [*CONTRIBUTING guidelines](https://github.com/AFNetworking/AFNetworking/blob/master/CONTRIBUTING.md). + +## What did you do? + +ℹ Please replace this with what you did. + +## What did you expect to happen? + +ℹ Please replace this with what you expected to happen. + +## What happened instead? + +ℹ Please replace this with of what happened instead. + +## AFNetworking Environment + +**AFNetworking version:** +**Xcode version:** +**Swift version:** +**Platform(s) running AFNetworking:** +**macOS version running Xcode:** + +## Demo Project + +ℹ Please link to or upload a project we can download that reproduces the issue. diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000000..6e04c37480 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,13 @@ +### Issue Link :link: + + +### Goals :soccer: + + + +### Implementation Details :construction: + + + +### Testing Details :mag: + diff --git a/.github/stale.yml b/.github/stale.yml new file mode 100644 index 0000000000..65f633c793 --- /dev/null +++ b/.github/stale.yml @@ -0,0 +1,33 @@ +# Configuration for probot-stale - https://github.com/probot/stale + +# Number of days of inactivity before an Issue or Pull Request becomes stale +daysUntilStale: 14 + +# Number of days of inactivity before a stale Issue or Pull Request is closed +daysUntilClose: 7 + +# Issues or Pull Requests with these labels will never be considered stale +exemptLabels: + - "support" + - "bug" + - "security" + +# Label to use when marking as stale +staleLabel: stale + +# Comment to post when marking as stale. Set to `false` to disable +markComment: > + This issue has been marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. + +# Comment to post when removing the stale label. Set to `false` to disable +unmarkComment: false + +# Comment to post when closing a stale Issue or Pull Request. Set to `false` to disable +closeComment: > + This issue has been auto-closed because there hasn't been any activity for at least 21 days. + However, we really appreciate your contribution, so thank you for that! 🙏 + Also, feel free to [open a new issue](https://github.com/AFNetworking/AFNetworking/issues/new) if you still experience this problem 👍. + +# Limit to only `issues` +only: issues diff --git a/README.md b/README.md index b5bdae9a79..d193dfe8d1 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,6 @@ Perhaps the most important feature of all, however, is the amazing community of - [Download AFNetworking](https://github.com/AFNetworking/AFNetworking/archive/master.zip) and try out the included Mac and iPhone example apps - Read the ["Getting Started" guide](https://github.com/AFNetworking/AFNetworking/wiki/Getting-Started-with-AFNetworking), [FAQ](https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-FAQ), or [other articles on the Wiki](https://github.com/AFNetworking/AFNetworking/wiki) -- Check out the [documentation](http://cocoadocs.org/docsets/AFNetworking/) for a comprehensive look at all of the APIs available in AFNetworking ## Communication From c80dd7930ee24e4d072c012b22aac6f8eaef8acb Mon Sep 17 00:00:00 2001 From: Elf Sundae Date: Tue, 31 Mar 2020 02:04:25 +0800 Subject: [PATCH 136/159] Add FOUNDATION_EXPORT for AFJSONObjectByRemovingKeysWithNullValues (#4529) --- AFNetworking/AFURLResponseSerialization.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AFNetworking/AFURLResponseSerialization.h b/AFNetworking/AFURLResponseSerialization.h index abe9db49be..56a4d28ae1 100644 --- a/AFNetworking/AFURLResponseSerialization.h +++ b/AFNetworking/AFURLResponseSerialization.h @@ -27,7 +27,7 @@ NS_ASSUME_NONNULL_BEGIN /** Recursively removes `NSNull` values from a JSON object. */ -id AFJSONObjectByRemovingKeysWithNullValues(id JSONObject, NSJSONReadingOptions readingOptions); +FOUNDATION_EXPORT id AFJSONObjectByRemovingKeysWithNullValues(id JSONObject, NSJSONReadingOptions readingOptions); /** The `AFURLResponseSerialization` protocol is adopted by an object that decodes data into a more useful object representation, according to details in the server response. Response serializers may additionally perform validation on the incoming response and data. From 71951aa42f038f763523001352c71b5f5368cd6a Mon Sep 17 00:00:00 2001 From: Elf Sundae Date: Tue, 31 Mar 2020 03:22:06 +0800 Subject: [PATCH 137/159] Fix MobileCoreServices renamed warning, close #4520 (#4532) --- AFNetworking.podspec | 6 ------ 1 file changed, 6 deletions(-) diff --git a/AFNetworking.podspec b/AFNetworking.podspec index b882b3414e..aa09a2ceae 100644 --- a/AFNetworking.podspec +++ b/AFNetworking.podspec @@ -21,14 +21,10 @@ Pod::Spec.new do |s| s.subspec 'Serialization' do |ss| ss.source_files = 'AFNetworking/AFURL{Request,Response}Serialization.{h,m}' - ss.watchos.frameworks = 'MobileCoreServices', 'CoreGraphics' - ss.ios.frameworks = 'MobileCoreServices', 'CoreGraphics' - ss.osx.frameworks = 'CoreServices' end s.subspec 'Security' do |ss| ss.source_files = 'AFNetworking/AFSecurityPolicy.{h,m}' - ss.frameworks = 'Security' end s.subspec 'Reachability' do |ss| @@ -37,8 +33,6 @@ Pod::Spec.new do |s| ss.tvos.deployment_target = '9.0' ss.source_files = 'AFNetworking/AFNetworkReachabilityManager.{h,m}' - - ss.frameworks = 'SystemConfiguration' end s.subspec 'NSURLSession' do |ss| From 805291395ce3573e4c5531a5dffe826617d90aed Mon Sep 17 00:00:00 2001 From: Elf Sundae Date: Tue, 31 Mar 2020 04:05:59 +0800 Subject: [PATCH 138/159] Separate bundle identifier for watchOS target (#4533) --- AFNetworking.podspec | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/AFNetworking.podspec b/AFNetworking.podspec index aa09a2ceae..d16a42a616 100644 --- a/AFNetworking.podspec +++ b/AFNetworking.podspec @@ -8,17 +8,18 @@ Pod::Spec.new do |s| s.authors = { 'Mattt Thompson' => 'm@mattt.me' } s.source = { :git => 'https://github.com/AFNetworking/AFNetworking.git', :tag => s.version } - s.pod_target_xcconfig = { - 'PRODUCT_BUNDLE_IDENTIFIER' => 'com.alamofire.AFNetworking' - } - - s.source_files = 'AFNetworking/AFNetworking.h' - s.ios.deployment_target = '9.0' s.osx.deployment_target = '10.10' s.watchos.deployment_target = '2.0' s.tvos.deployment_target = '9.0' + s.ios.pod_target_xcconfig = { 'PRODUCT_BUNDLE_IDENTIFIER' => 'com.alamofire.AFNetworking' } + s.osx.pod_target_xcconfig = { 'PRODUCT_BUNDLE_IDENTIFIER' => 'com.alamofire.AFNetworking' } + s.watchos.pod_target_xcconfig = { 'PRODUCT_BUNDLE_IDENTIFIER' => 'com.alamofire.AFNetworking-watchOS' } + s.tvos.pod_target_xcconfig = { 'PRODUCT_BUNDLE_IDENTIFIER' => 'com.alamofire.AFNetworking' } + + s.source_files = 'AFNetworking/AFNetworking.h' + s.subspec 'Serialization' do |ss| ss.source_files = 'AFNetworking/AFURL{Request,Response}Serialization.{h,m}' end From 7ae82a23db0a9cf4f4884dd03fcbeacf4a5c322b Mon Sep 17 00:00:00 2001 From: Elf Sundae Date: Wed, 1 Apr 2020 00:50:45 +0800 Subject: [PATCH 139/159] Remove unused UIImage+AFNetworking.h (#4535) --- AFNetworking.xcodeproj/project.pbxproj | 6 ---- Framework/AFNetworking.h | 1 - UIKit+AFNetworking/UIImage+AFNetworking.h | 35 ----------------------- 3 files changed, 42 deletions(-) delete mode 100644 UIKit+AFNetworking/UIImage+AFNetworking.h diff --git a/AFNetworking.xcodeproj/project.pbxproj b/AFNetworking.xcodeproj/project.pbxproj index 527cf2ff70..4525a4ba36 100644 --- a/AFNetworking.xcodeproj/project.pbxproj +++ b/AFNetworking.xcodeproj/project.pbxproj @@ -128,7 +128,6 @@ 299522A31BBF13C700859F49 /* UIActivityIndicatorView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 2995228D1BBF13C700859F49 /* UIActivityIndicatorView+AFNetworking.m */; }; 299522A61BBF13C700859F49 /* UIButton+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 299522901BBF13C700859F49 /* UIButton+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 299522A71BBF13C700859F49 /* UIButton+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 299522911BBF13C700859F49 /* UIButton+AFNetworking.m */; }; - 299522A81BBF13C700859F49 /* UIImage+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 299522921BBF13C700859F49 /* UIImage+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 299522A91BBF13C700859F49 /* UIImageView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 299522931BBF13C700859F49 /* UIImageView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 299522AA1BBF13C700859F49 /* UIImageView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 299522941BBF13C700859F49 /* UIImageView+AFNetworking.m */; }; 299522AC1BBF13C700859F49 /* UIProgressView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 299522961BBF13C700859F49 /* UIProgressView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -162,7 +161,6 @@ 29D96E951BCC406B00F571A5 /* AFImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 299522881BBF13C700859F49 /* AFImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; 29D96E961BCC406B00F571A5 /* UIActivityIndicatorView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 2995228C1BBF13C700859F49 /* UIActivityIndicatorView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 29D96E971BCC406B00F571A5 /* UIButton+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 299522901BBF13C700859F49 /* UIButton+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 29D96E981BCC406B00F571A5 /* UIImage+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 299522921BBF13C700859F49 /* UIImage+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 29D96E991BCC406B00F571A5 /* UIImageView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 299522931BBF13C700859F49 /* UIImageView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 29D96E9A1BCC406B00F571A5 /* UIProgressView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 299522961BBF13C700859F49 /* UIProgressView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 2D4563901DB1179D00AE4812 /* AFXMLParserResponseSerializerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D45638F1DB1179D00AE4812 /* AFXMLParserResponseSerializerTests.m */; }; @@ -294,7 +292,6 @@ 2995228D1BBF13C700859F49 /* UIActivityIndicatorView+AFNetworking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIActivityIndicatorView+AFNetworking.m"; sourceTree = ""; }; 299522901BBF13C700859F49 /* UIButton+AFNetworking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIButton+AFNetworking.h"; sourceTree = ""; }; 299522911BBF13C700859F49 /* UIButton+AFNetworking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIButton+AFNetworking.m"; sourceTree = ""; }; - 299522921BBF13C700859F49 /* UIImage+AFNetworking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+AFNetworking.h"; sourceTree = ""; }; 299522931BBF13C700859F49 /* UIImageView+AFNetworking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImageView+AFNetworking.h"; sourceTree = ""; }; 299522941BBF13C700859F49 /* UIImageView+AFNetworking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImageView+AFNetworking.m"; sourceTree = ""; }; 299522951BBF13C700859F49 /* UIKit+AFNetworking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIKit+AFNetworking.h"; sourceTree = ""; }; @@ -549,7 +546,6 @@ 2995228D1BBF13C700859F49 /* UIActivityIndicatorView+AFNetworking.m */, 299522901BBF13C700859F49 /* UIButton+AFNetworking.h */, 299522911BBF13C700859F49 /* UIButton+AFNetworking.m */, - 299522921BBF13C700859F49 /* UIImage+AFNetworking.h */, 299522931BBF13C700859F49 /* UIImageView+AFNetworking.h */, 299522941BBF13C700859F49 /* UIImageView+AFNetworking.m */, 299522951BBF13C700859F49 /* UIKit+AFNetworking.h */, @@ -595,7 +591,6 @@ 1F96D2A7203649580085FC3F /* AFCompatibilityMacros.h in Headers */, 29D96E961BCC406B00F571A5 /* UIActivityIndicatorView+AFNetworking.h in Headers */, 29D96E971BCC406B00F571A5 /* UIButton+AFNetworking.h in Headers */, - 29D96E981BCC406B00F571A5 /* UIImage+AFNetworking.h in Headers */, 29D96E991BCC406B00F571A5 /* UIImageView+AFNetworking.h in Headers */, 29D96E9A1BCC406B00F571A5 /* UIProgressView+AFNetworking.h in Headers */, 29D96E8E1BCC3D7D00F571A5 /* AFNetworking.h in Headers */, @@ -607,7 +602,6 @@ buildActionMask = 2147483647; files = ( 2995225A1BBF125A00859F49 /* AFURLRequestSerialization.h in Headers */, - 299522A81BBF13C700859F49 /* UIImage+AFNetworking.h in Headers */, 299522531BBF125A00859F49 /* AFHTTPSessionManager.h in Headers */, 2995229C1BBF13C700859F49 /* AFAutoPurgingImageCache.h in Headers */, 299522581BBF125A00859F49 /* AFSecurityPolicy.h in Headers */, diff --git a/Framework/AFNetworking.h b/Framework/AFNetworking.h index 1c8f595727..65f3fcf823 100644 --- a/Framework/AFNetworking.h +++ b/Framework/AFNetworking.h @@ -52,7 +52,6 @@ FOUNDATION_EXPORT const unsigned char AFNetworkingVersionString[]; #import #import #import -#import #import #import #endif diff --git a/UIKit+AFNetworking/UIImage+AFNetworking.h b/UIKit+AFNetworking/UIImage+AFNetworking.h deleted file mode 100644 index c5de1a44cd..0000000000 --- a/UIKit+AFNetworking/UIImage+AFNetworking.h +++ /dev/null @@ -1,35 +0,0 @@ -// -// UIImage+AFNetworking.h -// -// -// Created by Paulo Ferreira on 08/07/15. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if TARGET_OS_IOS || TARGET_OS_TV - -#import - -@interface UIImage (AFNetworking) - -+ (UIImage *)safeImageWithData:(NSData *)data; - -@end - -#endif From 9e9732d52c9304c48c8fca4cfded5f613b26b01f Mon Sep 17 00:00:00 2001 From: Elf Sundae Date: Wed, 1 Apr 2020 01:53:05 +0800 Subject: [PATCH 140/159] Fix UIKit+AFNetworking.h (#4536) --- UIKit+AFNetworking/UIKit+AFNetworking.h | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/UIKit+AFNetworking/UIKit+AFNetworking.h b/UIKit+AFNetworking/UIKit+AFNetworking.h index 5d57e1d697..aa9c0b0281 100644 --- a/UIKit+AFNetworking/UIKit+AFNetworking.h +++ b/UIKit+AFNetworking/UIKit+AFNetworking.h @@ -20,23 +20,24 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -#if TARGET_OS_IOS || TARGET_OS_TV -#import +#import #ifndef _UIKIT_AFNETWORKING_ #define _UIKIT_AFNETWORKING_ -#if TARGET_OS_IOS +#if TARGET_OS_IOS || TARGET_OS_TV #import "AFAutoPurgingImageCache.h" #import "AFImageDownloader.h" + #import "UIActivityIndicatorView+AFNetworking.h" + #import "UIButton+AFNetworking.h" + #import "UIImageView+AFNetworking.h" + #import "UIProgressView+AFNetworking.h" +#endif + +#if TARGET_OS_IOS #import "AFNetworkActivityIndicatorManager.h" #import "UIRefreshControl+AFNetworking.h" #import "WKWebView+AFNetworking.h" #endif - #import "UIActivityIndicatorView+AFNetworking.h" - #import "UIButton+AFNetworking.h" - #import "UIImageView+AFNetworking.h" - #import "UIProgressView+AFNetworking.h" #endif /* _UIKIT_AFNETWORKING_ */ -#endif From eabbf6c51187895b5c17dcfd9fde367c041ab7bd Mon Sep 17 00:00:00 2001 From: Elf Sundae Date: Wed, 1 Apr 2020 07:29:42 +0800 Subject: [PATCH 141/159] Update CHANGELOG.md (#4537) --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e2e7617e27..ab25a7b612 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ -#Change Log +# Change Log All notable changes to this project will be documented in this file. -`AFNetworking` adheres to [Semantic Versioning](http://semver.org/). +`AFNetworking` adheres to [Semantic Versioning](https://semver.org/). --- From f19335f6efc67907e79fa3e1f439bf4477c2e3b1 Mon Sep 17 00:00:00 2001 From: Elf Sundae Date: Mon, 20 Apr 2020 09:41:00 +0800 Subject: [PATCH 142/159] Fix nullability (#4551) --- AFNetworking/AFHTTPSessionManager.h | 16 ++++++++-------- AFNetworking/AFURLRequestSerialization.h | 10 +++++----- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/AFNetworking/AFHTTPSessionManager.h b/AFNetworking/AFHTTPSessionManager.h index 7d64b1dc99..943fc22df0 100644 --- a/AFNetworking/AFHTTPSessionManager.h +++ b/AFNetworking/AFHTTPSessionManager.h @@ -271,14 +271,14 @@ NS_ASSUME_NONNULL_BEGIN @see -dataTaskWithRequest:uploadProgress:downloadProgress:completionHandler: */ -- (NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)method - URLString:(NSString *)URLString - parameters:(nullable id)parameters - headers:(nullable NSDictionary *)headers - uploadProgress:(nullable void (^)(NSProgress *uploadProgress)) uploadProgress - downloadProgress:(nullable void (^)(NSProgress *downloadProgress)) downloadProgress - success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success - failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure; +- (nullable NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)method + URLString:(NSString *)URLString + parameters:(nullable id)parameters + headers:(nullable NSDictionary *)headers + uploadProgress:(nullable void (^)(NSProgress *uploadProgress))uploadProgress + downloadProgress:(nullable void (^)(NSProgress *downloadProgress))downloadProgress + success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success + failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure; @end diff --git a/AFNetworking/AFURLRequestSerialization.h b/AFNetworking/AFURLRequestSerialization.h index 694696b9aa..b17e871e63 100644 --- a/AFNetworking/AFURLRequestSerialization.h +++ b/AFNetworking/AFURLRequestSerialization.h @@ -216,7 +216,7 @@ forHTTPHeaderField:(NSString *)field; @param block A block that defines a process of encoding parameters into a query string. This block returns the query string and takes three arguments: the request, the parameters to encode, and the error that occurred when attempting to encode parameters for the given request. */ -- (void)setQueryStringSerializationWithBlock:(nullable NSString * (^)(NSURLRequest *request, id parameters, NSError * __autoreleasing *error))block; +- (void)setQueryStringSerializationWithBlock:(nullable NSString * _Nullable (^)(NSURLRequest *request, id parameters, NSError * __autoreleasing *error))block; ///------------------------------- /// @name Creating Request Objects @@ -234,10 +234,10 @@ forHTTPHeaderField:(NSString *)field; @return An `NSMutableURLRequest` object. */ -- (NSMutableURLRequest *)requestWithMethod:(NSString *)method - URLString:(NSString *)URLString - parameters:(nullable id)parameters - error:(NSError * _Nullable __autoreleasing *)error; +- (nullable NSMutableURLRequest *)requestWithMethod:(NSString *)method + URLString:(NSString *)URLString + parameters:(nullable id)parameters + error:(NSError * _Nullable __autoreleasing *)error; /** Creates an `NSMutableURLRequest` object with the specified HTTP method and URLString, and constructs a `multipart/form-data` HTTP body, using the specified parameters and multipart form data block. See http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.2 From f18858598b3e131129eb4c5290cf1872cbf035d8 Mon Sep 17 00:00:00 2001 From: Elf Sundae Date: Mon, 20 Apr 2020 09:42:57 +0800 Subject: [PATCH 143/159] Replace instead of appending to the default header (#4550) * Replace instead of appending to the default header * Add tests for setting HTTP headers per request --- AFNetworking/AFHTTPSessionManager.m | 4 +-- Tests/Tests/AFHTTPSessionManagerTests.m | 37 +++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/AFNetworking/AFHTTPSessionManager.m b/AFNetworking/AFHTTPSessionManager.m index 72bcc7fefb..b4ab5915c3 100644 --- a/AFNetworking/AFHTTPSessionManager.m +++ b/AFNetworking/AFHTTPSessionManager.m @@ -180,7 +180,7 @@ - (NSURLSessionDataTask *)POST:(NSString *)URLString NSError *serializationError = nil; NSMutableURLRequest *request = [self.requestSerializer multipartFormRequestWithMethod:@"POST" URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters constructingBodyWithBlock:block error:&serializationError]; for (NSString *headerField in headers.keyEnumerator) { - [request addValue:headers[headerField] forHTTPHeaderField:headerField]; + [request setValue:headers[headerField] forHTTPHeaderField:headerField]; } if (serializationError) { if (failure) { @@ -261,7 +261,7 @@ - (NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)method NSError *serializationError = nil; NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:method URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:&serializationError]; for (NSString *headerField in headers.keyEnumerator) { - [request addValue:headers[headerField] forHTTPHeaderField:headerField]; + [request setValue:headers[headerField] forHTTPHeaderField:headerField]; } if (serializationError) { if (failure) { diff --git a/Tests/Tests/AFHTTPSessionManagerTests.m b/Tests/Tests/AFHTTPSessionManagerTests.m index a6c7b1b2f2..028a89eaca 100644 --- a/Tests/Tests/AFHTTPSessionManagerTests.m +++ b/Tests/Tests/AFHTTPSessionManagerTests.m @@ -200,6 +200,33 @@ - (void)testThatSerializationErrorGeneratesErrorAndNullTaskForGET { [self waitForExpectationsWithTimeout:10.0 handler:nil]; } +- (void)testSettingHTTPHeadersPerRequestCanReplaceTheDefaultValueSpecifiedInRequestSerializer { + XCTestExpectation *expectation = [self expectationWithDescription:@"Request should succeed"]; + + [self.sessionManager.requestSerializer setValue:@"foo value" + forHTTPHeaderField:@"X-Foo"]; + [self.sessionManager.requestSerializer setValue:@"bar value" + forHTTPHeaderField:@"X-Bar"]; + + NSURLSessionDataTask *testTask = + [self.sessionManager dataTaskWithHTTPMethod:@"GET" + URLString:@"get" + parameters:nil + headers:@{ @"X-Foo": @"request value" } + uploadProgress:nil + downloadProgress:nil + success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { + XCTAssertTrue([task.originalRequest.allHTTPHeaderFields[@"X-Foo"] isEqualToString:@"request value"]); + XCTAssertTrue([task.originalRequest.allHTTPHeaderFields[@"X-Bar"] isEqualToString:@"bar value"]); + [expectation fulfill]; + } + failure:nil]; + + [testTask resume]; + + [self waitForExpectationsWithCommonTimeout]; +} + #pragma mark - NSCoding - (void)testSupportsSecureCoding { @@ -374,6 +401,8 @@ - (void)testHEAD { - (void)testPOST { XCTestExpectation *expectation = [self expectationWithDescription:@"Request should succeed"]; + [self.sessionManager.requestSerializer setValue:@"default value" + forHTTPHeaderField:@"field"]; [self.sessionManager POST:@"post" parameters:@{@"key":@"value"} @@ -390,6 +419,8 @@ - (void)testPOST { - (void)testPOSTWithConstructingBody { XCTestExpectation *expectation = [self expectationWithDescription:@"Request should succeed"]; + [self.sessionManager.requestSerializer setValue:@"default value" + forHTTPHeaderField:@"field"]; [self.sessionManager POST:@"post" parameters:@{@"key":@"value"} @@ -413,6 +444,8 @@ - (void)testPOSTWithConstructingBody { - (void)testPUT { XCTestExpectation *expectation = [self expectationWithDescription:@"Request should succeed"]; + [self.sessionManager.requestSerializer setValue:@"default value" + forHTTPHeaderField:@"field"]; [self.sessionManager PUT:@"put" parameters:@{@"key":@"value"} @@ -428,6 +461,8 @@ - (void)testPUT { - (void)testDELETE { XCTestExpectation *expectation = [self expectationWithDescription:@"Request should succeed"]; + [self.sessionManager.requestSerializer setValue:@"default value" + forHTTPHeaderField:@"field"]; [self.sessionManager DELETE:@"delete" parameters:@{@"key":@"value"} @@ -443,6 +478,8 @@ - (void)testDELETE { - (void)testPATCH { XCTestExpectation *expectation = [self expectationWithDescription:@"Request should succeed"]; + [self.sessionManager.requestSerializer setValue:@"default value" + forHTTPHeaderField:@"field"]; [self.sessionManager PATCH:@"patch" parameters:@{@"key":@"value"} From c646ed658cb675304ff80db60bc7175251407c1c Mon Sep 17 00:00:00 2001 From: Jon Shier Date: Sun, 19 Apr 2020 21:43:38 -0400 Subject: [PATCH 144/159] Fix SPM usage with better publicHeadersPath. (#4554) --- Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index fe6e38db65..fd6d31ae99 100644 --- a/Package.swift +++ b/Package.swift @@ -34,4 +34,4 @@ let package = Package(name: "AFNetworking", targets: ["AFNetworking"])], targets: [.target(name: "AFNetworking", path: "AFNetworking", - publicHeadersPath: "AFNetworking")]) + publicHeadersPath: "")]) From 34b6b1b0d9241d931a059b65e73e54496de7ede9 Mon Sep 17 00:00:00 2001 From: Jon Shier Date: Sun, 19 Apr 2020 22:00:04 -0400 Subject: [PATCH 145/159] Fix ServerTrustError crash. (#4553) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix serverTrust crash (#4542) * Update readme, add stale bot, add issue template, add pull request template * Update copy from Alamofire * Fix crash on nil serverTrust * Expose server trust error * add test for error throws * Fix nullability * Fix evaluateServerTrust determination (#4552) Co-authored-by: Jon Shier * Revert changes making error generation public. This reverts commit 111352b32e77167834267be1792e44287a110ae3. # Conflicts: # AFNetworking/AFURLSessionManager.m * Make static error function a method instead. * Make trust generatio part of AFTestCase. * Add test cases for server trust error generation. * Mark parameters explicitly nullable. * Fix nullability (#4551) * Replace instead of appending to the default header (#4550) * Replace instead of appending to the default header * Add tests for setting HTTP headers per request * Fix SPM usage with better publicHeadersPath. (#4554) Co-authored-by: Jakub Kašpar Co-authored-by: Elf Sundae --- AFNetworking/AFURLSessionManager.m | 46 +++++++++++++++--------- Tests/Tests/AFHTTPSessionManagerTests.m | 48 +++++++++++++++++++++++++ Tests/Tests/AFSecurityPolicyTests.m | 17 --------- Tests/Tests/AFTestCase.h | 2 ++ Tests/Tests/AFTestCase.m | 17 +++++++++ 5 files changed, 96 insertions(+), 34 deletions(-) diff --git a/AFNetworking/AFURLSessionManager.m b/AFNetworking/AFURLSessionManager.m index d23bd33c27..c8b6810ef5 100644 --- a/AFNetworking/AFURLSessionManager.m +++ b/AFNetworking/AFURLSessionManager.m @@ -168,21 +168,6 @@ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N static const void * const AuthenticationChallengeErrorKey = &AuthenticationChallengeErrorKey; -static NSError * ServerTrustError(SecTrustRef serverTrust, NSURL *url) -{ - NSBundle *CFNetworkBundle = [NSBundle bundleWithIdentifier:@"com.apple.CFNetwork"]; - NSString *defaultValue = @"The certificate for this server is invalid. You might be connecting to a server that is pretending to be “%@” which could put your confidential information at risk."; - NSString *descriptionFormat = NSLocalizedStringWithDefaultValue(@"Err-1202.w", nil, CFNetworkBundle, defaultValue, @"") ?: defaultValue; - NSString *localizedDescription = [descriptionFormat componentsSeparatedByString:@"%@"].count <= 2 ? [NSString localizedStringWithFormat:descriptionFormat, url.host] : descriptionFormat; - NSDictionary *userInfo = @{ - NSURLErrorFailingURLErrorKey: url, - NSURLErrorFailingURLStringErrorKey: url.absoluteString, - NSURLErrorFailingURLPeerTrustErrorKey: (__bridge id)serverTrust, - NSLocalizedDescriptionKey: localizedDescription - }; - return [NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorServerCertificateUntrusted userInfo:userInfo]; -} - #pragma mark - NSURLSessionTaskDelegate - (void)URLSession:(__unused NSURLSession *)session @@ -1001,7 +986,7 @@ - (void)URLSession:(NSURLSession *)session @throw [NSException exceptionWithName:@"Invalid Return Value" reason:@"The return value from the authentication challenge handler must be nil, an NSError, an NSURLCredential or an NSNumber." userInfo:nil]; } } else { - evaluateServerTrust = YES; + evaluateServerTrust = [challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]; } if (evaluateServerTrust) { @@ -1009,7 +994,9 @@ - (void)URLSession:(NSURLSession *)session disposition = NSURLSessionAuthChallengeUseCredential; credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; } else { - objc_setAssociatedObject(task, AuthenticationChallengeErrorKey, ServerTrustError(challenge.protectionSpace.serverTrust, task.currentRequest.URL), OBJC_ASSOCIATION_RETAIN); + objc_setAssociatedObject(task, AuthenticationChallengeErrorKey, + [self serverTrustErrorForServerTrust:challenge.protectionSpace.serverTrust url:task.currentRequest.URL], + OBJC_ASSOCIATION_RETAIN); disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge; } } @@ -1019,6 +1006,31 @@ - (void)URLSession:(NSURLSession *)session } } +- (nonnull NSError *)serverTrustErrorForServerTrust:(nullable SecTrustRef)serverTrust url:(nullable NSURL *)url +{ + NSBundle *CFNetworkBundle = [NSBundle bundleWithIdentifier:@"com.apple.CFNetwork"]; + NSString *defaultValue = @"The certificate for this server is invalid. You might be connecting to a server that is pretending to be “%@” which could put your confidential information at risk."; + NSString *descriptionFormat = NSLocalizedStringWithDefaultValue(@"Err-1202.w", nil, CFNetworkBundle, defaultValue, @"") ?: defaultValue; + NSString *localizedDescription = [descriptionFormat componentsSeparatedByString:@"%@"].count <= 2 ? [NSString localizedStringWithFormat:descriptionFormat, url.host] : descriptionFormat; + NSMutableDictionary *userInfo = [@{ + NSLocalizedDescriptionKey: localizedDescription + } mutableCopy]; + + if (serverTrust) { + userInfo[NSURLErrorFailingURLPeerTrustErrorKey] = (__bridge id)serverTrust; + } + + if (url) { + userInfo[NSURLErrorFailingURLErrorKey] = url; + + if (url.absoluteString) { + userInfo[NSURLErrorFailingURLStringErrorKey] = url.absoluteString; + } + } + + return [NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorServerCertificateUntrusted userInfo:userInfo]; +} + - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task needNewBodyStream:(void (^)(NSInputStream *bodyStream))completionHandler diff --git a/Tests/Tests/AFHTTPSessionManagerTests.m b/Tests/Tests/AFHTTPSessionManagerTests.m index 028a89eaca..a9265a808f 100644 --- a/Tests/Tests/AFHTTPSessionManagerTests.m +++ b/Tests/Tests/AFHTTPSessionManagerTests.m @@ -28,6 +28,12 @@ @interface AFHTTPSessionManagerTests : AFTestCase @property (readwrite, nonatomic, strong) AFHTTPSessionManager *sessionManager; @end +@interface AFURLSessionManager (Testing) + +- (nonnull NSError *)serverTrustErrorForServerTrust:(SecTrustRef)serverTrust url:(NSURL *)url; + +@end + @implementation AFHTTPSessionManagerTests - (void)setUp { @@ -643,4 +649,46 @@ - (void)testAuthenticationChallengeHandlerCredentialResult { [self waitForExpectationsWithCommonTimeoutUsingHandler:nil]; } +- (void)testThatServerTrustErrorIsCreatedWithProperUserInfoWithAllParameters { + NSURL *url = [NSURL URLWithString:@"https://httpbin.org/get"]; + SecTrustRef trust = AFUTTrustChainForCertsInDirectory([[[NSBundle bundleForClass:[self class]] resourcePath] + stringByAppendingPathComponent:@"HTTPBinOrgServerTrustChain"]); + NSError *error = [self.sessionManager serverTrustErrorForServerTrust:trust url:url]; + + XCTAssertNotNil(error); + XCTAssertNotNil(error.userInfo[NSURLErrorFailingURLPeerTrustErrorKey]); + XCTAssertEqual(error.userInfo[NSURLErrorFailingURLErrorKey], url); + XCTAssertEqual(error.userInfo[NSURLErrorFailingURLStringErrorKey], url.absoluteString); +} + +- (void)testThatServerTrustErrorIsCreatedWithProperUserInfoWhenTrustIsNil { + NSURL *url = [NSURL URLWithString:@"https://httpbin.org/get"]; + NSError *error = [self.sessionManager serverTrustErrorForServerTrust:nil url:url]; + + XCTAssertNotNil(error); + XCTAssertNil(error.userInfo[NSURLErrorFailingURLPeerTrustErrorKey]); + XCTAssertEqual(error.userInfo[NSURLErrorFailingURLErrorKey], url); + XCTAssertEqual(error.userInfo[NSURLErrorFailingURLStringErrorKey], url.absoluteString); +} + +- (void)testThatServerTrustErrorIsCreatedWithProperUserInfoWhenURLIsNil { + SecTrustRef trust = AFUTTrustChainForCertsInDirectory([[[NSBundle bundleForClass:[self class]] resourcePath] + stringByAppendingPathComponent:@"HTTPBinOrgServerTrustChain"]); + NSError *error = [self.sessionManager serverTrustErrorForServerTrust:trust url:nil]; + + XCTAssertNotNil(error); + XCTAssertNotNil(error.userInfo[NSURLErrorFailingURLPeerTrustErrorKey]); + XCTAssertNil(error.userInfo[NSURLErrorFailingURLErrorKey]); + XCTAssertNil(error.userInfo[NSURLErrorFailingURLStringErrorKey]); +} + +- (void)testThatServerTrustErrorIsCreatedWithProperUserInfoAllParametersAreNil { + NSError *error = [self.sessionManager serverTrustErrorForServerTrust:nil url:nil]; + + XCTAssertNotNil(error); + XCTAssertNil(error.userInfo[NSURLErrorFailingURLPeerTrustErrorKey]); + XCTAssertNil(error.userInfo[NSURLErrorFailingURLErrorKey]); + XCTAssertNil(error.userInfo[NSURLErrorFailingURLStringErrorKey]); +} + @end diff --git a/Tests/Tests/AFSecurityPolicyTests.m b/Tests/Tests/AFSecurityPolicyTests.m index ff81dcd5d6..06867cab12 100644 --- a/Tests/Tests/AFSecurityPolicyTests.m +++ b/Tests/Tests/AFSecurityPolicyTests.m @@ -26,23 +26,6 @@ @interface AFSecurityPolicyTests : AFTestCase @end -static SecTrustRef AFUTTrustChainForCertsInDirectory(NSString *directoryPath) { - NSArray *certFileNames = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:directoryPath error:nil]; - NSMutableArray *certs = [NSMutableArray arrayWithCapacity:[certFileNames count]]; - for (NSString *path in certFileNames) { - NSData *certData = [NSData dataWithContentsOfFile:[directoryPath stringByAppendingPathComponent:path]]; - SecCertificateRef cert = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)(certData)); - [certs addObject:(__bridge_transfer id)(cert)]; - } - - SecPolicyRef policy = SecPolicyCreateBasicX509(); - SecTrustRef trust = NULL; - SecTrustCreateWithCertificates((__bridge CFTypeRef)(certs), policy, &trust); - CFRelease(policy); - - return trust; -} - static SecTrustRef AFUTHTTPBinOrgServerTrust() { NSString *bundlePath = [[NSBundle bundleForClass:[AFSecurityPolicyTests class]] resourcePath]; NSString *serverCertDirectoryPath = [bundlePath stringByAppendingPathComponent:@"HTTPBinOrgServerTrustChain"]; diff --git a/Tests/Tests/AFTestCase.h b/Tests/Tests/AFTestCase.h index 2d508a7c24..3efca6efc1 100644 --- a/Tests/Tests/AFTestCase.h +++ b/Tests/Tests/AFTestCase.h @@ -21,6 +21,8 @@ #import +SecTrustRef AFUTTrustChainForCertsInDirectory(NSString *directoryPath); + @interface AFTestCase : XCTestCase @property (nonatomic, strong, readonly) NSURL *baseURL; diff --git a/Tests/Tests/AFTestCase.m b/Tests/Tests/AFTestCase.m index 00bac17f29..52023ef16d 100644 --- a/Tests/Tests/AFTestCase.m +++ b/Tests/Tests/AFTestCase.m @@ -21,6 +21,23 @@ #import "AFTestCase.h" +SecTrustRef AFUTTrustChainForCertsInDirectory(NSString *directoryPath) { + NSArray *certFileNames = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:directoryPath error:nil]; + NSMutableArray *certs = [NSMutableArray arrayWithCapacity:[certFileNames count]]; + for (NSString *path in certFileNames) { + NSData *certData = [NSData dataWithContentsOfFile:[directoryPath stringByAppendingPathComponent:path]]; + SecCertificateRef cert = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)(certData)); + [certs addObject:(__bridge_transfer id)(cert)]; + } + + SecPolicyRef policy = SecPolicyCreateBasicX509(); + SecTrustRef trust = NULL; + SecTrustCreateWithCertificates((__bridge CFTypeRef)(certs), policy, &trust); + CFRelease(policy); + + return trust; +} + @implementation AFTestCase - (void)setUp { From ffae2391ab0c29dc88eb0a58d2f5b2c2c27cadbf Mon Sep 17 00:00:00 2001 From: Jon Shier Date: Sun, 19 Apr 2020 22:21:21 -0400 Subject: [PATCH 146/159] Prepare 4.0.1 Release (#4555) * Version to 4.0.1. * Update Gems. --- AFNetworking.podspec | 2 +- AFNetworking.xcodeproj/project.pbxproj | 6 ++--- CHANGELOG.md | 33 ++++++++++++++++++++++++-- Gemfile.lock | 32 ++++++++++++------------- 4 files changed, 50 insertions(+), 23 deletions(-) diff --git a/AFNetworking.podspec b/AFNetworking.podspec index d16a42a616..ef110340b5 100644 --- a/AFNetworking.podspec +++ b/AFNetworking.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'AFNetworking' - s.version = '4.0.0' + s.version = '4.0.1' s.license = 'MIT' s.summary = 'A delightful networking framework for Apple platforms.' s.homepage = 'https://github.com/AFNetworking/AFNetworking' diff --git a/AFNetworking.xcodeproj/project.pbxproj b/AFNetworking.xcodeproj/project.pbxproj index 4525a4ba36..c6b4daf23c 100644 --- a/AFNetworking.xcodeproj/project.pbxproj +++ b/AFNetworking.xcodeproj/project.pbxproj @@ -1345,7 +1345,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 9.0; MACOSX_DEPLOYMENT_TARGET = 10.10; - MARKETING_VERSION = 4.0.0; + MARKETING_VERSION = 4.0.1; MODULEMAP_FILE = "$(PROJECT_DIR)/Framework/module.modulemap"; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; @@ -1427,7 +1427,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 9.0; MACOSX_DEPLOYMENT_TARGET = 10.10; - MARKETING_VERSION = 4.0.0; + MARKETING_VERSION = 4.0.1; MODULEMAP_FILE = "$(PROJECT_DIR)/Framework/module.modulemap"; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; @@ -1464,7 +1464,6 @@ INFOPLIST_FILE = ./Framework/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MARKETING_VERSION = 4.0.0; PRODUCT_BUNDLE_IDENTIFIER = com.alamofire.AFNetworking; PRODUCT_NAME = AFNetworking; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1492,7 +1491,6 @@ INFOPLIST_FILE = ./Framework/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MARKETING_VERSION = 4.0.0; PRODUCT_BUNDLE_IDENTIFIER = com.alamofire.AFNetworking; PRODUCT_NAME = AFNetworking; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/CHANGELOG.md b/CHANGELOG.md index ab25a7b612..4bc56a2273 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,35 @@ All notable changes to this project will be documented in this file. --- +## [4.0.1]((https://github.com/AFNetworking/AFNetworking/releases/tag/4.0.0) (04/19/2020) +Release on Sunday, April 19, 2020. All issues associated with this milestone can be found using this [filter](https://github.com/AFNetworking/AFNetworking/milestone/20?closed=1). + +#### Updated +* Project templates and integrations. + * Implemented by Kaspik in [#4531](https://github.com/AFNetworking/AFNetworking/pull/4531). +* Various CocoaPods podspec settings. + * Implemented by ElfSundae in [#4528](https://github.com/AFNetworking/AFNetworking/pull/4528), [#4532](https://github.com/AFNetworking/AFNetworking/pull/4532), and [#4533](https://github.com/AFNetworking/AFNetworking/pull/4533). + +#### Fixed +* Crash during authentication delegate method. + * Implemented by Kaspik, ElfSundae, and jshier in [#4542](https://github.com/AFNetworking/AFNetworking/pull/4542), [#4552](https://github.com/AFNetworking/AFNetworking/pull/4552), and [#4553](https://github.com/AFNetworking/AFNetworking/pull/4553). +* SPM integration. + * Implemented by jshier in [#4554](https://github.com/AFNetworking/AFNetworking/pull/4554). +* Improper update instead of replacement of header values. + * Implemented by ElfSundae in [#4550](https://github.com/AFNetworking/AFNetworking/pull/4550). +* Nullability of some methods. + * Implemented by ElfSundae in [#4551](https://github.com/AFNetworking/AFNetworking/pull/4551). +* Typos in CHANGELOG. + * Implemented by ElfSundae in [#4537](https://github.com/AFNetworking/AFNetworking/pull/4537). +* Missing tvOS compatibility for some methods. + * Implemented by ElfSundae in [#4536](https://github.com/AFNetworking/AFNetworking/pull/4536). +* Missing `FOUNDATION_EXPORT` for `AFJSONObjectByRemovingKeysWithNullValues`. + * Implemented by ElfSundae in [#4529](https://github.com/AFNetworking/AFNetworking/pull/4529). + +#### Removed +* Unused UIImage+AFNetworking.h file. + * Implemented by ElfSundae in [#4535](https://github.com/AFNetworking/AFNetworking/pull/4535). + ## [4.0.0](https://github.com/AFNetworking/AFNetworking/releases/tag/4.0.0) (03/29/2020) Released on Sunday, March 29, 2020. All issues associated with this milestone can be found using this [filter](https://github.com/AFNetworking/AFNetworking/milestone/16?closed=1). @@ -56,8 +85,8 @@ Released on Sunday, March 29, 2020. All issues associated with this milestone ca * Implemented by welcommand in [#3872](https://github.com/AFNetworking/AFNetworking/pull/3872). * Memory leak in example application. * Implemented by svoit in [#4196](https://github.com/AFNetworking/AFNetworking/pull/4196). -* Crashes in mulithreaded scenarios and `dispatch_barrier`. - * Implemetned by streeter in [#4474](https://github.com/AFNetworking/AFNetworking/pull/4474). +* Crashes in multithreaded scenarios and `dispatch_barrier`. + * Implemented by streeter in [#4474](https://github.com/AFNetworking/AFNetworking/pull/4474). * Issues with `NSSecureCoding`. * Implemented by ElfSudae in [#4409](https://github.com/AFNetworking/AFNetworking/pull/4409). * Code style issues. diff --git a/Gemfile.lock b/Gemfile.lock index 70dc844f2a..b589bdeceb 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -13,21 +13,21 @@ GEM httpclient (~> 2.8, >= 2.8.3) json (>= 1.5.1) atomos (0.1.3) - aws-eventstream (1.0.3) - aws-partitions (1.290.0) - aws-sdk-core (3.92.0) - aws-eventstream (~> 1.0, >= 1.0.2) + aws-eventstream (1.1.0) + aws-partitions (1.298.0) + aws-sdk-core (3.94.0) + aws-eventstream (~> 1, >= 1.0.2) aws-partitions (~> 1, >= 1.239.0) aws-sigv4 (~> 1.1) jmespath (~> 1.0) aws-sdk-kms (1.30.0) aws-sdk-core (~> 3, >= 3.71.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.61.1) + aws-sdk-s3 (1.61.2) aws-sdk-core (~> 3, >= 3.83.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.1) - aws-sigv4 (1.1.1) + aws-sigv4 (1.1.2) aws-eventstream (~> 1.0, >= 1.0.2) babosa (1.0.3) claide (1.0.3) @@ -92,7 +92,7 @@ GEM faraday_middleware (0.13.1) faraday (>= 0.7.4, < 1.0) fastimage (2.1.7) - fastlane (2.144.0) + fastlane (2.145.0) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.3, < 3.0.0) aws-sdk-s3 (~> 1.0) @@ -148,20 +148,20 @@ GEM google-cloud-env (1.3.1) faraday (>= 0.17.3, < 2.0) google-cloud-errors (1.0.0) - google-cloud-storage (1.25.1) + google-cloud-storage (1.26.0) addressable (~> 2.5) digest-crc (~> 0.4) google-api-client (~> 0.33) google-cloud-core (~> 1.2) googleauth (~> 0.9) mini_mime (~> 1.0) - googleauth (0.11.0) + googleauth (0.12.0) faraday (>= 0.17.3, < 2.0) jwt (>= 1.4, < 3.0) memoist (~> 0.16) multi_json (~> 1.11) os (>= 0.9, < 2.0) - signet (~> 0.12) + signet (~> 0.14) highline (1.7.10) http-cookie (1.0.3) domain_name (~> 0.5) @@ -183,7 +183,7 @@ GEM nap (1.1.0) naturally (2.2.0) netrc (0.11.0) - os (1.0.1) + os (1.1.0) plist (3.5.0) public_suffix (2.0.5) representable (3.0.4) @@ -195,7 +195,7 @@ GEM ruby-macho (1.4.0) rubyzip (1.3.0) security (0.1.3) - signet (0.13.2) + signet (0.14.0) addressable (~> 2.3) faraday (>= 0.17.3, < 2.0) jwt (>= 1.5, < 3.0) @@ -214,18 +214,18 @@ GEM tty-cursor (~> 0.7) typhoeus (1.3.1) ethon (>= 0.9.0) - tzinfo (1.2.6) + tzinfo (1.2.7) thread_safe (~> 0.1) uber (0.1.0) unf (0.1.4) unf_ext - unf_ext (0.0.7.6) + unf_ext (0.0.7.7) unicode-display_width (1.7.0) word_wrap (1.0.0) - xcode-install (2.6.3) + xcode-install (2.6.4) claide (>= 0.9.1, < 1.1.0) fastlane (>= 2.1.0, < 3.0.0) - xcodeproj (1.15.0) + xcodeproj (1.16.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) From 5b20cbd09561fa14a701fac8aabbd289dc40ff75 Mon Sep 17 00:00:00 2001 From: Elf Sundae Date: Tue, 28 Apr 2020 00:01:43 +0800 Subject: [PATCH 147/159] Fix type in CHANGELOG. (#4562) --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4bc56a2273..f28635b35b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file. --- -## [4.0.1]((https://github.com/AFNetworking/AFNetworking/releases/tag/4.0.0) (04/19/2020) +## [4.0.1](https://github.com/AFNetworking/AFNetworking/releases/tag/4.0.1) (04/19/2020) Release on Sunday, April 19, 2020. All issues associated with this milestone can be found using this [filter](https://github.com/AFNetworking/AFNetworking/milestone/20?closed=1). #### Updated From b4554eeda09628832442b8b8fa444d5022315b4c Mon Sep 17 00:00:00 2001 From: Elf Sundae Date: Mon, 25 May 2020 10:26:59 +0800 Subject: [PATCH 148/159] Fix docblock for setAuthenticationChallengeHandler (#4574) --- AFNetworking/AFURLSessionManager.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AFNetworking/AFURLSessionManager.h b/AFNetworking/AFURLSessionManager.h index 88700c39a9..7f0de6259c 100644 --- a/AFNetworking/AFURLSessionManager.h +++ b/AFNetworking/AFURLSessionManager.h @@ -316,10 +316,10 @@ NS_ASSUME_NONNULL_BEGIN @param block A block object to be executed when a connection level authentication challenge has occurred. The block returns the disposition of the authentication challenge, and takes three arguments: the session, the authentication challenge, and a pointer to the credential that should be used to resolve the challenge. - @warning Implementing a session authentication challenge handler yourself totally bypasses AFNetworking's security policy defined in `AFSecurityPolicy`. Make sure you fully understand the implications before implementing a custom session authentication challenge handler. If you do not want to bypass AFNetworking's security policy, use `setTaskDidReceiveAuthenticationChallengeBlock:` instead. + @warning Implementing a session authentication challenge handler yourself totally bypasses AFNetworking's security policy defined in `AFSecurityPolicy`. Make sure you fully understand the implications before implementing a custom session authentication challenge handler. If you do not want to bypass AFNetworking's security policy, use `-setAuthenticationChallengeHandler:` instead. @see -securityPolicy - @see -setTaskDidReceiveAuthenticationChallengeBlock: + @see -setAuthenticationChallengeHandler: */ - (void)setSessionDidReceiveAuthenticationChallengeBlock:(nullable NSURLSessionAuthChallengeDisposition (^)(NSURLSession *session, NSURLAuthenticationChallenge *challenge, NSURLCredential * _Nullable __autoreleasing * _Nullable credential))block; From acfc28df20caf749905f9fbac7910b4c5bf55cc8 Mon Sep 17 00:00:00 2001 From: Jordan Bondo Date: Sun, 24 May 2020 19:32:35 -0700 Subject: [PATCH 149/159] Disable 'Zombie Objects' diagnostics for tvOS scheme (#4572) --- .../xcshareddata/xcschemes/AFNetworking tvOS.xcscheme | 7 ------- 1 file changed, 7 deletions(-) diff --git a/AFNetworking.xcodeproj/xcshareddata/xcschemes/AFNetworking tvOS.xcscheme b/AFNetworking.xcodeproj/xcshareddata/xcschemes/AFNetworking tvOS.xcscheme index 9bd6a4cbf0..d693d2b12d 100644 --- a/AFNetworking.xcodeproj/xcshareddata/xcschemes/AFNetworking tvOS.xcscheme +++ b/AFNetworking.xcodeproj/xcshareddata/xcschemes/AFNetworking tvOS.xcscheme @@ -102,13 +102,6 @@ isEnabled = "YES"> - - - - Date: Thu, 4 Jun 2020 08:57:45 +0800 Subject: [PATCH 150/159] Loop over only changed keypaths in request serializer (#4581) --- AFNetworking/AFURLRequestSerialization.m | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/AFNetworking/AFURLRequestSerialization.m b/AFNetworking/AFURLRequestSerialization.m index f60b6f9d8a..f1d9ee18a0 100644 --- a/AFNetworking/AFURLRequestSerialization.m +++ b/AFNetworking/AFURLRequestSerialization.m @@ -368,10 +368,8 @@ - (NSMutableURLRequest *)requestWithMethod:(NSString *)method NSMutableURLRequest *mutableRequest = [[NSMutableURLRequest alloc] initWithURL:url]; mutableRequest.HTTPMethod = method; - for (NSString *keyPath in AFHTTPRequestSerializerObservedKeyPaths()) { - if ([self.mutableObservedChangedKeyPaths containsObject:keyPath]) { - [mutableRequest setValue:[self valueForKeyPath:keyPath] forKey:keyPath]; - } + for (NSString *keyPath in self.mutableObservedChangedKeyPaths) { + [mutableRequest setValue:[self valueForKeyPath:keyPath] forKey:keyPath]; } mutableRequest = [[self requestBySerializingRequest:mutableRequest withParameters:parameters error:error] mutableCopy]; From 1e12d620ced116a63f434e8de2aa84c9f8766dca Mon Sep 17 00:00:00 2001 From: Jon Shier Date: Wed, 15 Jul 2020 12:17:28 -0400 Subject: [PATCH 151/159] Only mark unlabeled issues as stale. --- .github/stale.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/stale.yml b/.github/stale.yml index 65f633c793..eaff173ff9 100644 --- a/.github/stale.yml +++ b/.github/stale.yml @@ -6,11 +6,7 @@ daysUntilStale: 14 # Number of days of inactivity before a stale Issue or Pull Request is closed daysUntilClose: 7 -# Issues or Pull Requests with these labels will never be considered stale -exemptLabels: - - "support" - - "bug" - - "security" +onlyLabels: [] # Label to use when marking as stale staleLabel: stale From 6dc5ae8efb40dc04c0f180dd7da8d7a7712d78be Mon Sep 17 00:00:00 2001 From: Jon Shier Date: Wed, 15 Jul 2020 13:09:39 -0400 Subject: [PATCH 152/159] Exempt "needs investigation" from stalebot. --- .github/stale.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/stale.yml b/.github/stale.yml index eaff173ff9..97dfa19284 100644 --- a/.github/stale.yml +++ b/.github/stale.yml @@ -6,7 +6,12 @@ daysUntilStale: 14 # Number of days of inactivity before a stale Issue or Pull Request is closed daysUntilClose: 7 -onlyLabels: [] +# Issues or Pull Requests with these labels will never be considered stale + exemptLabels: + - "support" + - "bug" + - "security" + - "needs investigation" # Label to use when marking as stale staleLabel: stale From 77ef5fed64d98107acd177a90182163a20ba4567 Mon Sep 17 00:00:00 2001 From: Elf Sundae Date: Mon, 21 Sep 2020 10:21:31 +0800 Subject: [PATCH 153/159] Use low priority queue instead of background for SCNetworkReachabilityGetFlags() (#4587) --- AFNetworking/AFNetworkReachabilityManager.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AFNetworking/AFNetworkReachabilityManager.m b/AFNetworking/AFNetworkReachabilityManager.m index 0322bf9b81..45aeb2f7f7 100644 --- a/AFNetworking/AFNetworkReachabilityManager.m +++ b/AFNetworking/AFNetworkReachabilityManager.m @@ -227,7 +227,7 @@ - (void)startMonitoring { SCNetworkReachabilitySetCallback(self.networkReachability, AFNetworkReachabilityCallback, &context); SCNetworkReachabilityScheduleWithRunLoop(self.networkReachability, CFRunLoopGetMain(), kCFRunLoopCommonModes); - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),^{ + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0),^{ SCNetworkReachabilityFlags flags; if (SCNetworkReachabilityGetFlags(self.networkReachability, &flags)) { AFPostReachabilityStatusChange(flags, callback); From 3afc7827033e5b5e9fb280ab98b8bbaa0944992c Mon Sep 17 00:00:00 2001 From: Elf Sundae Date: Sun, 20 Dec 2020 09:00:51 +0800 Subject: [PATCH 154/159] Fix redirect test: use httpbingo service instead due to postmanlabs/httpbin#617 (#4620) --- Tests/Tests/AFHTTPSessionManagerTests.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Tests/AFHTTPSessionManagerTests.m b/Tests/Tests/AFHTTPSessionManagerTests.m index a9265a808f..f862b3fc3b 100644 --- a/Tests/Tests/AFHTTPSessionManagerTests.m +++ b/Tests/Tests/AFHTTPSessionManagerTests.m @@ -103,7 +103,7 @@ - (void)testThatRedirectBlockIsCalledWhen302IsEncountered { XCTestExpectation *expectation = [self expectationWithDescription:@"Request should succeed"]; - NSURLRequest *redirectRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"/redirect/1" relativeToURL:self.baseURL]]; + NSURLRequest *redirectRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://httpbingo.org/redirect/1"]]; NSURLSessionDataTask *redirectTask = [self.sessionManager dataTaskWithRequest:redirectRequest uploadProgress:nil downloadProgress:nil completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { blockError = error; From 3971bea52605eae7082068b82b559cfaa724df41 Mon Sep 17 00:00:00 2001 From: Elf Sundae Date: Sun, 20 Dec 2020 09:04:00 +0800 Subject: [PATCH 155/159] Fix build warning for Example project (#4617) * Set IPHONEOS_DEPLOYMENT_TARGET = 9.0 * Add CURRENT_PROJECT_VERSION Fixed warning: The CFBundleVersion of an app extension ('1') must match that of its containing parent app ('1.0.0'). * Add 1024x1024 app store icon Fixed warning: A 1024x1024 app store icon is required for iOS apps * Update project files for Xcode 12 --- .../xcschemes/AFNetworking iOS.xcscheme | 2 +- .../xcschemes/AFNetworking macOS.xcscheme | 2 +- .../xcschemes/AFNetworking tvOS.xcscheme | 2 +- .../xcschemes/AFNetworking watchOS.xcscheme | 2 +- .../project.pbxproj | 10 +- .../xcschemes/iOS Example.xcscheme | 2 +- .../iOS Today Extension Example.xcscheme | 2 +- .../xcschemes/macOS Example.xcscheme | 2 +- .../xcschemes/tvOS Example.xcscheme | 2 +- .../xcschemes/watchOS Example.xcscheme | 27 ++--- .../AppIcon.appiconset/Contents.json | 103 +++++++++--------- .../AppIcon.appiconset/Icon-1024.png | Bin 0 -> 302918 bytes Example/iOS Example/Info.plist | 2 +- 13 files changed, 75 insertions(+), 83 deletions(-) create mode 100644 Example/Assets.xcassets/AppIcon.appiconset/Icon-1024.png diff --git a/AFNetworking.xcodeproj/xcshareddata/xcschemes/AFNetworking iOS.xcscheme b/AFNetworking.xcodeproj/xcshareddata/xcschemes/AFNetworking iOS.xcscheme index 264cb201a1..49d21b1db3 100644 --- a/AFNetworking.xcodeproj/xcshareddata/xcschemes/AFNetworking iOS.xcscheme +++ b/AFNetworking.xcodeproj/xcshareddata/xcschemes/AFNetworking iOS.xcscheme @@ -1,6 +1,6 @@ - + - + - + - - - - - + diff --git a/Example/Assets.xcassets/AppIcon.appiconset/Contents.json b/Example/Assets.xcassets/AppIcon.appiconset/Contents.json index f2c3885f1d..327aae2ab6 100644 --- a/Example/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/Example/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -2,109 +2,110 @@ "images" : [ { "idiom" : "iphone", - "size" : "20x20", - "scale" : "2x" + "scale" : "2x", + "size" : "20x20" }, { "idiom" : "iphone", - "size" : "20x20", - "scale" : "3x" + "scale" : "3x", + "size" : "20x20" }, { - "size" : "29x29", - "idiom" : "iphone", "filename" : "Icon-Small@2x.png", - "scale" : "2x" + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" }, { - "size" : "29x29", - "idiom" : "iphone", "filename" : "Icon-Small@3x.png", - "scale" : "3x" + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" }, { - "size" : "40x40", - "idiom" : "iphone", "filename" : "Icon-40@2x.png", - "scale" : "2x" + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" }, { - "size" : "40x40", - "idiom" : "iphone", "filename" : "Icon-40@3x.png", - "scale" : "3x" + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" }, { - "size" : "60x60", - "idiom" : "iphone", "filename" : "Icon-60@2x.png", - "scale" : "2x" + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" }, { - "size" : "60x60", - "idiom" : "iphone", "filename" : "Icon-60@3x.png", - "scale" : "3x" + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" }, { "idiom" : "ipad", - "size" : "20x20", - "scale" : "1x" + "scale" : "1x", + "size" : "20x20" }, { "idiom" : "ipad", - "size" : "20x20", - "scale" : "2x" + "scale" : "2x", + "size" : "20x20" }, { - "size" : "29x29", - "idiom" : "ipad", "filename" : "Icon-Small.png", - "scale" : "1x" + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" }, { - "size" : "29x29", - "idiom" : "ipad", "filename" : "Icon-Small@2x.png", - "scale" : "2x" + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" }, { - "size" : "40x40", - "idiom" : "ipad", "filename" : "Icon-40.png", - "scale" : "1x" + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" }, { - "size" : "40x40", - "idiom" : "ipad", "filename" : "Icon-40@2x.png", - "scale" : "2x" + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" }, { - "size" : "76x76", - "idiom" : "ipad", "filename" : "Icon-76.png", - "scale" : "1x" + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" }, { - "size" : "76x76", - "idiom" : "ipad", "filename" : "Icon-76@2x.png", - "scale" : "2x" + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" }, { "idiom" : "ipad", - "size" : "83.5x83.5", - "scale" : "2x" + "scale" : "2x", + "size" : "83.5x83.5" }, { + "filename" : "Icon-1024.png", "idiom" : "ios-marketing", - "size" : "1024x1024", - "scale" : "1x" + "scale" : "1x", + "size" : "1024x1024" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/Example/Assets.xcassets/AppIcon.appiconset/Icon-1024.png b/Example/Assets.xcassets/AppIcon.appiconset/Icon-1024.png new file mode 100644 index 0000000000000000000000000000000000000000..635f6d61b21252e19ae0e6f707bcc0f07e927f45 GIT binary patch literal 302918 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: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 h^=};fHCFBundleSignature ???? CFBundleVersion - 1.0.0 + $(CURRENT_PROJECT_VERSION) LSRequiresIPhoneOS NSAppTransportSecurity From 6118f99092e79ae286966cd60eeeb151869bb004 Mon Sep 17 00:00:00 2001 From: Huang-Libo Date: Sun, 20 Dec 2020 09:06:20 +0800 Subject: [PATCH 156/159] Correct AFURLSessionManager comments. (#4614) --- AFNetworking/AFURLSessionManager.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AFNetworking/AFURLSessionManager.h b/AFNetworking/AFURLSessionManager.h index 7f0de6259c..399f64959b 100644 --- a/AFNetworking/AFURLSessionManager.h +++ b/AFNetworking/AFURLSessionManager.h @@ -416,7 +416,7 @@ NS_ASSUME_NONNULL_BEGIN - (void)setDataTaskWillCacheResponseBlock:(nullable NSCachedURLResponse * (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSCachedURLResponse *proposedResponse))block; /** - Sets a block to be executed once all messages enqueued for a session have been delivered, as handled by the `NSURLSessionDataDelegate` method `URLSessionDidFinishEventsForBackgroundURLSession:`. + Sets a block to be executed once all messages enqueued for a session have been delivered, as handled by the `NSURLSessionDelegate` method `URLSessionDidFinishEventsForBackgroundURLSession:`. @param block A block object to be executed once all messages enqueued for a session have been delivered. The block has no return value and takes a single argument: the session. */ From 6f2ffb52306ae27103b82e19a399b2d057c226dc Mon Sep 17 00:00:00 2001 From: Huang-Libo Date: Sun, 20 Dec 2020 09:06:50 +0800 Subject: [PATCH 157/159] Update AFURLRequestSerialization.h (#4613) Modify comments. --- AFNetworking/AFURLRequestSerialization.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AFNetworking/AFURLRequestSerialization.h b/AFNetworking/AFURLRequestSerialization.h index b17e871e63..dd7cb457bc 100644 --- a/AFNetworking/AFURLRequestSerialization.h +++ b/AFNetworking/AFURLRequestSerialization.h @@ -278,7 +278,7 @@ forHTTPHeaderField:(NSString *)field; #pragma mark - /** - The `AFMultipartFormData` protocol defines the methods supported by the parameter in the block argument of `AFHTTPRequestSerializer -multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:`. + The `AFMultipartFormData` protocol defines the methods supported by the parameter in the block argument of `AFHTTPRequestSerializer -multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:error:`. */ @protocol AFMultipartFormData From 4eaec5b586ddd897ebeda896e332a62a9fdab818 Mon Sep 17 00:00:00 2001 From: Dawn Song <5434578+acalism@users.noreply.github.com> Date: Sun, 20 Dec 2020 09:08:13 +0800 Subject: [PATCH 158/159] Add assistant files to xcode project (not target) (#4578) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit make them available to Xcode editor Co-authored-by: liming.song(嘶吼) --- AFNetworking.xcodeproj/project.pbxproj | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/AFNetworking.xcodeproj/project.pbxproj b/AFNetworking.xcodeproj/project.pbxproj index c6b4daf23c..dcc063410e 100644 --- a/AFNetworking.xcodeproj/project.pbxproj +++ b/AFNetworking.xcodeproj/project.pbxproj @@ -306,6 +306,15 @@ 323D83E0231D185400C5BFC6 /* WKWebView+AFNetworking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "WKWebView+AFNetworking.h"; sourceTree = ""; }; 323D83E1231D185400C5BFC6 /* WKWebView+AFNetworking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "WKWebView+AFNetworking.m"; sourceTree = ""; }; 323D83E4231D188400C5BFC6 /* AFWKWebViewTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFWKWebViewTests.m; sourceTree = ""; }; + 439E280C247E16DE004467ED /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE; sourceTree = SOURCE_ROOT; }; + 439E280D247E16DE004467ED /* Gemfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = Gemfile; sourceTree = SOURCE_ROOT; tabWidth = 2; }; + 439E280E247E16DE004467ED /* Gemfile.lock */ = {isa = PBXFileReference; explicitFileType = text.yaml; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = Gemfile.lock; sourceTree = SOURCE_ROOT; tabWidth = 2; }; + 439E280F247E16DE004467ED /* CONTRIBUTING.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CONTRIBUTING.md; sourceTree = SOURCE_ROOT; }; + 439E2810247E16DE004467ED /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = SOURCE_ROOT; }; + 439E2811247E16DE004467ED /* AFNetworking.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = AFNetworking.podspec; sourceTree = SOURCE_ROOT; tabWidth = 2; }; + 439E2812247E16DE004467ED /* CONTRIBUTING_CH.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CONTRIBUTING_CH.md; sourceTree = SOURCE_ROOT; }; + 439E2813247E16DE004467ED /* Package.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = SOURCE_ROOT; }; + 439E2814247E16DF004467ED /* CHANGELOG.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CHANGELOG.md; sourceTree = SOURCE_ROOT; }; 5F4323B31BF63741003B8749 /* Equifax_Secure_Certificate_Authority_Root.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = Equifax_Secure_Certificate_Authority_Root.cer; sourceTree = ""; }; 5F4323B41BF63741003B8749 /* GeoTrust_Global_CA-cross.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = "GeoTrust_Global_CA-cross.cer"; sourceTree = ""; }; 5F4323B51BF63741003B8749 /* google.com.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = google.com.cer; sourceTree = ""; }; @@ -508,6 +517,15 @@ children = ( 2995223C1BBF104D00859F49 /* AFNetworking.h */, 2995223E1BBF104D00859F49 /* Info.plist */, + 439E2811247E16DE004467ED /* AFNetworking.podspec */, + 439E2814247E16DF004467ED /* CHANGELOG.md */, + 439E2812247E16DE004467ED /* CONTRIBUTING_CH.md */, + 439E280F247E16DE004467ED /* CONTRIBUTING.md */, + 439E280D247E16DE004467ED /* Gemfile */, + 439E280E247E16DE004467ED /* Gemfile.lock */, + 439E280C247E16DE004467ED /* LICENSE */, + 439E2813247E16DE004467ED /* Package.swift */, + 439E2810247E16DE004467ED /* README.md */, ); name = "Supporting Files"; path = AFNetworking; From d9f589cc2c1fe9d55eb5eea00558010afea7a41e Mon Sep 17 00:00:00 2001 From: Jon Shier Date: Tue, 17 Jan 2023 14:30:02 -0500 Subject: [PATCH 159/159] Mark for deprecation. (#4769) --- .ruby-version | 2 +- Gemfile.lock | 298 ++++++++++++++++++++++++++++---------------------- README.md | 44 +++++--- 3 files changed, 198 insertions(+), 146 deletions(-) diff --git a/.ruby-version b/.ruby-version index 24ba9a38de..944880fa15 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.7.0 +3.2.0 diff --git a/Gemfile.lock b/Gemfile.lock index b589bdeceb..cf47b86137 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,127 +1,152 @@ GEM remote: https://rubygems.org/ specs: - CFPropertyList (3.0.2) - activesupport (4.2.11.1) - i18n (~> 0.7) - minitest (~> 5.1) - thread_safe (~> 0.3, >= 0.3.4) - tzinfo (~> 1.1) - addressable (2.7.0) - public_suffix (>= 2.0.2, < 5.0) - algoliasearch (1.27.1) + CFPropertyList (3.0.5) + rexml + activesupport (6.1.7) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 1.6, < 2) + minitest (>= 5.1) + tzinfo (~> 2.0) + zeitwerk (~> 2.3) + addressable (2.8.1) + public_suffix (>= 2.0.2, < 6.0) + algoliasearch (1.27.5) httpclient (~> 2.8, >= 2.8.3) json (>= 1.5.1) + artifactory (3.0.15) atomos (0.1.3) - aws-eventstream (1.1.0) - aws-partitions (1.298.0) - aws-sdk-core (3.94.0) + aws-eventstream (1.2.0) + aws-partitions (1.693.0) + aws-sdk-core (3.168.4) aws-eventstream (~> 1, >= 1.0.2) - aws-partitions (~> 1, >= 1.239.0) + aws-partitions (~> 1, >= 1.651.0) + aws-sigv4 (~> 1.5) + jmespath (~> 1, >= 1.6.1) + aws-sdk-kms (1.61.0) + aws-sdk-core (~> 3, >= 3.165.0) aws-sigv4 (~> 1.1) - jmespath (~> 1.0) - aws-sdk-kms (1.30.0) - aws-sdk-core (~> 3, >= 3.71.0) - aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.61.2) - aws-sdk-core (~> 3, >= 3.83.0) + aws-sdk-s3 (1.117.2) + aws-sdk-core (~> 3, >= 3.165.0) aws-sdk-kms (~> 1) - aws-sigv4 (~> 1.1) - aws-sigv4 (1.1.2) - aws-eventstream (~> 1.0, >= 1.0.2) - babosa (1.0.3) - claide (1.0.3) - cocoapods (1.9.1) - activesupport (>= 4.0.2, < 5) + aws-sigv4 (~> 1.4) + aws-sigv4 (1.5.2) + aws-eventstream (~> 1, >= 1.0.2) + babosa (1.0.4) + claide (1.1.0) + cocoapods (1.11.3) + addressable (~> 2.8) claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.9.1) + cocoapods-core (= 1.11.3) cocoapods-deintegrate (>= 1.0.3, < 2.0) - cocoapods-downloader (>= 1.2.2, < 2.0) + cocoapods-downloader (>= 1.4.0, < 2.0) cocoapods-plugins (>= 1.0.0, < 2.0) cocoapods-search (>= 1.0.0, < 2.0) - cocoapods-stats (>= 1.0.0, < 2.0) cocoapods-trunk (>= 1.4.0, < 2.0) cocoapods-try (>= 1.1.0, < 2.0) colored2 (~> 3.1) escape (~> 0.0.4) fourflusher (>= 2.3.0, < 3.0) gh_inspector (~> 1.0) - molinillo (~> 0.6.6) + molinillo (~> 0.8.0) nap (~> 1.0) - ruby-macho (~> 1.4) - xcodeproj (>= 1.14.0, < 2.0) - cocoapods-core (1.9.1) - activesupport (>= 4.0.2, < 6) + ruby-macho (>= 1.0, < 3.0) + xcodeproj (>= 1.21.0, < 2.0) + cocoapods-core (1.11.3) + activesupport (>= 5.0, < 7) + addressable (~> 2.8) algoliasearch (~> 1.0) concurrent-ruby (~> 1.1) fuzzy_match (~> 2.0.4) nap (~> 1.0) netrc (~> 0.11) + public_suffix (~> 4.0) typhoeus (~> 1.0) - cocoapods-deintegrate (1.0.4) - cocoapods-downloader (1.3.0) + cocoapods-deintegrate (1.0.5) + cocoapods-downloader (1.6.3) cocoapods-plugins (1.0.0) nap - cocoapods-search (1.0.0) - cocoapods-stats (1.1.0) - cocoapods-trunk (1.4.1) + cocoapods-search (1.0.1) + cocoapods-trunk (1.6.0) nap (>= 0.8, < 2.0) netrc (~> 0.11) - cocoapods-try (1.1.0) + cocoapods-try (1.2.0) colored (1.2) colored2 (3.1.2) - commander-fastlane (4.4.6) - highline (~> 1.7.2) - concurrent-ruby (1.1.6) - declarative (0.0.10) - declarative-option (0.1.0) - digest-crc (0.5.1) + commander (4.6.0) + highline (~> 2.0.0) + concurrent-ruby (1.1.10) + declarative (0.0.20) + digest-crc (0.6.4) + rake (>= 12.0.0, < 14.0.0) domain_name (0.5.20190701) unf (>= 0.0.5, < 1.0.0) - dotenv (2.7.5) - emoji_regex (1.0.1) + dotenv (2.8.1) + emoji_regex (3.2.3) escape (0.0.4) - ethon (0.12.0) - ffi (>= 1.3.0) - excon (0.73.0) - faraday (0.17.3) - multipart-post (>= 1.2, < 3) - faraday-cookie_jar (0.0.6) - faraday (>= 0.7.4) + ethon (0.16.0) + ffi (>= 1.15.0) + excon (0.97.1) + faraday (1.10.2) + faraday-em_http (~> 1.0) + faraday-em_synchrony (~> 1.0) + faraday-excon (~> 1.1) + faraday-httpclient (~> 1.0) + faraday-multipart (~> 1.0) + faraday-net_http (~> 1.0) + faraday-net_http_persistent (~> 1.0) + faraday-patron (~> 1.0) + faraday-rack (~> 1.0) + faraday-retry (~> 1.0) + ruby2_keywords (>= 0.0.4) + faraday-cookie_jar (0.0.7) + faraday (>= 0.8.0) http-cookie (~> 1.0.0) - faraday_middleware (0.13.1) - faraday (>= 0.7.4, < 1.0) - fastimage (2.1.7) - fastlane (2.145.0) + faraday-em_http (1.0.0) + faraday-em_synchrony (1.0.0) + faraday-excon (1.1.0) + faraday-httpclient (1.0.1) + faraday-multipart (1.0.4) + multipart-post (~> 2) + faraday-net_http (1.0.1) + faraday-net_http_persistent (1.2.0) + faraday-patron (1.0.0) + faraday-rack (1.0.0) + faraday-retry (1.0.3) + faraday_middleware (1.2.0) + faraday (~> 1.0) + fastimage (2.2.6) + fastlane (2.211.0) CFPropertyList (>= 2.3, < 4.0.0) - addressable (>= 2.3, < 3.0.0) + addressable (>= 2.8, < 3.0.0) + artifactory (~> 3.0) aws-sdk-s3 (~> 1.0) - babosa (>= 1.0.2, < 2.0.0) + babosa (>= 1.0.3, < 2.0.0) bundler (>= 1.12.0, < 3.0.0) colored - commander-fastlane (>= 4.4.6, < 5.0.0) + commander (~> 4.6) dotenv (>= 2.1.1, < 3.0.0) - emoji_regex (>= 0.1, < 2.0) + emoji_regex (>= 0.1, < 4.0) excon (>= 0.71.0, < 1.0.0) - faraday (~> 0.17) + faraday (~> 1.0) faraday-cookie_jar (~> 0.0.6) - faraday_middleware (~> 0.13.1) + faraday_middleware (~> 1.0) fastimage (>= 2.1.0, < 3.0.0) gh_inspector (>= 1.1.2, < 2.0.0) - google-api-client (>= 0.29.2, < 0.37.0) - google-cloud-storage (>= 1.15.0, < 2.0.0) - highline (>= 1.7.2, < 2.0.0) + google-apis-androidpublisher_v3 (~> 0.3) + google-apis-playcustomapp_v1 (~> 0.1) + google-cloud-storage (~> 1.31) + highline (~> 2.0) json (< 3.0.0) - jwt (~> 2.1.0) + jwt (>= 2.1.0, < 3) mini_magick (>= 4.9.4, < 5.0.0) - multi_xml (~> 0.5) multipart-post (~> 2.0.0) + naturally (~> 2.2) + optparse (~> 0.1.1) plist (>= 3.1.0, < 4.0.0) - public_suffix (~> 2.0.0) - rubyzip (>= 1.3.0, < 2.0.0) + rubyzip (>= 2.0.0, < 3.0.0) security (= 0.1.3) simctl (~> 1.6.3) - slack-notifier (>= 2.0.0, < 3.0.0) terminal-notifier (>= 2.0.0, < 3.0.0) terminal-table (>= 1.4.5, < 2.0.0) tty-screen (>= 0.6.3, < 1.0.0) @@ -130,111 +155,126 @@ GEM xcodeproj (>= 1.13.0, < 2.0.0) xcpretty (~> 0.3.0) xcpretty-travis-formatter (>= 0.0.3) - ffi (1.12.2) + ffi (1.15.5) fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) - google-api-client (0.36.4) + google-apis-androidpublisher_v3 (0.32.0) + google-apis-core (>= 0.9.1, < 2.a) + google-apis-core (0.9.5) addressable (~> 2.5, >= 2.5.1) - googleauth (~> 0.9) - httpclient (>= 2.8.1, < 3.0) + googleauth (>= 0.16.2, < 2.a) + httpclient (>= 2.8.1, < 3.a) mini_mime (~> 1.0) representable (~> 3.0) - retriable (>= 2.0, < 4.0) - signet (~> 0.12) - google-cloud-core (1.5.0) + retriable (>= 2.0, < 4.a) + rexml + webrick + google-apis-iamcredentials_v1 (0.16.0) + google-apis-core (>= 0.9.1, < 2.a) + google-apis-playcustomapp_v1 (0.12.0) + google-apis-core (>= 0.9.1, < 2.a) + google-apis-storage_v1 (0.19.0) + google-apis-core (>= 0.9.0, < 2.a) + google-cloud-core (1.6.0) google-cloud-env (~> 1.0) google-cloud-errors (~> 1.0) - google-cloud-env (1.3.1) - faraday (>= 0.17.3, < 2.0) - google-cloud-errors (1.0.0) - google-cloud-storage (1.26.0) - addressable (~> 2.5) + google-cloud-env (1.6.0) + faraday (>= 0.17.3, < 3.0) + google-cloud-errors (1.3.0) + google-cloud-storage (1.44.0) + addressable (~> 2.8) digest-crc (~> 0.4) - google-api-client (~> 0.33) - google-cloud-core (~> 1.2) - googleauth (~> 0.9) + google-apis-iamcredentials_v1 (~> 0.1) + google-apis-storage_v1 (~> 0.19.0) + google-cloud-core (~> 1.6) + googleauth (>= 0.16.2, < 2.a) mini_mime (~> 1.0) - googleauth (0.12.0) - faraday (>= 0.17.3, < 2.0) + googleauth (1.3.0) + faraday (>= 0.17.3, < 3.a) jwt (>= 1.4, < 3.0) memoist (~> 0.16) multi_json (~> 1.11) os (>= 0.9, < 2.0) - signet (~> 0.14) - highline (1.7.10) - http-cookie (1.0.3) + signet (>= 0.16, < 2.a) + highline (2.0.3) + http-cookie (1.0.5) domain_name (~> 0.5) httpclient (2.8.3) - i18n (0.9.5) + i18n (1.12.0) concurrent-ruby (~> 1.0) - jmespath (1.4.0) - json (2.3.0) - jwt (2.1.0) + jmespath (1.6.2) + json (2.6.3) + jwt (2.6.0) memoist (0.16.2) - mini_magick (4.10.1) - mini_mime (1.0.2) - minitest (5.14.0) - molinillo (0.6.6) - multi_json (1.14.1) - multi_xml (0.6.0) + mini_magick (4.12.0) + mini_mime (1.1.2) + minitest (5.17.0) + molinillo (0.8.0) + multi_json (1.15.0) multipart-post (2.0.0) - nanaimo (0.2.6) + nanaimo (0.3.0) nap (1.1.0) - naturally (2.2.0) + naturally (2.2.1) netrc (0.11.0) - os (1.1.0) - plist (3.5.0) - public_suffix (2.0.5) - representable (3.0.4) + optparse (0.1.1) + os (1.1.4) + plist (3.6.0) + public_suffix (4.0.7) + rake (13.0.6) + representable (3.2.0) declarative (< 0.1.0) - declarative-option (< 0.2.0) + trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) retriable (3.1.2) + rexml (3.2.5) rouge (2.0.7) - ruby-macho (1.4.0) - rubyzip (1.3.0) + ruby-macho (2.5.1) + ruby2_keywords (0.0.5) + rubyzip (2.3.2) security (0.1.3) - signet (0.14.0) - addressable (~> 2.3) - faraday (>= 0.17.3, < 2.0) + signet (0.17.0) + addressable (~> 2.8) + faraday (>= 0.17.5, < 3.a) jwt (>= 1.5, < 3.0) multi_json (~> 1.10) simctl (1.6.8) CFPropertyList naturally - slack-notifier (2.3.2) terminal-notifier (2.0.0) terminal-table (1.8.0) unicode-display_width (~> 1.1, >= 1.1.1) - thread_safe (0.3.6) + trailblazer-option (0.1.2) tty-cursor (0.7.1) - tty-screen (0.7.1) + tty-screen (0.8.1) tty-spinner (0.9.3) tty-cursor (~> 0.7) - typhoeus (1.3.1) + typhoeus (1.4.0) ethon (>= 0.9.0) - tzinfo (1.2.7) - thread_safe (~> 0.1) + tzinfo (2.0.5) + concurrent-ruby (~> 1.0) uber (0.1.0) unf (0.1.4) unf_ext - unf_ext (0.0.7.7) - unicode-display_width (1.7.0) + unf_ext (0.0.8.2) + unicode-display_width (1.8.0) + webrick (1.7.0) word_wrap (1.0.0) - xcode-install (2.6.4) - claide (>= 0.9.1, < 1.1.0) + xcode-install (2.8.1) + claide (>= 0.9.1) fastlane (>= 2.1.0, < 3.0.0) - xcodeproj (1.16.0) + xcodeproj (1.22.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) colored2 (~> 3.1) - nanaimo (~> 0.2.6) + nanaimo (~> 0.3.0) + rexml (~> 3.2.4) xcpretty (0.3.0) rouge (~> 2.0.7) - xcpretty-travis-formatter (1.0.0) + xcpretty-travis-formatter (1.0.1) xcpretty (~> 0.2, >= 0.0.7) + zeitwerk (2.6.6) PLATFORMS ruby @@ -245,4 +285,4 @@ DEPENDENCIES xcode-install BUNDLED WITH - 2.1.2 + 2.4.1 diff --git a/README.md b/README.md index d193dfe8d1..129577d6be 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,14 @@ +# AFNetworking is Deprecated + +As of Jan. 17, 2023, AFNetworking is deprecated and there will be no further releases. This repo will remain online in perpetuity as an archive. There are a couple options for continued AFNetworking use: + +1. Copy AFNetworking into your project and compile it directly. This gives you full control over the code. +2. Fork AFNetworking and use the fork in your dependency manager. There will be no official forks but anyone can fork at any time and can even publish those forks under a different name, in accordance with AFNetworking's license. + +Moving forward, Alamofire is the suggested migration path for networking in modern Swift. Anyone who needs help making that migration is welcome to ask on [StackOverflow](https://stackoverflow.com) and tag `alamofire` and `afnetworking`, or open a discussion on Alamofire's [GitHub Discussions](https://github.com/Alamofire/Alamofire/discussions) regarding any migration issues or missing features. + +--- +

AFNetworking

@@ -26,6 +37,7 @@ Perhaps the most important feature of all, however, is the amazing community of - If you **want to contribute**, submit a pull request. ## Installation + AFNetworking supports multiple methods for installing the library in a project. ## Installation with CocoaPods @@ -58,14 +70,14 @@ github "AFNetworking/AFNetworking" ~> 4.0 ## Requirements -| AFNetworking Version | Minimum iOS Target | Minimum macOS Target | Minimum watchOS Target | Minimum tvOS Target | Notes | -|:--------------------:|:---------------------------:|:----------------------------:|:----------------------------:|:----------------------------:|:-------------------------------------------------------------------------:| -| 4.x | iOS 9 | macOS 10.10 | watchOS 2.0 | tvOS 9.0 | Xcode 11+ is required. | -| 3.x | iOS 7 | OS X 10.9 | watchOS 2.0 | tvOS 9.0 | Xcode 7+ is required. `NSURLConnectionOperation` support has been removed. | -| 2.6 -> 2.6.3 | iOS 7 | OS X 10.9 | watchOS 2.0 | n/a | Xcode 7+ is required. | -| 2.0 -> 2.5.4 | iOS 6 | OS X 10.8 | n/a | n/a | Xcode 5+ is required. `NSURLSession` subspec requires iOS 7 or OS X 10.9. | -| 1.x | iOS 5 | Mac OS X 10.7 | n/a | n/a | -| 0.10.x | iOS 4 | Mac OS X 10.6 | n/a | n/a | +| AFNetworking Version | Minimum iOS Target | Minimum macOS Target | Minimum watchOS Target | Minimum tvOS Target | Notes | +| :------------------: | :----------------: | :------------------: | :--------------------: | :-----------------: | :------------------------------------------------------------------------: | +| 4.x | iOS 9 | macOS 10.10 | watchOS 2.0 | tvOS 9.0 | Xcode 11+ is required. | +| 3.x | iOS 7 | OS X 10.9 | watchOS 2.0 | tvOS 9.0 | Xcode 7+ is required. `NSURLConnectionOperation` support has been removed. | +| 2.6 -> 2.6.3 | iOS 7 | OS X 10.9 | watchOS 2.0 | n/a | Xcode 7+ is required. | +| 2.0 -> 2.5.4 | iOS 6 | OS X 10.8 | n/a | n/a | Xcode 5+ is required. `NSURLSession` subspec requires iOS 7 or OS X 10.9. | +| 1.x | iOS 5 | Mac OS X 10.7 | n/a | n/a | +| 0.10.x | iOS 4 | Mac OS X 10.6 | n/a | n/a | (macOS projects must support [64-bit with modern Cocoa runtime](https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtVersionsPlatforms.html)). @@ -80,11 +92,11 @@ github "AFNetworking/AFNetworking" ~> 4.0 ### Serialization -* `` +- `` - `AFHTTPRequestSerializer` - `AFJSONRequestSerializer` - `AFPropertyListRequestSerializer` -* `` +- `` - `AFHTTPResponseSerializer` - `AFJSONResponseSerializer` - `AFXMLParserResponseSerializer` @@ -239,12 +251,12 @@ NSDictionary *parameters = @{@"foo": @"bar", @"baz": @[@1, @2, @3]}; `AFNetworkReachabilityManager` monitors the reachability of domains, and addresses for both WWAN and WiFi network interfaces. -* Do not use Reachability to determine if the original request should be sent. - * You should try to send it. -* You can use Reachability to determine when a request should be automatically retried. - * Although it may still fail, a Reachability notification that the connectivity is available is a good time to retry something. -* Network reachability is a useful tool for determining why a request might have failed. - * After a network request has failed, telling the user they're offline is better than giving them a more technical but accurate error, such as "request timed out." +- Do not use Reachability to determine if the original request should be sent. + - You should try to send it. +- You can use Reachability to determine when a request should be automatically retried. + - Although it may still fail, a Reachability notification that the connectivity is available is a good time to retry something. +- Network reachability is a useful tool for determining why a request might have failed. + - After a network request has failed, telling the user they're offline is better than giving them a more technical but accurate error, such as "request timed out." See also [WWDC 2012 session 706, "Networking Best Practices."](https://developer.apple.com/videos/play/wwdc2012-706/).