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
ClientType.swift:30
    func send(request: Request, middleware: MiddlewareType...) throws -> Response
BranchMiddleware.swift:26
    public let shouldBranch: Request throws -> Bool
BranchMiddleware.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 -> Response
MiddlewareType.swift:44
    let respond: (request: Request, chain: ChainType) throws -> Response
MiddlewareType.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 -> Void
RequestParser.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 -> Response
ResponderType.swift:30
    func respond(request: Request) throws -> Response
ResponderType.swift:34
    public func proceed(request: Request) throws -> Response {
ResponderType.swift:39
public typealias Respond = Request throws -> Response
ResponderType.swift:48
    public func respond(request: Request) throws -> Response {
Response.swift:28
    public typealias Upgrade = (Request, StreamType) throws -> Void
Route.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
: MessageType { 0030 public typealias Upgrade = (Response, StreamType) throws -> Void 0031 0032 public var method
Request.swift:214
        return "\(method) \(uri) HTTP/\(version.major).\(version.minor)\n"
: Method 0033 public var uri: URI 0034 public var version: Version 0035 public var headers
Request.swift:142
            if let acceptString = headers["Accept"] {
Request.swift:166
            return headers["Host"]
Request.swift:170
            headers["Host"] = newValue
Request.swift:176
            return headers["User-Agent"]
Request.swift:180
            headers["User-Agent"] = newValue
Request.swift:186
            return headers["Authorization"]
Request.swift:190
            headers["Authorization"] = newValue
RequestSerializer.swift:36
        for (name, value) in request.headers {
: Headers 0036 public var cookies
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 {
: Cookies 0037 public var body
RequestSerializer.swift:55
        switch request.body {
: Body 0038 public var upgrade: Upgrade? 0039 0040 public var storage
Request.swift:199
            return storage["pathParameters"] as? [String: String] ?? [:]
Request.swift:196
            storage["pathParameters"] = newValue
: 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: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 {
(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:234
        return requestLineDescription +
: String { 0214 return "\(method) \(uri) HTTP/\(version.major).\(version.minor)\n" 0215 } 0216 0217 public var cookiesDescription
Request.swift:236
            cookiesDescription + "\n" +
: 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:243
        return description + "\n\n" + storageDescription
Request.swift:249
        return description.hashValue
: 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:254
    return lhs.hashValue == rhs.hashValue
Request.swift:254
    return lhs.hashValue == rhs.hashValue
: Int { 0249 return description.hashValue 0250 } 0251 } 0252 0253 public func ==(lhs: Request, rhs: Request) -> Bool { 0254 return lhs.hashValue == rhs.hashValue 0255 }