Skip to content
This repository has been archived by the owner on Nov 23, 2021. It is now read-only.

Latest commit

 

History

History
412 lines (383 loc) · 14.8 KB

API.md

File metadata and controls

412 lines (383 loc) · 14.8 KB
/// HTTP Request NOT INCLUDING THE BODY. This allows for streaming
public struct HTTPRequest {
    public var method : HTTPMethod
    public var target : String /* e.g. "/foo/bar?buz=qux" */
    public var httpVersion : HTTPVersion
    public var headers : HTTPHeaders
}

/// Object that code writes the response and response body to. 
public protocol HTTPResponseWriter : class {
    func writeHeader(status: HTTPResponseStatus, headers: HTTPHeaders, completion: @escaping (Result) -> Void)
    func writeTrailer(_ trailers: HTTPHeaders, completion: @escaping (Result) -> Void)
    func writeBody(_ data: UnsafeHTTPResponseBody, completion: @escaping (Result) -> Void)
    func done(completion: @escaping (Result) -> Void)
    func abort()
}

/// Convenience methods for HTTP response writer.
extension HTTPResponseWriter {
    public func writeHeader(status: HTTPResponseStatus, headers: HTTPHeaders)
    public func writeHeader(status: HTTPResponseStatus)
    public func writeTrailer(_ trailers: HTTPHeaders)
    public func writeBody(_ data: UnsafeHTTPResponseBody)
    public func done()
}

public protocol UnsafeHTTPResponseBody {
    func withUnsafeBytes<R>(_ body: (UnsafeRawBufferPointer) throws -> R) rethrows -> R
}

extension UnsafeRawBufferPointer : UnsafeHTTPResponseBody {
    public func withUnsafeBytes<R>(_ body: (UnsafeRawBufferPointer) throws -> R) rethrows -> R
}

public protocol HTTPResponseBody : UnsafeHTTPResponseBody {}

extension Data : HTTPResponseBody {
    public func withUnsafeBytes<R>(_ body: (UnsafeRawBufferPointer) throws -> R) rethrows -> R
}

extension DispatchData : HTTPResponseBody {
    public func withUnsafeBytes<R>(_ body: (UnsafeRawBufferPointer) throws -> R) rethrows -> R
}

extension String : HTTPResponseBody {
    public func withUnsafeBytes<R>(_ body: (UnsafeRawBufferPointer) throws -> R) rethrows -> R
}

/// Method that takes a chunk of request body and is expected to write to the ResponseWriter
public typealias HTTPBodyHandler = (HTTPBodyChunk, inout Bool) -> Void /* the Bool can be set to true when we don't want to process anything further */

/// Indicates whether the body is going to be processed or ignored
public enum HTTPBodyProcessing {
    case discardBody /* if you're not interested in the body */
    case processBody(handler: HTTPBodyHandler)
}

/// Part (or maybe all) of the incoming request body
public enum HTTPBodyChunk {
    case chunk(data: DispatchData, finishedProcessing: () -> Void) /* a new bit of the HTTP request body has arrived, finishedProcessing() must be called when done with that chunk */
    case failed(error: /*HTTPParser*/ Error) /* error while streaming the HTTP request body, eg. connection closed */
    case trailer(key: String, value: String) /* trailer has arrived (this we actually haven't implemented yet) */
    case end /* body and trailers finished */
}

/// Headers structure.
public struct HTTPHeaders : Sequence, ExpressibleByDictionaryLiteral {
    public subscript(name: Name) -> String?
    public subscript(valuesFor name: Name) -> [String]

    public struct Literal : ExpressibleByDictionaryLiteral { }
    public mutating func append(_ literal: HTTPHeaders.Literal)
    public mutating func replace(_ literal: HTTPHeaders.Literal)

    public func makeIterator() -> AnyIterator<(name: Name, value: String)>

    public struct Name : Hashable, ExpressibleByStringLiteral, CustomStringConvertible {
        public init(_ name: String)

