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
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 {
{ 0029 public struct UserInfo
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 {
: Hashable, CustomStringConvertible { 0030 public var username
URI.swift:34
            self.username = username
URI.swift:43
            return "\(username):\(password)"
: String 0031 public var password
URI.swift:35
            self.password = password
URI.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:214
    return lhs.hashValue == rhs.hashValue
URI.swift:214
    return lhs.hashValue == rhs.hashValue
: Int { 0039 return description.hashValue 0040 } 0041 0042 public var description
URI.swift:39
            return description.hashValue
: String { 0043 return "\(username):\(password)" 0044 } 0045 } 0046 0047 public var scheme
URI.swift:56
        self.scheme = scheme
URI.swift:74
            scheme = nil
URI.swift:164
        if let scheme = scheme {
: String? 0048 public var userInfo
URI.swift:57
        self.userInfo = userInfo
URI.swift:113
            userInfo = URI.parseUserInfoString(userInfoString)
URI.swift:115
            userInfo = nil
URI.swift:168
        if let userInfo = userInfo {
: UserInfo? 0049 public var host
URI.swift:58
        self.host = host
URI.swift:81
            host = nil
URI.swift:172
        if let host = host {
: String? 0050 public var port
URI.swift:59
        self.port = port
URI.swift:85
            port = Int(u.port)
URI.swift:87
            port = nil
URI.swift:176
        if let port = port {
: Int? 0051 public var path
URI.swift:60
        self.path = path
URI.swift:94
            path = nil
URI.swift:180
        if let path = path {
: String? 0052 public var query
URI.swift:61
        self.query = query
URI.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: String] 0053 public var fragment
URI.swift:62
        self.fragment = fragment
URI.swift:108
            fragment = nil
URI.swift:195
        if let fragment = fragment {
: 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: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)
(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:113
            userInfo = URI.parseUserInfoString(userInfoString)
(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:99
            query = URI.parseQueryString(queryString)
(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:205
        return description.hashValue
: 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:210
    return lhs.hashValue == rhs.hashValue
URI.swift:210
    return lhs.hashValue == rhs.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