90      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ (c) 2009 Henning ThielemannBSD experimentalnon-portable (not tested)Safe 111(c) 2009 Henning ThielemannBSD experimentalnon-portable (not tested)SafeDOInserts a header with the given name and value. Allows duplicate header names.EEAdds the new header only if no previous header shares the same name.F(Removes old headers with duplicate name.GInserts multiple headers.H)Gets a list of headers with a particular :.JhLookup presence of specific Name in a list of Headers Returns the value from the first matching header.BJoins consecutive lines where the second line begins with ' ' or '\t'.P6543210/.-,+*)('&%$#"!  987:;<=>?@ABCDEFGHIJKLMNOP987;<:6543210/.-,+*)('&%$#"!  C=>@ABDGEHFJKLMNO?I(c) Henning Thielemann, 2009BSDhttp@henning-thielemann.de experimentalnon-portable (not tested)Safe PQTSRUVWXYZ VUPQRSTWXYZPQRSTSafe[\]^_`]\[^_`Noneabab SafeG(c) 2009 Henning ThielemannBSD experimentalnon-portable (not tested)SafecedfgjhifghijcdecdefghijSafe2oqprstu ropqxwvstuopqNone6{chunk size, only relevant for S. |&dictionary for read and write methods  chunk size yz{|yz{|yz(c) 2009 Henning ThielemannBSD experimentalnon-portable (not tested)Safe0z in contrast to built-in (,,)$, its mappend implementation is lazydReceive and parse a HTTP request from the given Stream. Should be used for server side interactions.!Reads and parses request headers.=Process request body (called after successful getRequestHead)|Very simple function, send a HTTP response over the given stream. This could be improved on to use different transfer types.3Used when we know exactly how many bytes to expect.Used when nothing about data is known, Unfortunately waiting for a socket closure causes bad behaviour. Here we just take data once and give up the rest.A necessary feature of HTTP/1.1 Also the only transfer variety likely to return any footers. Also the only transfer method for infinite data and the prefered one for generated data.rMaybe in the future we will have a sensible thing to do here, at that time we might want to change the name.CRemove leading crlfs then call readTillEmpty2 (not required by RFC)Read lines until an empty line (CRLF), also accepts a connection close as end of input, which is not an HTTP/1.1 compliant thing to do - so probably indicates an error condition.Read the next line and feed it to an action. If the read line ends with an exception, the subsequent action is not executed. Thus readLine is handled strictly.                      ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D EFGHIJKLMNOPQRSTUVWXYZ[G\]^_`abcde`aG]^_fghijklmnopqrstuvGwfgxyzt{fgxyz|}~   )http-monad-0.1.1.2-Gm93NJp3pIZCMkqfSXPXe4Network.Monad.HTTP.HeaderNetwork.Monad.TransferNetwork.Monad.ReaderNetwork.Monad.Transfer.IONetwork.Monad.BodyNetwork.Monad.Transfer.Offline#Network.Monad.Transfer.ChunkyLazyIONetwork.Monad.HTTPNetwork.Monad.ExceptionNetwork.Monad.Utility$HTTP-4000.3.8-G6HQV8rfzF6GrJpf9W1rZQNetwork.HTTP.HeadersHeader HdrCustomHdrContentTransferEncodingHdrLastModified HdrExpiresHdrETagHdrContentTypeHdrContentRange HdrContentMD5HdrContentLocationHdrContentLengthHdrContentLanguageHdrContentEncodingHdrContentBaseHdrAllowHdrWWWAuthenticate HdrWarningHdrVary HdrTrailerHdrTE HdrSetCookie HdrServer HdrRetryAfter HdrPublicHdrProxyAuthenticate HdrLocationHdrAge HdrUserAgent HdrRefererHdrRangeHdrProxyAuthorizationHdrMaxForwardsHdrIfUnmodifiedSince HdrIfRangeHdrIfNoneMatch HdrIfMatchHdrIfModifiedSinceHdrHostHdrFrom HdrExpect HdrCookieHdrAuthorizationHdrAcceptLanguageHdrAcceptEncodingHdrAcceptCharset HdrAcceptHdrVia HdrUpgradeHdrTransferEncoding HdrPragmaHdrDate HdrConnectionHdrCacheControl HeaderName setHeaders getHeaders HasHeadersNameTconsgetNamegetValue dictionarysetManygetMany modifyManyconsNameinsertinsertIfMissingreplace insertMany retrieveMany matchNamefindfindManylookupparse parseManyWarnparseManyStraightConsreadLine readBlock writeBlockAsyncExceptionalSyncExceptionalliftSync liftAsync liftIOSync liftIOAsynctransferrunCharTypefromChartoCharC fromStringtoString isLineTermisEmpty $fCByteString$fCByteString0$fC[]$fCharTypeCharBodysplitAt breakAfter withBuffer$fBodyByteString$fBodyByteString0$fBody[]lengthsendreceiverespond$fMonoidChunkedResponse$fSemigroupChunkedResponse$fShowChunkedResponseAsyncExceptionalTmapbindappendcontinueswitchswitchM joinExtendedcrlfspChunkedResponsegetRequestHeadprocessRequestlinearTransferhopefulTransferchunkedTransferuglyDeathTransferreadTillEmpty1readTillEmpty2readLineSwitch BehaviourContinueRetryDone ExpectEntity DieHorribly