added iOS source code
[wl-app.git] / iOS / Pods / OAuthSwift / Sources / String+OAuthSwift.swift
1 //
2 //  String+OAuthSwift.swift
3 //  OAuthSwift
4 //
5 //  Created by Dongri Jin on 6/21/14.
6 //  Copyright (c) 2014 Dongri Jin. All rights reserved.
7 //
8
9 import Foundation
10
11 extension String {
12
13     var parametersFromQueryString: [String: String] {
14         return dictionaryBySplitting("&", keyValueSeparator: "=")
15     }
16
17     /// Encodes url string making it ready to be passed as a query parameter. This encodes pretty much everything apart from
18     /// alphanumerics and a few other characters compared to standard query encoding.
19     var urlEncoded: String {
20         let customAllowedSet = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~")
21         return self.addingPercentEncoding(withAllowedCharacters: customAllowedSet)!
22     }
23
24     var urlQueryEncoded: String? {
25         return self.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)
26     }
27
28     /// Returns new url query string by appending query parameter encoding it first, if specified.
29     func urlQueryByAppending(parameter name: String, value: String, encode: Bool = true, _ encodeError: ((String, String) -> Void)? = nil) -> String? {
30         if value.isEmpty {
31             return self
32         } else if let value = encode ? value.urlQueryEncoded : value {
33             return "\(self)\(self.isEmpty ? "" : "&")\(name)=\(value)"
34         } else {
35             encodeError?(name, value)
36             return nil
37         }
38     }
39
40     /// Returns new url string by appending query string at the end.
41     func urlByAppending(query: String) -> String {
42         return "\(self)\(self.contains("?") ? "&" : "?")\(query)"
43     }
44
45     fileprivate func dictionaryBySplitting(_ elementSeparator: String, keyValueSeparator: String) -> [String: String] {
46         var string = self
47
48         if hasPrefix(elementSeparator) {
49             string = String(dropFirst(1))
50         }
51
52         var parameters = [String: String]()
53
54         let scanner = Scanner(string: string)
55
56         var key: NSString?
57         var value: NSString?
58
59         while !scanner.isAtEnd {
60             key = nil
61             scanner.scanUpTo(keyValueSeparator, into: &key)
62             scanner.scanString(keyValueSeparator, into: nil)
63
64             value = nil
65             scanner.scanUpTo(elementSeparator, into: &value)
66             scanner.scanString(elementSeparator, into: nil)
67
68             if let key = key as String? {
69                 if let value = value as String? {
70                     if key.contains(elementSeparator) {
71                         var keys = key.components(separatedBy: elementSeparator)
72                         if let key = keys.popLast() {
73                             parameters.updateValue(value, forKey: String(key))
74                         }
75                         for flag in keys {
76                             parameters.updateValue("", forKey: flag)
77                         }
78                     } else {
79                         parameters.updateValue(value, forKey: key)
80                     }
81                 } else {
82                     parameters.updateValue("", forKey: key)
83                 }
84             }
85         }
86
87         return parameters
88     }
89
90     public var headerDictionary: OAuthSwift.Headers {
91         return dictionaryBySplitting(",", keyValueSeparator: "=")
92     }
93
94     var safeStringByRemovingPercentEncoding: String {
95         return self.removingPercentEncoding ?? self
96     }
97
98     mutating func dropLast() {
99         self.remove(at: self.index(before: self.endIndex))
100     }
101
102     subscript (bounds: CountableClosedRange<Int>) -> String {
103         let start = index(startIndex, offsetBy: bounds.lowerBound)
104         let end = index(startIndex, offsetBy: bounds.upperBound)
105         return String(self[start...end])
106     }
107
108     subscript (bounds: CountableRange<Int>) -> String {
109         let start = index(startIndex, offsetBy: bounds.lowerBound)
110         let end = index(startIndex, offsetBy: bounds.upperBound)
111         return String(self[start..<end])
112     }
113 }
114
115 extension String.Encoding {
116
117     var charset: String {
118         let charset = CFStringConvertEncodingToIANACharSetName(CFStringConvertNSStringEncodingToEncoding(self.rawValue))
119          // swiftlint:disable:next force_cast
120         return charset! as String
121     }
122
123 }