        // https://www.iana.org/assignments/message-headers/message-headers.xhtml
        // Permanent Message Header Field Names
        public static let aIM
        public static let accept
        public static let acceptAdditions
        public static let acceptCharset
        public static let acceptDatetime
        public static let acceptEncoding
        public static let acceptFeatures
        public static let acceptLanguage
        public static let acceptPatch
        public static let acceptPost
        public static let acceptRanges
        public static let age
        public static let allow
        public static let alpn
        public static let altSvc
        public static let altUsed
        public static let alternates
        public static let applyToRedirectRef
        public static let authenticationControl
        public static let authenticationInfo
        public static let authorization
        public static let cExt
        public static let cMan
        public static let cOpt
        public static let cPEP
        public static let cPEPInfo
        public static let cacheControl
        public static let calDAVTimezones
        public static let close
        public static let connection
        public static let contentBase
        public static let contentDisposition
        public static let contentEncoding
        public static let contentID
        public static let contentLanguage
        public static let contentLength
        public static let contentLocation
        public static let contentMD5
        public static let contentRange
        public static let contentScriptType
        public static let contentStyleType
        public static let contentType
        public static let contentVersion
        public static let cookie
        public static let cookie2
        public static let dasl
        public static let dav
        public static let date
        public static let defaultStyle
        public static let deltaBase
        public static let depth
        public static let derivedFrom
        public static let destination
        public static let differentialID
        public static let digest
        public static let eTag
        public static let expect
        public static let expires
        public static let ext
        public static let forwarded
        public static let from
        public static let getProfile
        public static let hobareg
        public static let host
        public static let http2Settings
        public static let im
        public static let `if`
        public static let ifMatch
        public static let ifModifiedSince
        public static let ifNoneMatch
        public static let ifRange
        public static let ifScheduleTagMatch
        public static let ifUnmodifiedSince
        public static let keepAlive
        public static let label
        public static let lastModified
        public static let link
        public static let location
        public static let lockToken
        public static let man
        public static let maxForwards
        public static let mementoDatetime
        public static let meter
        public static let mimeVersion
        public static let negotiate
        public static let opt
        public static let optionalWWWAuthenticate
        public static let orderingType
        public static let origin
        public static let overwrite
        public static let p3p
        public static let pep
        public static let picsLabel
        public static let pepInfo
        public static let position
        public static let pragma
        public static let prefer
        public static let preferenceApplied
        public static let profileObject
        public static let `protocol`
        public static let protocolInfo
        public static let protocolQuery
        public static let protocolRequest
        public static let proxyAuthenticate
        public static let proxyAuthenticationInfo
        public static let proxyAuthorization
        public static let proxyFeatures
        public static let proxyInstruction
        public static let `public`
        public static let publicKeyPins
        public static let publicKeyPinsReportOnly
        public static let range
        public static let redirectRef
        public static let referer
        public static let retryAfter
        public static let safe
        public static let scheduleReply
        public static let scheduleTag
        public static let secWebSocketAccept
        public static let secWebSocketExtensions
        public static let secWebSocketKey
        public static let secWebSocketProtocol
        public static let secWebSocketVersion
        public static let securityScheme
        public static let server
        public static let setCookie
        public static let setCookie2
        public static let setProfile
        public static let slug
        public static let soapAction
        public static let statusURI
        public static let strictTransportSecurity
        public static let surrogateCapability
        public static let surrogateControl
        public static let tcn
        public static let te
        public static let timeout
        public static let topic
        public static let trailer
        public static let transferEncoding
        public static let ttl
        public static let urgency
        public static let uri
        public static let upgrade
        public static let userAgent
        public static let variantVary
        public static let vary
        public static let via
        public static let wwwAuthenticate
        public static let wantDigest
        public static let warning
        public static let xFrameOptions

