From b856a2f65e5c6832bbd03b4b70b972cdfe0e3bbb Mon Sep 17 00:00:00 2001 From: Aliona Date: Wed, 11 Jul 2018 17:09:33 +0300 Subject: [PATCH 1/9] Update key string --- .../NetworkServiceConfiguration.swift | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Sources/Structures/NetworkService/NetworkServiceConfiguration.swift b/Sources/Structures/NetworkService/NetworkServiceConfiguration.swift index 855461cb..2e903757 100644 --- a/Sources/Structures/NetworkService/NetworkServiceConfiguration.swift +++ b/Sources/Structures/NetworkService/NetworkServiceConfiguration.swift @@ -59,9 +59,20 @@ public struct NetworkServiceConfiguration { sessionConfiguration.timeoutIntervalForResource = timeoutInterval sessionConfiguration.httpAdditionalHeaders = additionalHttpHeaders - serverTrustPolicies = [baseUrl: .disableEvaluation] + let urlKey = String.parseHost(from: baseUrl) + serverTrustPolicies = [urlKey: .disableEvaluation] } +} +private extension String { + + static func parseHost(from string: String) -> String { + return URL(string: string)?.host ?? string + .replacingOccurrences(of: "https://", with: "") + .replacingOccurrences(of: "http://", with: "") + .components(separatedBy: "/") + .first ?? "" + } } public extension NetworkServiceConfiguration { From 0d0ae7191681ed753d28a841d3886909e211baf4 Mon Sep 17 00:00:00 2001 From: Aliona Date: Wed, 11 Jul 2018 17:23:05 +0300 Subject: [PATCH 2/9] Add assertion failure --- .../NetworkServiceConfiguration.swift | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Sources/Structures/NetworkService/NetworkServiceConfiguration.swift b/Sources/Structures/NetworkService/NetworkServiceConfiguration.swift index 2e903757..da508be3 100644 --- a/Sources/Structures/NetworkService/NetworkServiceConfiguration.swift +++ b/Sources/Structures/NetworkService/NetworkServiceConfiguration.swift @@ -59,19 +59,19 @@ public struct NetworkServiceConfiguration { sessionConfiguration.timeoutIntervalForResource = timeoutInterval sessionConfiguration.httpAdditionalHeaders = additionalHttpHeaders - let urlKey = String.parseHost(from: baseUrl) + let urlKey = baseUrl.parseHost() serverTrustPolicies = [urlKey: .disableEvaluation] } } private extension String { - static func parseHost(from string: String) -> String { - return URL(string: string)?.host ?? string - .replacingOccurrences(of: "https://", with: "") - .replacingOccurrences(of: "http://", with: "") - .components(separatedBy: "/") - .first ?? "" + func parseHost() -> String { + guard let host = URL(string: self)?.host else { + assertionFailure("Cannot detect host for base URL") + return "" + } + return host } } From 3d2a53c906d45ecda1f12cc1a86960498174d331 Mon Sep 17 00:00:00 2001 From: Aliona Date: Wed, 11 Jul 2018 17:29:38 +0300 Subject: [PATCH 3/9] Update version --- CHANGELOG.md | 4 ++++ LeadKit.podspec | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 33145d52..c26abb38 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +### 0.8.6 + +- **Fix**: Update `serverTrustPolicies` to save host instead of the whole URL as a key. + ### 0.8.5 - **Add**: `replaceDataSource` method to `RxNetworkOperationModel`. diff --git a/LeadKit.podspec b/LeadKit.podspec index 6dcfc5ee..679710cf 100644 --- a/LeadKit.podspec +++ b/LeadKit.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "LeadKit" - s.version = "0.8.5" + s.version = "0.8.6" s.summary = "iOS framework with a bunch of tools for rapid development" s.homepage = "https://github.com/TouchInstinct/LeadKit" s.license = "Apache License, Version 2.0" From 41db20ffacdc02b3adc634092f62134927192413 Mon Sep 17 00:00:00 2001 From: Aliona Date: Wed, 11 Jul 2018 18:02:23 +0300 Subject: [PATCH 4/9] Pass serverTrustPolicies to init --- .../NetworkService/NetworkServiceConfiguration.swift | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Sources/Structures/NetworkService/NetworkServiceConfiguration.swift b/Sources/Structures/NetworkService/NetworkServiceConfiguration.swift index da508be3..32ea1703 100644 --- a/Sources/Structures/NetworkService/NetworkServiceConfiguration.swift +++ b/Sources/Structures/NetworkService/NetworkServiceConfiguration.swift @@ -48,7 +48,8 @@ public struct NetworkServiceConfiguration { public init(baseUrl: String, timeoutInterval: TimeInterval = 20, encoding: ParameterEncoding = URLEncoding.default, - additionalHttpHeaders: HTTPHeaders = [:]) { + additionalHttpHeaders: HTTPHeaders = [:], + trustPolicies: [String: ServerTrustPolicy] = [:]) { self.baseUrl = baseUrl self.timeoutInterval = timeoutInterval @@ -59,14 +60,13 @@ public struct NetworkServiceConfiguration { sessionConfiguration.timeoutIntervalForResource = timeoutInterval sessionConfiguration.httpAdditionalHeaders = additionalHttpHeaders - let urlKey = baseUrl.parseHost() - serverTrustPolicies = [urlKey: .disableEvaluation] + serverTrustPolicies = trustPolicies.isEmpty ? [baseUrl.asHost : .disableEvaluation] : trustPolicies } } -private extension String { +extension String { - func parseHost() -> String { + var asHost: String { guard let host = URL(string: self)?.host else { assertionFailure("Cannot detect host for base URL") return "" From f90bf4a77affd8b428e8829955b0c6a49371ab63 Mon Sep 17 00:00:00 2001 From: Aliona Date: Wed, 11 Jul 2018 18:17:58 +0300 Subject: [PATCH 5/9] Map incoming policies to hosts --- .../NetworkService/NetworkServiceConfiguration.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Sources/Structures/NetworkService/NetworkServiceConfiguration.swift b/Sources/Structures/NetworkService/NetworkServiceConfiguration.swift index 32ea1703..8f546078 100644 --- a/Sources/Structures/NetworkService/NetworkServiceConfiguration.swift +++ b/Sources/Structures/NetworkService/NetworkServiceConfiguration.swift @@ -60,7 +60,9 @@ public struct NetworkServiceConfiguration { sessionConfiguration.timeoutIntervalForResource = timeoutInterval sessionConfiguration.httpAdditionalHeaders = additionalHttpHeaders - serverTrustPolicies = trustPolicies.isEmpty ? [baseUrl.asHost : .disableEvaluation] : trustPolicies + var updatedPolicies: [String: ServerTrustPolicy] = [:] + trustPolicies.forEach { updatedPolicies[$0.key.asHost] = $0.value } + serverTrustPolicies = trustPolicies.isEmpty ? [baseUrl.asHost: .disableEvaluation] : updatedPolicies } } From cf017b7cda9499004732e5321738fdbf7ae1f22f Mon Sep 17 00:00:00 2001 From: Aliona Date: Wed, 11 Jul 2018 19:06:28 +0300 Subject: [PATCH 6/9] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c26abb38..68146e35 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ### 0.8.6 +- **Fix**: Add `trustPolicies` param to `NetworkServiceConfiguration` initialization. - **Fix**: Update `serverTrustPolicies` to save host instead of the whole URL as a key. ### 0.8.5 From f69f4a12aed441aa7667481b276b30b761a293da Mon Sep 17 00:00:00 2001 From: Aliona Date: Wed, 11 Jul 2018 19:42:08 +0300 Subject: [PATCH 7/9] Move string extension to a separate file --- LeadKit.xcodeproj/project.pbxproj | 10 +++++ .../String/String+ConvertToHost.swift | 38 +++++++++++++++++++ .../NetworkServiceConfiguration.swift | 11 ------ 3 files changed, 48 insertions(+), 11 deletions(-) create mode 100644 Sources/Extensions/String/String+ConvertToHost.swift diff --git a/LeadKit.xcodeproj/project.pbxproj b/LeadKit.xcodeproj/project.pbxproj index 478e16ee..8041c081 100644 --- a/LeadKit.xcodeproj/project.pbxproj +++ b/LeadKit.xcodeproj/project.pbxproj @@ -19,6 +19,10 @@ 3622F5E220E25883009DED94 /* SeparatorRowBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = A66428A81F8A655600C6308D /* SeparatorRowBox.swift */; }; 36977763200CF12100ED9C6E /* UITableView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36DAAF502007CC920090BE0D /* UITableView+Extensions.swift */; }; 36DAAF512007CC920090BE0D /* UITableView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36DAAF502007CC920090BE0D /* UITableView+Extensions.swift */; }; + 36FE777020F669E300284C09 /* String+ConvertToHost.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36FE776F20F669E300284C09 /* String+ConvertToHost.swift */; }; + 36FE777120F669E300284C09 /* String+ConvertToHost.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36FE776F20F669E300284C09 /* String+ConvertToHost.swift */; }; + 36FE777220F669E300284C09 /* String+ConvertToHost.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36FE776F20F669E300284C09 /* String+ConvertToHost.swift */; }; + 36FE777320F669E300284C09 /* String+ConvertToHost.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36FE776F20F669E300284C09 /* String+ConvertToHost.swift */; }; 40F118471F8FEF97004AADAF /* AppearanceConfigurable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40F118461F8FEF97004AADAF /* AppearanceConfigurable.swift */; }; 40F118491F8FF223004AADAF /* TableRow+AppearanceExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40F118481F8FF223004AADAF /* TableRow+AppearanceExtension.swift */; }; 67051ADB1EBC7C36008EADC0 /* SpinnerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67051ADA1EBC7C36008EADC0 /* SpinnerView.swift */; }; @@ -632,6 +636,7 @@ 287AC0683207753A363152CB /* Pods_LeadKit_watchOSTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_LeadKit_watchOSTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 2BD6FE790236CFF8D2CD505E /* Pods-LeadKit-LeadKit iOS Extensions.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LeadKit-LeadKit iOS Extensions.release.xcconfig"; path = "Pods/Target Support Files/Pods-LeadKit-LeadKit iOS Extensions/Pods-LeadKit-LeadKit iOS Extensions.release.xcconfig"; sourceTree = ""; }; 36DAAF502007CC920090BE0D /* UITableView+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITableView+Extensions.swift"; sourceTree = ""; }; + 36FE776F20F669E300284C09 /* String+ConvertToHost.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+ConvertToHost.swift"; sourceTree = ""; }; 381DF859FC4E26D499123014 /* Pods-LeadKit iOS ExtensionsTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LeadKit iOS ExtensionsTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-LeadKit iOS ExtensionsTests/Pods-LeadKit iOS ExtensionsTests.release.xcconfig"; sourceTree = ""; }; 3C88ED8C9373F85C06697849 /* Pods_LeadKit_iOS_ExtensionsTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_LeadKit_iOS_ExtensionsTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 40F118461F8FEF97004AADAF /* AppearanceConfigurable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppearanceConfigurable.swift; sourceTree = ""; }; @@ -1090,6 +1095,7 @@ A676AE471F97D28A001F9214 /* String+Extensions.swift */, 671461FC1EB3396E00EAB194 /* String+Localization.swift */, A6F32C071F6EBDAA00AC08EE /* String+LocalizedComponent.swift */, + 36FE776F20F669E300284C09 /* String+ConvertToHost.swift */, ); path = String; sourceTree = ""; @@ -2613,6 +2619,7 @@ 6714626C1EB3396E00EAB194 /* XibView.swift in Sources */, 67274778206CD0B500725163 /* UILabel+ViewTextConfiguration.swift in Sources */, 67ED2BE520B44F4300508B3E /* InitializableView+DefaultImplementation.swift in Sources */, + 36FE777020F669E300284C09 /* String+ConvertToHost.swift in Sources */, 6774529220625D170024EEEF /* GeneralDataLoadingModel.swift in Sources */, 6714637C1EB3396E00EAB194 /* ImageDrawingOperation.swift in Sources */, 671463341EB3396E00EAB194 /* DrawingOperation.swift in Sources */, @@ -2718,6 +2725,7 @@ 6714626A1EB3396E00EAB194 /* NetworkService.swift in Sources */, 671AD26E206A3E8500EAF887 /* Array+TotalCountCursorListingResult.swift in Sources */, 673CF4132063ABD100C329F6 /* GeneralDataLoadingState+Extensions.swift in Sources */, + 36FE777220F669E300284C09 /* String+ConvertToHost.swift in Sources */, 6713C24320AF189100875921 /* RxNetworkOperationModel.swift in Sources */, 671462921EB3396E00EAB194 /* CGImage+Crop.swift in Sources */, 6741C41120EAC88800418D08 /* GeneralDataLoadingViewModel+Extensions.swift in Sources */, @@ -2844,6 +2852,7 @@ 671AD26F206A3E8500EAF887 /* Array+TotalCountCursorListingResult.swift in Sources */, 67955D55206D216B0021ECD2 /* Singleton.swift in Sources */, EFBE57D31EC35EF20040E00A /* Array+Extensions.swift in Sources */, + 36FE777320F669E300284C09 /* String+ConvertToHost.swift in Sources */, 67FD4385206BD24B005B0C64 /* EqutableOptionalArray.swift in Sources */, 67CAF8AE2065189C00527085 /* NetworkService+ActivityIndicator.swift in Sources */, 6714638B1EB3396E00EAB194 /* RoundDrawingOperation.swift in Sources */, @@ -3039,6 +3048,7 @@ 671463711EB3396E00EAB194 /* ApiRequestParameters.swift in Sources */, 3622F5DB20E24F99009DED94 /* Array+SeparatorRowBoxExtensions.swift in Sources */, 671462ED1EB3396E00EAB194 /* UIImage+Extensions.swift in Sources */, + 36FE777120F669E300284C09 /* String+ConvertToHost.swift in Sources */, 6714636D1EB3396E00EAB194 /* XibNameProtocol.swift in Sources */, 673CF42D2063DE5900C329F6 /* TextPlaceholderView.swift in Sources */, 6713C24220AF189100875921 /* RxNetworkOperationModel.swift in Sources */, diff --git a/Sources/Extensions/String/String+ConvertToHost.swift b/Sources/Extensions/String/String+ConvertToHost.swift new file mode 100644 index 00000000..1232911c --- /dev/null +++ b/Sources/Extensions/String/String+ConvertToHost.swift @@ -0,0 +1,38 @@ +// +// Copyright (c) 2018 Touch Instinct +// +// 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 Foundation + +extension String { + + /** + Extracts host from strings that can be converted to URL. + Causes assertionFailure if string cannot be converted. + */ + var asHost: String { + guard let host = URL(string: self)?.host else { + assertionFailure("Cannot detect host for base URL") + return "" + } + return host + } +} diff --git a/Sources/Structures/NetworkService/NetworkServiceConfiguration.swift b/Sources/Structures/NetworkService/NetworkServiceConfiguration.swift index 8f546078..4fc70091 100644 --- a/Sources/Structures/NetworkService/NetworkServiceConfiguration.swift +++ b/Sources/Structures/NetworkService/NetworkServiceConfiguration.swift @@ -66,17 +66,6 @@ public struct NetworkServiceConfiguration { } } -extension String { - - var asHost: String { - guard let host = URL(string: self)?.host else { - assertionFailure("Cannot detect host for base URL") - return "" - } - return host - } -} - public extension NetworkServiceConfiguration { /// SessionManager constructed with given parameters (session configuration and trust policies) From 3901e38f81804b8030e9f2711be99734e286adf1 Mon Sep 17 00:00:00 2001 From: Aliona Date: Wed, 11 Jul 2018 19:43:50 +0300 Subject: [PATCH 8/9] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 68146e35..59e090ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - **Fix**: Add `trustPolicies` param to `NetworkServiceConfiguration` initialization. - **Fix**: Update `serverTrustPolicies` to save host instead of the whole URL as a key. +- **Add**: String extension that extracts host. ### 0.8.5 From 662010fc0f3881d1fd029f040a0053b46c234e71 Mon Sep 17 00:00:00 2001 From: Aliona Date: Thu, 12 Jul 2018 14:39:04 +0300 Subject: [PATCH 9/9] Update pull according to comments --- Sources/Extensions/String/String+ConvertToHost.swift | 7 +++---- .../NetworkService/NetworkServiceConfiguration.swift | 3 +-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/Sources/Extensions/String/String+ConvertToHost.swift b/Sources/Extensions/String/String+ConvertToHost.swift index 1232911c..02fdc0af 100644 --- a/Sources/Extensions/String/String+ConvertToHost.swift +++ b/Sources/Extensions/String/String+ConvertToHost.swift @@ -24,10 +24,9 @@ import Foundation extension String { - /** - Extracts host from strings that can be converted to URL. - Causes assertionFailure if string cannot be converted. - */ + /// Extracts host from strings that can be converted to URL. + /// Causes assertionFailure if string cannot be converted. + var asHost: String { guard let host = URL(string: self)?.host else { assertionFailure("Cannot detect host for base URL") diff --git a/Sources/Structures/NetworkService/NetworkServiceConfiguration.swift b/Sources/Structures/NetworkService/NetworkServiceConfiguration.swift index 4fc70091..494072d6 100644 --- a/Sources/Structures/NetworkService/NetworkServiceConfiguration.swift +++ b/Sources/Structures/NetworkService/NetworkServiceConfiguration.swift @@ -60,8 +60,7 @@ public struct NetworkServiceConfiguration { sessionConfiguration.timeoutIntervalForResource = timeoutInterval sessionConfiguration.httpAdditionalHeaders = additionalHttpHeaders - var updatedPolicies: [String: ServerTrustPolicy] = [:] - trustPolicies.forEach { updatedPolicies[$0.key.asHost] = $0.value } + let updatedPolicies = Dictionary(uniqueKeysWithValues: trustPolicies.map { ($0.key.asHost, $0.value) }) serverTrustPolicies = trustPolicies.isEmpty ? [baseUrl.asHost: .disableEvaluation] : updatedPolicies } }