second-transfer-0.6.0.0: Second Transfer HTTP/2 web server

Safe HaskellNone
LanguageHaskell2010

SecondTransfer.Types

Synopsis

Documentation

type PushAction = ByteString -> IO () Source

Callback type to push data to a channel. Part of this interface is the abstract exception type IOProblem. Throw an instance of it from here to notify the session that the connection has been broken. There is no way to signal "normal termination", since HTTP/2's normal termination can be observed at a higher level when a GO_AWAY frame is seen.

type PullAction = Int -> IO ByteString Source

Callback type to pull data from a channel. The same as to PushAction applies to exceptions thrown from there. The first argument is the number of bytes to pull from the medium. Barring exceptions, we always know how many bytes we are expecting with HTTP/2.

type Attendant = AttendantCallbacks -> IO () Source

A function which takes three arguments: the first one says how to send data (on a socket or similar transport), and the second one how to receive data on the transport. The third argument encapsulates the sequence of steps needed for a clean shutdown.

You can implement one of these to let somebody else supply the push, pull and close callbacks. For example, tlsServeWithALPN will supply these arguments to an Attendant.

Attendants encapsulate all the session book-keeping functionality, which for HTTP/2 is quite complicated. You use the functions http**Attendant to create one of these from a CoherentWorker.

This library supplies two of such Attendant factories, http11Attendant for HTTP 1.1 sessions, and http2Attendant for HTTP/2 sessions.

type CloseAction = IO () Source

Callback that the session calls to realease resources associated with the channels. Take into account that your callback should be able to deal with non-clean shutdowns also, for example, if the connection to the remote peer is severed suddenly.

bestEffortPullAction_AtC :: Lens' AttendantCallbacks BestEffortPullAction Source

getHeaderFromFlatList :: Headers -> ByteString -> Maybe ByteString Source

Gets a single header from the list

nullFooter :: Source IO ByteString -> DataAndConclusion Source

If you want to skip the footers, i.e., they are empty, use this function to convert an ordinary Source to a DataAndConclusion.

type HeaderName = ByteString Source

The name part of a header

type HeaderValue = ByteString Source

The value part of a header

type Header = (HeaderName, HeaderValue) Source

The complete header

type Headers = [Header] Source

List of headers. The first part of each tuple is the header name (be sure to conform to the HTTP/2 convention of using lowercase) and the second part is the headers contents. This list needs to include the special :method, :scheme, :authority and :path pseudo-headers for requests; and :status (with a plain numeric value represented in ascii digits) for responses.

type FinalizationHeaders = Headers Source

Finalization headers. If you don't know what they are, chances are that you don't need to worry about them for now. The support in this library for those are at best sketchy.

data Request Source

A request is a set of headers and a request body.... which will normally be empty, except for POST and PUT requests. But this library enforces none of that.

type Footers = FinalizationHeaders Source

Finalization headers

data Perception Source

Data related to the request

Constructors

Perception 

Fields

_startedTime_Pr :: TimeSpec
 
_streamId_Pr :: Int
 
_sessionId_Pr :: Int
 

data Effect Source

Sometimes a response needs to be handled a bit specially, for example by reporting delivery details back to the worker

type AwareWorker = Request -> IO PrincipalStream Source

Main type of this library. You implement one of these for your server. This is a callback that the library calls as soon as it has all the headers of a request. For GET requests that's the entire request basically, but for POST and PUT requests this is just before the data starts arriving to the server.

It is important that you consume the data in the cases where there is an input stream, otherwise the memory is lost for the duration of the request, and a malicious client can use that.

Also, notice that when handling requests your worker can be interrupted with an asynchronous exception of type StreamCancelledException, if the peer cancels the stream

data PrincipalStream Source

You use this type to answer a request. The Headers are thus response headers and they should contain the :status pseudo-header. The PushedStreams is a list of pushed streams...(I don't thaink that I'm handling those yet)

type PushedStreams = [IO PushedStream] Source

A list of pushed streams. Notice that a list of IO computations is required here. These computations only happen when and if the streams are pushed to the client. The lazy nature of Haskell helps to avoid unneeded computations if the streams are not going to be sent to the client.

data PushedStream Source

A pushed stream, represented by a list of request headers, a list of response headers, and the usual response body (which may include final footers (not implemented yet)).

type DataAndConclusion = ConduitM () ByteString IO Footers Source

A source-like conduit with the data returned in the response. The return value of the conduit is a list of footers. For now that list can be anything (even bottom), I'm not handling it just yet.

type CoherentWorker = (Headers, Maybe InputDataStream) -> IO (Headers, PushedStreams, DataAndConclusion) Source

A CoherentWorker is a less fuzzy worker, but less aware.

type InputDataStream = Source IO ByteString Source

This is a Source conduit (see Haskell Data.Conduit library from Michael Snoyman) that you can use to retrieve the data sent by the client piece-wise.

type TupledPrincipalStream = (Headers, PushedStreams, DataAndConclusion) Source

Not exactly equivalent of the prinicipal stream

type FragmentDeliveryCallback = Int -> TimeSpec -> IO () Source

First argument is the ordinal of this data frame, second an approximation of when the frame was delivered, according to the monotonic clock. Do not linger in this call, it may delay some important thread

startedTime_Pr :: Lens' Perception TimeSpec Source

priorityEffect_Ef :: Lens' Effect (Maybe Int) Source