@@ -53,7 +53,12 @@ private extension OAuth {
5353 }
5454
5555 static func signatureBaseString( httpMethod: String , baseUri: String , paramString: String ) -> String {
56- let escapedBaseUri = baseUri. addingPercentEncoding ( withAllowedCharacters: . urlHostAllowed) ?? " "
56+
57+ let generalDelimitersToEncode = " :#[]@/? " //added custom char set because default one doesn't include +
58+ let subDelimitersToEncode = " !$&'()*+,;= "
59+ var allowedCharacterSet = CharacterSet . urlQueryAllowed
60+ allowedCharacterSet. remove ( charactersIn: " \( generalDelimitersToEncode) \( subDelimitersToEncode) " )
61+ let escapedBaseUri = baseUri. addingPercentEncoding ( withAllowedCharacters: allowedCharacterSet) ?? " "
5762
5863 return httpMethod. uppercased ( )
5964 + " & "
@@ -70,7 +75,7 @@ private extension OAuth {
7075 let validChars = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 "
7176 return randomBytes. map { randomByte in
7277 return validChars [ Int ( randomByte % UInt8( validChars. count) ) ]
73- } . joined ( )
78+ } . joined ( )
7479 }
7580
7681 static func oauthParameters( withKey consumerKey: String , payload: String ? ) -> [ String : String ] {
@@ -90,12 +95,15 @@ private extension OAuth {
9095 oauthParameters: [ String : String ] ) -> String {
9196
9297 var allParameters = [ ( key: String, values: [ String] ) ] ( )
98+
99+ let sortedOauthParams = oauthParameters. sorted { $0. 0 < $1. 0 } . map { ( key: $0. key, values: [ $0. value] ) }
100+ allParameters += sortedOauthParams
101+
93102 if let queryParams = queryParameters {
94103 allParameters += queryParams. sorted { $0. 0 < $1. 0 } . map { ( key: $0. 0 , values: Array ( $0. value) ) }
95104 }
96105
97- let sortedOauthParams = oauthParameters. sorted { $0. 0 < $1. 0 } . map { ( key: $0. key, values: [ $0. value] ) }
98- allParameters += sortedOauthParams
106+ allParameters = allParameters. sorted { $0. 0 < $1. 0 } . map { ( key: $0. 0 , values: Array ( $0. values) ) }
99107
100108 var paramString = allParameters. reduce ( into: " " ) { combined, keyPair in
101109 keyPair. values. sorted ( ) . forEach { value in
0 commit comments