0001 // Request.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 @_exported import URI 0026 @_exported import Stream 0027 @_exported import String 0028 0029 public struct Request: MessageType { 0030 public typealias Upgrade = (Response, StreamType) throws -> Void 0031 0032 public var method
ClientType.swift:30 func send(request: Request, middleware: MiddlewareType...) throws -> ResponseBranchMiddleware.swift:26 public let shouldBranch: Request throws -> BoolBranchMiddleware.swift:28 public init(shouldBranch: Request throws -> Bool) {BranchMiddleware.swift:48 public func respond(request: Request, chain: ChainType) throws -> Response {MergeMiddleware.swift:40 public func respond(request: Request, chain: ChainType) throws -> Response {MiddlewareType.swift:26 func respond(request: Request, chain: ChainType) throws -> ResponseMiddlewareType.swift:44 let respond: (request: Request, chain: ChainType) throws -> ResponseMiddlewareType.swift:46 public init(respond: (request: Request, chain: ChainType) throws -> Response) {MiddlewareType.swift:50 public func respond(request: Request, chain: ChainType) throws -> Response {ParserType.swift:28 func parse(data: Data) throws -> Request?RequestParser.swift:44 var completion: Request -> VoidRequestParser.swift:46 init(completion: Request -> Void) {RequestParser.swift:68 var request: Request?RequestParser.swift:89 public func parse(data: Data) throws -> Request? {RequestParser.swift:115 public func parse(convertible: DataConvertible) throws -> Request? {RequestParser.swift:205 let request = Request(Request.swift:53 extension Request {Request.swift:212 extension Request: CustomStringConvertible {Request.swift:241 extension Request: CustomDebugStringConvertible {Request.swift:247 extension Request: Hashable {Request.swift:253 public func ==(lhs: Request, rhs: Request) -> Bool {Request.swift:253 public func ==(lhs: Request, rhs: Request) -> Bool {ResponderType.swift:26 func proceed(request: Request) throws -> ResponseResponderType.swift:30 func respond(request: Request) throws -> ResponseResponderType.swift:34 public func proceed(request: Request) throws -> Response {ResponderType.swift:39 public typealias Respond = Request throws -> ResponseResponderType.swift:48 public func respond(request: Request) throws -> Response {Response.swift:28 public typealias Upgrade = (Request, StreamType) throws -> VoidRoute.swift:38 public func respond(request: Request) throws -> Response {RouteMatcherType.swift:28 func match(request: Request) -> Route?RouterType.swift:32 public func respond(request: Request) throws -> Response {RequestSerializer.swift:30 public func serialize(request: Request, @noescape send: Data throws -> Void) throws {SerializerType.swift:28 func serialize(request: Request, @noescape send: Data throws -> Void) throws: Method 0033 public var uri: URI 0034 public var version: Version 0035 public var headers
Request.swift:214 return "\(method) \(uri) HTTP/\(version.major).\(version.minor)\n": Headers 0036 public var cookies
Request.swift:142 if let acceptString = headers["Accept"] {Request.swift:166 return headers["Host"]Request.swift:170 headers["Host"] = newValueRequest.swift:176 return headers["User-Agent"]Request.swift:180 headers["User-Agent"] = newValueRequest.swift:186 return headers["Authorization"]Request.swift:190 headers["Authorization"] = newValueRequestSerializer.swift:36 for (name, value) in request.headers {: Cookies 0037 public var body
Request.swift:220 for (index, cookie) in cookies.enumerate() {Request.swift:223 if index < cookies.count - 1 {RequestSerializer.swift:41 if request.cookies.count > 0 {RequestSerializer.swift:43 for (index, cookie) in request.cookies.enumerate() {RequestSerializer.swift:46 if index < request.cookies.count - 1 {: Body 0038 public var upgrade: Upgrade? 0039 0040 public var storage
RequestSerializer.swift:55 switch request.body {: Storage = [:] 0041 0042 init(method: Method, uri: URI, version: Version, headers: Headers, cookies: Cookies, body: Body, upgrade: Upgrade?) { 0043 self.method = method 0044 self.uri = uri 0045 self.version = version 0046 self.headers = headers 0047 self.cookies = cookies 0048 self.body = body 0049 self.upgrade = upgrade 0050 } 0051 } 0052 0053 extension Request { 0054 public init(method: Method, uri: URI, headers: Headers = [:], cookies: Cookies = [], body: Body, upgrade: Upgrade? = nil) { 0055 self.init( 0056 method: method, 0057 uri: uri, 0058 version: (major: 1, minor: 1), 0059 headers: headers, 0060 cookies: cookies, 0061 body: body, 0062 upgrade: upgrade 0063 ) 0064 0065 if let buffer = body.buffer { 0066 contentLength = buffer.count 0067 } else { 0068 transferEncoding = "chunked" 0069 } 0070 } 0071 0072 public init(method: Method, uri: URI, headers: Headers = [:], cookies: Cookies = [], body: Data = nil, upgrade: Upgrade? = nil) { 0073 self.init( 0074 method: method, 0075 uri: uri, 0076 headers: headers, 0077 cookies: cookies, 0078 body: .Buffer(body), 0079 upgrade: upgrade 0080 ) 0081 } 0082 0083 public init(method: Method, uri: URI, headers: Headers = [:], cookies: Cookies = [], body: DataConvertible, upgrade: Upgrade? = nil) { 0084 self.init( 0085 method: method, 0086 uri: uri, 0087 headers: headers, 0088 cookies: cookies, 0089 body: body.data, 0090 upgrade: upgrade 0091 ) 0092 } 0093 0094 public init(method: Method, uri: URI, headers: Headers = [:], cookies: Cookies = [], body: StreamType, upgrade: Upgrade? = nil) { 0095 self.init( 0096 method: method, 0097 uri: uri, 0098 headers: headers, 0099 cookies: cookies, 0100 body: .Stream(body), 0101 upgrade: upgrade 0102 ) 0103 } 0104 0105 public init(method: Method, uri: String, headers: Headers = [:], cookies: Cookies = [], body: Data = nil, upgrade: Upgrade? = nil) throws { 0106 self.init( 0107 method: method, 0108 uri: try URI(string: uri), 0109 headers: headers, 0110 cookies: cookies, 0111 body: body, 0112 upgrade: upgrade 0113 ) 0114 } 0115 0116 public init
Request.swift:199 return storage["pathParameters"] as? [String: String] ?? [:]Request.swift:196 storage["pathParameters"] = newValue(method: Method, uri: String, headers: Headers = [:], cookies: Cookies = [], body: DataConvertible, upgrade: Upgrade? = nil) throws { 0117 try self.init( 0118 method: method, 0119 uri: uri, 0120 headers: headers, 0121 cookies: cookies, 0122 body: body.data, 0123 upgrade: upgrade 0124 ) 0125 } 0126 0127 public init(method: Method, uri: String, headers: Headers = [:], cookies: Cookies = [], body: StreamType, upgrade: Upgrade? = nil) throws { 0128 self.init( 0129 method: method, 0130 uri: try URI(string: uri), 0131 headers: headers, 0132 cookies: cookies, 0133 body: body, 0134 upgrade: upgrade 0135 ) 0136 } 0137 0138 public var accept: [MediaType] { 0139 get { 0140 var acceptedMediaTypes: [MediaType] = [] 0141 0142 if let acceptString = headers["Accept"] { 0143 let acceptedTypesString = acceptString.split(",") 0144 0145 for acceptedTypeString in acceptedTypesString { 0146 let acceptedTypeTokens = acceptedTypeString.split(";") 0147 0148 if acceptedTypeTokens.count >= 1 { 0149 let mediaTypeString = acceptedTypeTokens[0].trim() 0150 acceptedMediaTypes.append(MediaType(string: mediaTypeString)) 0151 } 0152 } 0153 } 0154 0155 return acceptedMediaTypes 0156 } 0157 0158 set { 0159 let header = newValue.map({"\($0.type)/\($0.subtype)"}).joinWithSeparator(", ") 0160 headers["Accept"] = header 0161 } 0162 } 0163 0164 public var host: String? { 0165 get { 0166 return headers["Host"] 0167 } 0168 0169 set { 0170 headers["Host"] = newValue 0171 } 0172 } 0173 0174 public var userAgent: String? { 0175 get { 0176 return headers["User-Agent"] 0177 } 0178 0179 set { 0180 headers["User-Agent"] = newValue 0181 } 0182 } 0183 0184 public var authorization: String? { 0185 get { 0186 return headers["Authorization"] 0187 } 0188 0189 set { 0190 headers["Authorization"] = newValue 0191 } 0192 } 0193 0194 public var pathParameters: [String: String] { 0195 set { 0196 storage["pathParameters"] = newValue 0197 } 0198 get { 0199 return storage["pathParameters"] as? [String: String] ?? [:] 0200 } 0201 } 0202 0203 public var path: String? { 0204 return uri.path 0205 } 0206 0207 public var query: [String: String] { 0208 return uri.query 0209 } 0210 } 0211 0212 extension Request: CustomStringConvertible { 0213 public var requestLineDescription
Request.swift:42 init(method: Method, uri: URI, version: Version, headers: Headers, cookies: Cookies, body: Body, upgrade: Upgrade?) {Request.swift:54 public init(method: Method, uri: URI, headers: Headers = [:], cookies: Cookies = [], body: Body, upgrade: Upgrade? = nil) {Request.swift:72 public init(method: Method, uri: URI, headers: Headers = [:], cookies: Cookies = [], body: Data = nil, upgrade: Upgrade? = nil) {Request.swift:83 public init(method: Method, uri: URI, headers: Headers = [:], cookies: Cookies = [], body: DataConvertible, upgrade: Upgrade? = nil) {Request.swift:94 public init(method: Method, uri: URI, headers: Headers = [:], cookies: Cookies = [], body: StreamType, upgrade: Upgrade? = nil) {Request.swift:105 public init(method: Method, uri: String, headers: Headers = [:], cookies: Cookies = [], body: Data = nil, upgrade: Upgrade? = nil) throws {Request.swift:127 public init(method: Method, uri: String, headers: Headers = [:], cookies: Cookies = [], body: StreamType, upgrade: Upgrade? = nil) throws {: String { 0214 return "\(method) \(uri) HTTP/\(version.major).\(version.minor)\n" 0215 } 0216 0217 public var cookiesDescription
Request.swift:234 return requestLineDescription +: String { 0218 var string = "Cookie:" 0219 0220 for (index, cookie) in cookies.enumerate() { 0221 string += " \(cookie.name)=\(cookie.value)" 0222 0223 if index < cookies.count - 1 { 0224 string += ";" 0225 } 0226 } 0227 0228 string += "\n" 0229 0230 return string 0231 } 0232 0233 public var description
Request.swift:236 cookiesDescription + "\n" +: String { 0234 return requestLineDescription + 0235 headerDescription + 0236 cookiesDescription + "\n" + 0237 bodyDescription 0238 } 0239 } 0240 0241 extension Request: CustomDebugStringConvertible { 0242 public var debugDescription: String { 0243 return description + "\n\n" + storageDescription 0244 } 0245 } 0246 0247 extension Request: Hashable { 0248 public var hashValue
Request.swift:243 return description + "\n\n" + storageDescriptionRequest.swift:249 return description.hashValue: Int { 0249 return description.hashValue 0250 } 0251 } 0252 0253 public func ==(lhs: Request, rhs: Request) -> Bool { 0254 return lhs.hashValue == rhs.hashValue 0255 }
Request.swift:254 return lhs.hashValue == rhs.hashValueRequest.swift:254 return lhs.hashValue == rhs.hashValue