0001 // URI.swift 0002 // 0003 // The MIT License (MIT) 0004 // 0005 // Copyright (c) 2015 Zewo 0006 // 0007 // Permission is hereby granted, free of charge, to any person obtaining a copy 0008 // of this software and associated documentation files (the "Software"), to deal 0009 // in the Software without restriction, including without limitation the rights 0010 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 0011 // copies of the Software, and to permit persons to whom the Software is 0012 // furnished to do so, subject to the following conditions: 0013 // 0014 // The above copyright notice and this permission notice shall be included in all 0015 // copies or substantial portions of the Software. 0016 // 0017 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 0018 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 0019 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 0020 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 0021 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 0022 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 0023 // SOFTWARE. 0024 0025 import CURIParser 0026 @_exported import String 0027 0028 public struct URI{ 0029 public struct UserInfo
URI.swift:66 extension URI {URI.swift:71 let string = URI.getSubstring(string, start: u.scheme_start, end: u.scheme_end)URI.swift:78 let string = URI.getSubstring(string, start: u.host_start, end: u.host_end)URI.swift:91 let string = URI.getSubstring(string, start: u.path_start, end: u.path_end)URI.swift:98 let queryString = URI.getSubstring(string, start: u.query_start, end: u.query_end)URI.swift:99 query = URI.parseQueryString(queryString)URI.swift:105 let string = URI.getSubstring(string, start: u.fragment_start, end: u.fragment_end)URI.swift:112 let userInfoString = URI.getSubstring(string, start: u.user_info_start, end: u.user_info_end)URI.swift:113 userInfo = URI.parseUserInfoString(userInfoString)URI.swift:123 @inline(__always) private static func parseUserInfoString(userInfoString: String) -> URI.UserInfo? {URI.swift:129 return URI.UserInfo(URI.swift:160 extension URI: CustomStringConvertible {URI.swift:203 extension URI: Hashable {URI.swift:209 public func ==(lhs: URI, rhs: URI) -> Bool {URI.swift:209 public func ==(lhs: URI, rhs: URI) -> Bool {URI.swift:213 public func ==(lhs: URI.UserInfo, rhs: URI.UserInfo) -> Bool {URI.swift:213 public func ==(lhs: URI.UserInfo, rhs: URI.UserInfo) -> Bool {: Hashable, CustomStringConvertible { 0030 public var username
URI.swift:48 public var userInfo: UserInfo?URI.swift:55 public init(scheme: String? = nil, userInfo: UserInfo? = nil, host: String? = nil, port: Int? = nil, path: String? = nil, query: [String: String] = [:], fragment: String? = nil) {URI.swift:123 @inline(__always) private static func parseUserInfoString(userInfoString: String) -> URI.UserInfo? {URI.swift:213 public func ==(lhs: URI.UserInfo, rhs: URI.UserInfo) -> Bool {URI.swift:213 public func ==(lhs: URI.UserInfo, rhs: URI.UserInfo) -> Bool {: String 0031 public var password
URI.swift:34 self.username = usernameURI.swift:43 return "\(username):\(password)": String 0032 0033 public init(username: String, password: String) { 0034 self.username = username 0035 self.password = password 0036 } 0037 0038 public var hashValue
URI.swift:35 self.password = passwordURI.swift:43 return "\(username):\(password)": Int { 0039 return description.hashValue 0040 } 0041 0042 public var description
URI.swift:214 return lhs.hashValue == rhs.hashValueURI.swift:214 return lhs.hashValue == rhs.hashValue: String { 0043 return "\(username):\(password)" 0044 } 0045 } 0046 0047 public var scheme
URI.swift:39 return description.hashValue: String? 0048 public var userInfo
URI.swift:56 self.scheme = schemeURI.swift:74 scheme = nilURI.swift:164 if let scheme = scheme {: UserInfo? 0049 public var host
URI.swift:57 self.userInfo = userInfoURI.swift:113 userInfo = URI.parseUserInfoString(userInfoString)URI.swift:115 userInfo = nilURI.swift:168 if let userInfo = userInfo {: String? 0050 public var port
URI.swift:58 self.host = hostURI.swift:81 host = nilURI.swift:172 if let host = host {: Int? 0051 public var path
URI.swift:59 self.port = portURI.swift:85 port = Int(u.port)URI.swift:87 port = nilURI.swift:176 if let port = port {: String? 0052 public var query
URI.swift:60 self.path = pathURI.swift:94 path = nilURI.swift:180 if let path = path {: [String: String] 0053 public var fragment
URI.swift:61 self.query = queryURI.swift:99 query = URI.parseQueryString(queryString)URI.swift:101 query = [:]URI.swift:184 if query.count > 0 {URI.swift:188 for (index, (name, value)) in query.enumerate() {URI.swift:190 if index != query.values.count - 1 {: String? 0054 0055 public init(scheme: String? = nil, userInfo: UserInfo? = nil, host: String? = nil, port: Int? = nil, path: String? = nil, query: [String: String] = [:], fragment: String? = nil) { 0056 self.scheme = scheme 0057 self.userInfo = userInfo 0058 self.host = host 0059 self.port = port 0060 self.path = path 0061 self.query = query 0062 self.fragment = fragment 0063 } 0064 } 0065 0066 extension URI { 0067 public init(string: String) throws { 0068 let u = parse_uri(string) 0069 0070 if u.field_set & 1 != 0 { 0071 let string = URI.getSubstring(string, start: u.scheme_start, end: u.scheme_end) 0072 scheme = try String(percentEncoded: string) 0073 } else { 0074 scheme = nil 0075 } 0076 0077 if u.field_set & 2 != 0 { 0078 let string = URI.getSubstring(string, start: u.host_start, end: u.host_end) 0079 host = try String(percentEncoded: string) 0080 } else { 0081 host = nil 0082 } 0083 0084 if u.field_set & 4 != 0 { 0085 port = Int(u.port) 0086 } else { 0087 port = nil 0088 } 0089 0090 if u.field_set & 8 != 0 { 0091 let string = URI.getSubstring(string, start: u.path_start, end: u.path_end) 0092 path = try String(percentEncoded: string) 0093 } else { 0094 path = nil 0095 } 0096 0097 if u.field_set & 16 != 0 { 0098 let queryString = URI.getSubstring(string, start: u.query_start, end: u.query_end) 0099 query = URI.parseQueryString(queryString) 0100 } else { 0101 query = [:] 0102 } 0103 0104 if u.field_set & 32 != 0 { 0105 let string = URI.getSubstring(string, start: u.fragment_start, end: u.fragment_end) 0106 fragment = try String(percentEncoded: string) 0107 } else { 0108 fragment = nil 0109 } 0110 0111 if u.field_set & 64 != 0 { 0112 let userInfoString = URI.getSubstring(string, start: u.user_info_start, end: u.user_info_end) 0113 userInfo = URI.parseUserInfoString(userInfoString) 0114 } else { 0115 userInfo = nil 0116 } 0117 } 0118 0119 @inline(__always) private static func getSubstring
URI.swift:62 self.fragment = fragmentURI.swift:108 fragment = nilURI.swift:195 if let fragment = fragment {(string: String, start: UInt16, end: UInt16) -> String { 0120 return string[string.startIndex.advancedBy(Int(start)) ..< string.startIndex.advancedBy(Int(end))] 0121 } 0122 0123 @inline(__always) private static func parseUserInfoString
URI.swift:71 let string = URI.getSubstring(string, start: u.scheme_start, end: u.scheme_end)URI.swift:78 let string = URI.getSubstring(string, start: u.host_start, end: u.host_end)URI.swift:91 let string = URI.getSubstring(string, start: u.path_start, end: u.path_end)URI.swift:98 let queryString = URI.getSubstring(string, start: u.query_start, end: u.query_end)URI.swift:105 let string = URI.getSubstring(string, start: u.fragment_start, end: u.fragment_end)URI.swift:112 let userInfoString = URI.getSubstring(string, start: u.user_info_start, end: u.user_info_end)(userInfoString: String) -> URI.UserInfo? { 0124 let userInfoElements = userInfoString.split(":") 0125 if userInfoElements.count == 2 { 0126 if let 0127 username = try? String(percentEncoded: userInfoElements[0]), 0128 password = try? String(percentEncoded: userInfoElements[1]) { 0129 return URI.UserInfo( 0130 username: username, 0131 password: password 0132 ) 0133 } 0134 } 0135 0136 return nil 0137 } 0138 0139 @inline(__always) private static func parseQueryString
URI.swift:113 userInfo = URI.parseUserInfoString(userInfoString)(queryString: String) -> [String: String] { 0140 var query: [String: String] = [:] 0141 let queryTuples = queryString.split("&") 0142 for tuple in queryTuples { 0143 let queryElements = tuple.split("=") 0144 if queryElements.count == 1 { 0145 if let name = try? String(percentEncoded: queryElements[0]) { 0146 query[name] = "" 0147 } 0148 } else if queryElements.count == 2 { 0149 if let 0150 name = try? String(percentEncoded: queryElements[0]), 0151 value = try? String(percentEncoded: queryElements[1]) { 0152 query[name] = value 0153 } 0154 } 0155 } 0156 return query 0157 } 0158 } 0159 0160 extension URI: CustomStringConvertible { 0161 public var description
URI.swift:99 query = URI.parseQueryString(queryString): String { 0162 var string = "" 0163 0164 if let scheme = scheme { 0165 string += "\(scheme)://" 0166 } 0167 0168 if let userInfo = userInfo { 0169 string += "\(userInfo)@" 0170 } 0171 0172 if let host = host { 0173 string += "\(host)" 0174 } 0175 0176 if let port = port { 0177 string += ":\(port)" 0178 } 0179 0180 if let path = path { 0181 string += "\(path)" 0182 } 0183 0184 if query.count > 0 { 0185 string += "?" 0186 } 0187 0188 for (index, (name, value)) in query.enumerate() { 0189 string += "\(name)=\(value)" 0190 if index != query.values.count - 1 { 0191 string += "&" 0192 } 0193 } 0194 0195 if let fragment = fragment { 0196 string += "#\(fragment)" 0197 } 0198 0199 return string 0200 } 0201 } 0202 0203 extension URI: Hashable { 0204 public var hashValue
URI.swift:205 return description.hashValue: Int { 0205 return description.hashValue 0206 } 0207 } 0208 0209 public func ==(lhs: URI, rhs: URI) -> Bool { 0210 return lhs.hashValue == rhs.hashValue 0211 } 0212 0213 public func ==(lhs: URI.UserInfo, rhs: URI.UserInfo) -> Bool { 0214 return lhs.hashValue == rhs.hashValue 0215 } 0216
URI.swift:210 return lhs.hashValue == rhs.hashValueURI.swift:210 return lhs.hashValue == rhs.hashValue