úÎ:Õ9      NoneKThe size of the request body. In the case of chunked bodies, the size will  not be known.  Since 1.4.0 KMiddleware is a component that sits between the server and application. It M can do such tasks as GZIP encoding or response caching. What follows is the J general definition of middleware, though a middleware author should feel  free to modify this. GAs an example of an alternate type for middleware, suppose you write a N function to load up session information. The session information is simply a  string map [(String, String)]0. A logical type signatures for this middleware  might be:  " loadSession :: ([(String, String)] -> Application) -> Application#Here, instead of taking a standard  as its first argument, the M middleware takes a function which consumes the session information as well. .Some questions and answers about the usage of   here:  Q1. Shouldn't it be at the user',s discretion to use Builders internally and & then create a stream of ByteStrings? .A1. That would be less efficient, as we wouldn't get cheap concatenation  with the response headers. Q2. Isn'Ct it really inefficient to convert from ByteString to Builder, and  then right back to ByteString? MA2. No. If the ByteStrings are small, then they will be copied into a larger L buffer, which should be a performance gain overall (less system calls). If E they are already large, then blaze-builder uses an InsertByteString  instruction to avoid copying.  Q3. Doesn'@t this prevent us from creating comet-style servers, since data  will be cached? GA3. You can force blaze-builder to output a ByteString before it is an * optimal size by sending a flush command. GInformation on the request sent by the client. This abstracts away the + details of the underlying implementation. GExtra path information sent by the client. The meaning varies slightly K depending on backend; in a standalone server setting, this is most likely L all information after the domain name. In a CGI application, this would be B the information following the path to the CGI executable itself. 8 Do not modify this raw value- modify pathInfo instead. CIf no query string was specified, this should be empty. This value  will$ include the leading question mark. ; Do not modify this raw value- modify queryString instead. FGenerally the host requested by the user via the Host request header. J Backends are free to provide alternative values as necessary. This value ' should not be used to construct URLs. CThe listening port that the server received this request on. It is I possible for a server to listen on a non-numeric port (i.e., Unix named ; socket), in which case this value will be arbitrary. Like , 4 this value should not be used in URL construction. .Was this request made over an SSL connection? This value should not2 be used, and will be removed in future revisions L of WAI. There is no meaningful way that a backend can indicate whether the E request is actually over a secure channel, due to issues of reverse  proxying.  The client's host information. :Path info in individual pieces- the url without a hostname/;port and without a query string, split on forward slashes,  Parsed query string information KA location for arbitrary data to be shared by applications and middleware. ZThe size of the request body. In the case of a chunked request body, this may be unknown.  Since 1.4.0 ! !       !"      !"#$ wai-1.4.0.2 Network.WaiRequestBodyLength KnownLength ChunkedBody Middleware ApplicationFilePartfilePartOffsetfilePartByteCountResponseResponseSourceResponseBuilder ResponseFileRequest requestMethod httpVersion rawPathInforawQueryString serverName serverPortrequestHeadersisSecure remoteHostpathInfo queryString requestBodyvaultrequestBodyLengthresponseStatusresponseSource responseLBSblaze-builder-0.3.1.1'Blaze.ByteString.Builder.Internal.TypesBuildersourceFilePart