        // https://www.iana.org/assignments/message-headers/message-headers.xhtml
        // Provisional Message Header Field Names
        public static let accessControl
        public static let accessControlAllowCredentials
        public static let accessControlAllowHeaders
        public static let accessControlAllowMethods
        public static let accessControlAllowOrigin
        public static let accessControlMaxAge
        public static let accessControlRequestMethod
        public static let accessControlRequestHeaders
        public static let compliance
        public static let contentTransferEncoding
        public static let cost
        public static let ediintFeatures
        public static let messageID
        public static let methodCheck
        public static let methodCheckExpires
        public static let nonCompliance
        public static let optional
        public static let refererRoot
        public static let resolutionHint
        public static let resolverLocation
        public static let subOK
        public static let subst
        public static let title
        public static let uaColor
        public static let uaMedia
        public static let uaPixels
        public static let uaResolution
        public static let uaWindowpixels
        public static let version
        public static let xDeviceAccept
        public static let xDeviceAcceptCharset
        public static let xDeviceAcceptEncoding
        public static let xDeviceAcceptLanguage
        public static let xDeviceUserAgent
    }
}

/// Version number of the HTTP Protocol
public struct HTTPVersion {
    /// Major version component.
    public var major: Int
    /// Minor version component.
    public var minor: Int
    
    public init(major: Int, minor: Int)
}

public enum HTTPTransferEncoding {
    case identity(contentLength: UInt)
    case chunked
}

/// Response status (200 ok, 404 not found, etc)
public struct HTTPResponseStatus: Equatable, CustomStringConvertible, ExpressibleByIntegerLiteral {
    public let code: Int
    public let reasonPhrase: String

    public init(code: Int, reasonPhrase: String)
    public init(code: Int)
    
    /* all the codes from http://www.iana.org/assignments/http-status-codes */
    public static let `continue`
    public static let switchingProtocols
    public static let ok
    public static let created
    public static let accepted
    public static let nonAuthoritativeInformation
    public static let noContent
    public static let resetContent
    public static let partialContent
    public static let multiStatus
    public static let alreadyReported
    public static let imUsed
    public static let multipleChoices
    public static let movedPermanently
    public static let found
    public static let seeOther
    public static let notModified
    public static let useProxy
    public static let temporaryRedirect
    public static let permanentRedirect
    public static let badRequest
    public static let unauthorized
    public static let paymentRequired
    public static let forbidden
    public static let notFound
    public static let methodNotAllowed
    public static let notAcceptable
    public static let proxyAuthenticationRequired
    public static let requestTimeout
    public static let conflict
    public static let gone
    public static let lengthRequired
    public static let preconditionFailed
    public static let payloadTooLarge
    public static let uriTooLong
    public static let unsupportedMediaType
    public static let rangeNotSatisfiable
    public static let expectationFailed
    public static let misdirectedRequest
    public static let unprocessableEntity
    public static let locked
    public static let failedDependency
    public static let upgradeRequired
    public static let preconditionRequired
    public static let tooManyRequests
    public static let requestHeaderFieldsTooLarge
    public static let unavailableForLegalReasons
    public static let internalServerError
    public static let notImplemented
    public static let badGateway
    public static let serviceUnavailable
    public static let gatewayTimeout
    public static let httpVersionNotSupported
    public static let variantAlsoNegotiates
    public static let insufficientStorage
    public static let loopDetected
    public static let notExtended
    public static let networkAuthenticationRequired

    public var `class`: Class

    public enum Class {
        case informational
        case successful
        case redirection
        case clientError
        case serverError
        case invalidStatus
    }
}

/// HTTP Methods handled by http_parser.[ch] supports
public struct HTTPMethod : Hashable, CustomStringConvertible, ExpressibleByIntegerLiteral {

    public let method: String

    public init(_ method: String)

    /* Constants for everything that http_parser.[ch] supports */
    public static let delete
    public static let get
    public static let head
    public static let post
    public static let put
    public static let connect
    public static let options
    public static let trace
    public static let copy
    public static let lock
    public static let mkcol
    public static let move
    public static let propfind
    public static let proppatch
    public static let search
    public static let unlock
    public static let bind
    public static let rebind
    public static let unbind
    public static let acl
    public static let report
    public static let mkactivity
    public static let checkout
    public static let merge
    public static let msearch
    public static let notify
    public static let subscribe
    public static let unsubscribe
    public static let patch
    public static let purge
    public static let mkcalendar
    public static let link
    public static let unlink
}