<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ --> <title>Network/HTTP/Types.hs</title> <link type='text/css' rel='stylesheet' href='hscolour.css' /> </head> <body> <pre><a name="line-1"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Network</span><span class='hs-varop'>.</span><span class='hs-conid'>HTTP</span><span class='hs-varop'>.</span><span class='hs-conid'>Types</span> <a name="line-2"></a><span class='hs-layout'>(</span> <a name="line-3"></a> <span class='hs-comment'>-- * Case insensitive HTTP ByteStrings</span> <a name="line-4"></a> <span class='hs-conid'>CIByteString</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span> <a name="line-5"></a><span class='hs-layout'>,</span> <span class='hs-varid'>mkCIByteString</span> <a name="line-6"></a> <span class='hs-comment'>-- * Methods</span> <a name="line-7"></a><span class='hs-layout'>,</span> <span class='hs-conid'>Method</span> <a name="line-8"></a><span class='hs-layout'>,</span> <span class='hs-varid'>methodGet</span> <a name="line-9"></a><span class='hs-layout'>,</span> <span class='hs-varid'>methodPost</span> <a name="line-10"></a><span class='hs-layout'>,</span> <span class='hs-varid'>methodHead</span> <a name="line-11"></a><span class='hs-layout'>,</span> <span class='hs-varid'>methodPut</span> <a name="line-12"></a><span class='hs-layout'>,</span> <span class='hs-varid'>methodDelete</span> <a name="line-13"></a><span class='hs-layout'>,</span> <span class='hs-varid'>methodTrace</span> <a name="line-14"></a><span class='hs-layout'>,</span> <span class='hs-varid'>methodConnect</span> <a name="line-15"></a><span class='hs-layout'>,</span> <span class='hs-varid'>methodOptions</span> <a name="line-16"></a><span class='hs-layout'>,</span> <span class='hs-conid'>StdMethod</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span> <a name="line-17"></a><span class='hs-layout'>,</span> <span class='hs-varid'>parseMethod</span> <a name="line-18"></a><span class='hs-layout'>,</span> <span class='hs-varid'>renderMethod</span> <a name="line-19"></a><span class='hs-layout'>,</span> <span class='hs-varid'>renderStdMethod</span> <a name="line-20"></a> <span class='hs-comment'>-- * Versions</span> <a name="line-21"></a><span class='hs-layout'>,</span> <span class='hs-conid'>HttpVersion</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span> <a name="line-22"></a><span class='hs-layout'>,</span> <span class='hs-varid'>http09</span> <a name="line-23"></a><span class='hs-layout'>,</span> <span class='hs-varid'>http10</span> <a name="line-24"></a><span class='hs-layout'>,</span> <span class='hs-varid'>http11</span> <a name="line-25"></a> <span class='hs-comment'>-- * Status</span> <a name="line-26"></a><span class='hs-layout'>,</span> <span class='hs-conid'>Status</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span> <a name="line-27"></a><span class='hs-layout'>,</span> <span class='hs-varid'>status200</span><span class='hs-layout'>,</span> <span class='hs-varid'>statusOK</span> <a name="line-28"></a><span class='hs-layout'>,</span> <span class='hs-varid'>status201</span><span class='hs-layout'>,</span> <span class='hs-varid'>statusCreated</span> <a name="line-29"></a><span class='hs-layout'>,</span> <span class='hs-varid'>status301</span><span class='hs-layout'>,</span> <span class='hs-varid'>statusMovedPermanently</span> <a name="line-30"></a><span class='hs-layout'>,</span> <span class='hs-varid'>status302</span><span class='hs-layout'>,</span> <span class='hs-varid'>statusFound</span> <a name="line-31"></a><span class='hs-layout'>,</span> <span class='hs-varid'>status303</span><span class='hs-layout'>,</span> <span class='hs-varid'>statusSeeOther</span> <a name="line-32"></a><span class='hs-layout'>,</span> <span class='hs-varid'>status400</span><span class='hs-layout'>,</span> <span class='hs-varid'>statusBadRequest</span> <a name="line-33"></a><span class='hs-layout'>,</span> <span class='hs-varid'>status401</span><span class='hs-layout'>,</span> <span class='hs-varid'>statusUnauthorized</span> <a name="line-34"></a><span class='hs-layout'>,</span> <span class='hs-varid'>status403</span><span class='hs-layout'>,</span> <span class='hs-varid'>statusForbidden</span> <a name="line-35"></a><span class='hs-layout'>,</span> <span class='hs-varid'>status404</span><span class='hs-layout'>,</span> <span class='hs-varid'>statusNotFound</span> <a name="line-36"></a><span class='hs-layout'>,</span> <span class='hs-varid'>status405</span><span class='hs-layout'>,</span> <span class='hs-varid'>statusNotAllowed</span> <a name="line-37"></a><span class='hs-layout'>,</span> <span class='hs-varid'>status500</span><span class='hs-layout'>,</span> <span class='hs-varid'>statusServerError</span> <a name="line-38"></a> <span class='hs-comment'>-- * Headers</span> <a name="line-39"></a><span class='hs-layout'>,</span> <span class='hs-conid'>Header</span> <a name="line-40"></a><span class='hs-layout'>,</span> <span class='hs-conid'>RequestHeaders</span> <a name="line-41"></a><span class='hs-layout'>,</span> <span class='hs-conid'>ResponseHeaders</span> <a name="line-42"></a><span class='hs-layout'>,</span> <span class='hs-varid'>headerAccept</span> <a name="line-43"></a><span class='hs-layout'>,</span> <span class='hs-varid'>headerCacheControl</span> <a name="line-44"></a><span class='hs-layout'>,</span> <span class='hs-varid'>headerConnection</span> <a name="line-45"></a><span class='hs-layout'>,</span> <span class='hs-varid'>headerContentLength</span> <a name="line-46"></a><span class='hs-layout'>,</span> <span class='hs-varid'>headerContentType</span> <a name="line-47"></a><span class='hs-layout'>,</span> <span class='hs-varid'>headerContentMD5</span> <a name="line-48"></a><span class='hs-layout'>,</span> <span class='hs-varid'>headerDate</span> <a name="line-49"></a> <span class='hs-comment'>-- * Query string</span> <a name="line-50"></a><span class='hs-layout'>,</span> <span class='hs-conid'>QueryItem</span> <a name="line-51"></a><span class='hs-layout'>,</span> <span class='hs-conid'>Query</span> <a name="line-52"></a><span class='hs-layout'>,</span> <span class='hs-conid'>SimpleQueryItem</span> <a name="line-53"></a><span class='hs-layout'>,</span> <span class='hs-conid'>SimpleQuery</span> <a name="line-54"></a><span class='hs-layout'>,</span> <span class='hs-varid'>renderQuery</span> <a name="line-55"></a><span class='hs-layout'>,</span> <span class='hs-varid'>renderSimpleQuery</span> <a name="line-56"></a><span class='hs-layout'>,</span> <span class='hs-varid'>parseQuery</span> <a name="line-57"></a><span class='hs-layout'>,</span> <span class='hs-varid'>parseSimpleQuery</span> <a name="line-58"></a> <span class='hs-comment'>-- * URL encoding / decoding</span> <a name="line-59"></a><span class='hs-layout'>,</span> <span class='hs-varid'>urlEncode</span> <a name="line-60"></a><span class='hs-layout'>,</span> <span class='hs-varid'>urlDecode</span> <a name="line-61"></a><span class='hs-layout'>)</span> <a name="line-62"></a><span class='hs-keyword'>where</span> <a name="line-63"></a> <a name="line-64"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Arrow</span> <span class='hs-layout'>(</span><span class='hs-varid'>second</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>|||</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <a name="line-65"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Array</span> <a name="line-66"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Char</span> <a name="line-67"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>List</span> <a name="line-68"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Maybe</span> <a name="line-69"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>String</span> <a name="line-70"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Numeric</span> <a name="line-71"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>B</span> <a name="line-72"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-varop'>.</span><span class='hs-conid'>Char8</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>Ascii</span> <a name="line-73"></a> <a name="line-74"></a><a name="CIByteString"></a><span class='hs-comment'>-- | Case-insensitive HTTP ByteStrings, mostly for use in Header names.</span> <a name="line-75"></a><a name="CIByteString"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>CIByteString</span> <a name="line-76"></a> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CIByteString</span> <span class='hs-layout'>{</span> <a name="line-77"></a> <span class='hs-varid'>ciOriginal</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <a name="line-78"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>ciLowerCase</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <a name="line-79"></a> <span class='hs-layout'>}</span> <a name="line-80"></a> <a name="line-81"></a><a name="mkCIByteString"></a><span class='hs-comment'>-- | Make a case-insensitive ByteString from a normal ByteString.</span> <a name="line-82"></a><span class='hs-definition'>mkCIByteString</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>CIByteString</span> <a name="line-83"></a><span class='hs-definition'>mkCIByteString</span> <span class='hs-varid'>orig</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CIByteString</span> <span class='hs-layout'>{</span> <a name="line-84"></a> <span class='hs-varid'>ciOriginal</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>orig</span> <a name="line-85"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>ciLowerCase</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Ascii</span><span class='hs-varop'>.</span><span class='hs-varid'>map</span> <span class='hs-varid'>toLower</span> <span class='hs-varid'>orig</span> <a name="line-86"></a> <span class='hs-layout'>}</span> <a name="line-87"></a> <a name="line-88"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Eq</span> <span class='hs-conid'>CIByteString</span> <span class='hs-keyword'>where</span> <a name="line-89"></a> <span class='hs-conid'>CIByteString</span> <span class='hs-layout'>{</span> <span class='hs-varid'>ciLowerCase</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>a</span> <span class='hs-layout'>}</span> <span class='hs-varop'>==</span> <span class='hs-conid'>CIByteString</span> <span class='hs-layout'>{</span> <span class='hs-varid'>ciLowerCase</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>b</span> <span class='hs-layout'>}</span> <a name="line-90"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>a</span> <span class='hs-varop'>==</span> <span class='hs-varid'>b</span> <a name="line-91"></a> <a name="line-92"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Ord</span> <span class='hs-conid'>CIByteString</span> <span class='hs-keyword'>where</span> <a name="line-93"></a> <span class='hs-varid'>compare</span> <span class='hs-conid'>CIByteString</span> <span class='hs-layout'>{</span> <span class='hs-varid'>ciLowerCase</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>a</span> <span class='hs-layout'>}</span> <span class='hs-conid'>CIByteString</span> <span class='hs-layout'>{</span> <span class='hs-varid'>ciLowerCase</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>b</span> <span class='hs-layout'>}</span> <a name="line-94"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>compare</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <a name="line-95"></a> <a name="line-96"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Show</span> <span class='hs-conid'>CIByteString</span> <span class='hs-keyword'>where</span> <a name="line-97"></a> <span class='hs-varid'>show</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>show</span> <span class='hs-varop'>.</span> <span class='hs-varid'>ciOriginal</span> <a name="line-98"></a> <a name="line-99"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>IsString</span> <span class='hs-conid'>CIByteString</span> <span class='hs-keyword'>where</span> <a name="line-100"></a> <span class='hs-varid'>fromString</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkCIByteString</span> <span class='hs-varop'>.</span> <span class='hs-conid'>Ascii</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <a name="line-101"></a> <a name="line-102"></a><a name="Method"></a><span class='hs-comment'>-- | HTTP method (flat string type).</span> <a name="line-103"></a><a name="Method"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Method</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <a name="line-104"></a> <a name="line-105"></a><a name="methodGet"></a><span class='hs-comment'>-- | HTTP Method constants.</span> <a name="line-106"></a><span class='hs-definition'>methodGet</span><span class='hs-layout'>,</span> <span class='hs-varid'>methodPost</span><span class='hs-layout'>,</span> <span class='hs-varid'>methodHead</span><span class='hs-layout'>,</span> <span class='hs-varid'>methodPut</span><span class='hs-layout'>,</span> <span class='hs-varid'>methodDelete</span><span class='hs-layout'>,</span> <span class='hs-varid'>methodTrace</span><span class='hs-layout'>,</span> <span class='hs-varid'>methodConnect</span><span class='hs-layout'>,</span> <span class='hs-varid'>methodOptions</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Method</span> <a name="line-107"></a><span class='hs-definition'>methodGet</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>renderStdMethod</span> <span class='hs-conid'>GET</span> <a name="line-108"></a><a name="methodPost"></a><span class='hs-definition'>methodPost</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>renderStdMethod</span> <span class='hs-conid'>POST</span> <a name="line-109"></a><a name="methodHead"></a><span class='hs-definition'>methodHead</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>renderStdMethod</span> <span class='hs-conid'>HEAD</span> <a name="line-110"></a><a name="methodPut"></a><span class='hs-definition'>methodPut</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>renderStdMethod</span> <span class='hs-conid'>PUT</span> <a name="line-111"></a><a name="methodDelete"></a><span class='hs-definition'>methodDelete</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>renderStdMethod</span> <span class='hs-conid'>DELETE</span> <a name="line-112"></a><a name="methodTrace"></a><span class='hs-definition'>methodTrace</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>renderStdMethod</span> <span class='hs-conid'>TRACE</span> <a name="line-113"></a><a name="methodConnect"></a><span class='hs-definition'>methodConnect</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>renderStdMethod</span> <span class='hs-conid'>CONNECT</span> <a name="line-114"></a><a name="methodOptions"></a><span class='hs-definition'>methodOptions</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>renderStdMethod</span> <span class='hs-conid'>OPTIONS</span> <a name="line-115"></a> <a name="line-116"></a><a name="StdMethod"></a><span class='hs-comment'>-- | HTTP standard method (as defined by RFC 2616).</span> <a name="line-117"></a><a name="StdMethod"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>StdMethod</span> <a name="line-118"></a> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GET</span> <a name="line-119"></a> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>POST</span> <a name="line-120"></a> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>HEAD</span> <a name="line-121"></a> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>PUT</span> <a name="line-122"></a> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>DELETE</span> <a name="line-123"></a> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>TRACE</span> <a name="line-124"></a> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CONNECT</span> <a name="line-125"></a> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>OPTIONS</span> <a name="line-126"></a> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Read</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>,</span> <span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ord</span><span class='hs-layout'>,</span> <span class='hs-conid'>Enum</span><span class='hs-layout'>,</span> <span class='hs-conid'>Bounded</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ix</span><span class='hs-layout'>)</span> <a name="line-127"></a><span class='hs-comment'>-- These are ordered by suspected frequency. More popular methods should go first.</span> <a name="line-128"></a><span class='hs-comment'>-- The reason is that methodList is used with lookup.</span> <a name="line-129"></a><span class='hs-comment'>-- lookup is probably faster for these few cases than setting up an elaborate data structure.</span> <a name="line-130"></a> <a name="line-131"></a><a name="methodArray"></a><span class='hs-definition'>methodArray</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Array</span> <span class='hs-conid'>StdMethod</span> <span class='hs-conid'>Method</span> <a name="line-132"></a><span class='hs-definition'>methodArray</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>listArray</span> <span class='hs-layout'>(</span><span class='hs-varid'>minBound</span><span class='hs-layout'>,</span> <span class='hs-varid'>maxBound</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ascii</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <span class='hs-varop'>.</span> <span class='hs-varid'>show</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>minBound</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>StdMethod</span> <span class='hs-keyglyph'>..</span> <span class='hs-varid'>maxBound</span><span class='hs-keyglyph'>]</span> <a name="line-133"></a> <a name="line-134"></a><a name="methodList"></a><span class='hs-definition'>methodList</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>Method</span><span class='hs-layout'>,</span> <span class='hs-conid'>StdMethod</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <a name="line-135"></a><span class='hs-definition'>methodList</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>assocs</span> <span class='hs-varid'>methodArray</span><span class='hs-layout'>)</span> <a name="line-136"></a> <a name="line-137"></a><a name="parseMethod"></a><span class='hs-comment'>-- | Convert a method 'ByteString' to a 'StdMethod' if possible.</span> <a name="line-138"></a><span class='hs-definition'>parseMethod</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Method</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Either</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-conid'>StdMethod</span> <a name="line-139"></a><span class='hs-definition'>parseMethod</span> <span class='hs-varid'>bs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>Left</span> <span class='hs-varid'>bs</span><span class='hs-layout'>)</span> <span class='hs-conid'>Right</span> <span class='hs-varop'>$</span> <span class='hs-varid'>lookup</span> <span class='hs-varid'>bs</span> <span class='hs-varid'>methodList</span> <a name="line-140"></a> <a name="line-141"></a><a name="renderMethod"></a><span class='hs-comment'>-- | Convert an algebraic method to a 'ByteString'.</span> <a name="line-142"></a><span class='hs-definition'>renderMethod</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Either</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-conid'>StdMethod</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Method</span> <a name="line-143"></a><span class='hs-definition'>renderMethod</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>id</span> <span class='hs-varop'>|||</span> <span class='hs-varid'>renderStdMethod</span> <a name="line-144"></a> <a name="line-145"></a><a name="renderStdMethod"></a><span class='hs-comment'>-- | Convert a 'StdMethod' to a 'ByteString'.</span> <a name="line-146"></a><span class='hs-definition'>renderStdMethod</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>StdMethod</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Method</span> <a name="line-147"></a><span class='hs-definition'>renderStdMethod</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>methodArray</span> <span class='hs-varop'>!</span> <span class='hs-varid'>m</span> <a name="line-148"></a> <a name="line-149"></a><a name="HttpVersion"></a><span class='hs-comment'>-- | HTTP Version.</span> <a name="line-150"></a><a name="HttpVersion"></a><span class='hs-comment'>-- </span> <a name="line-151"></a><a name="HttpVersion"></a><span class='hs-comment'>-- Note that the Show instance is intended merely for debugging.</span> <a name="line-152"></a><a name="HttpVersion"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>HttpVersion</span> <a name="line-153"></a> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>HttpVersion</span> <span class='hs-layout'>{</span> <a name="line-154"></a> <span class='hs-varid'>httpMajor</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>Int</span> <a name="line-155"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>httpMinor</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>Int</span> <a name="line-156"></a> <span class='hs-layout'>}</span> <a name="line-157"></a> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ord</span><span class='hs-layout'>)</span> <a name="line-158"></a> <a name="line-159"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Show</span> <span class='hs-conid'>HttpVersion</span> <span class='hs-keyword'>where</span> <a name="line-160"></a> <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-conid'>HttpVersion</span> <span class='hs-varid'>major</span> <span class='hs-varid'>minor</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"HTTP/"</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>major</span> <span class='hs-varop'>++</span> <span class='hs-str'>"."</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>minor</span> <a name="line-161"></a> <a name="line-162"></a><a name="http09"></a><span class='hs-comment'>-- | HTTP 0.9</span> <a name="line-163"></a><span class='hs-definition'>http09</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HttpVersion</span> <a name="line-164"></a><span class='hs-definition'>http09</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>HttpVersion</span> <span class='hs-num'>0</span> <span class='hs-num'>9</span> <a name="line-165"></a> <a name="line-166"></a><a name="http10"></a><span class='hs-comment'>-- | HTTP 1.0</span> <a name="line-167"></a><span class='hs-definition'>http10</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HttpVersion</span> <a name="line-168"></a><span class='hs-definition'>http10</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>HttpVersion</span> <span class='hs-num'>1</span> <span class='hs-num'>0</span> <a name="line-169"></a> <a name="line-170"></a><a name="http11"></a><span class='hs-comment'>-- | HTTP 1.1</span> <a name="line-171"></a><span class='hs-definition'>http11</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HttpVersion</span> <a name="line-172"></a><span class='hs-definition'>http11</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>HttpVersion</span> <span class='hs-num'>1</span> <span class='hs-num'>1</span> <a name="line-173"></a> <a name="line-174"></a><a name="Status"></a><span class='hs-comment'>-- | HTTP Status.</span> <a name="line-175"></a><a name="Status"></a><span class='hs-comment'>-- </span> <a name="line-176"></a><a name="Status"></a><span class='hs-comment'>-- Only the 'statusCode' is used for comparisons.</span> <a name="line-177"></a><a name="Status"></a><span class='hs-comment'>-- </span> <a name="line-178"></a><a name="Status"></a><span class='hs-comment'>-- Note that the Show instance is only for debugging.</span> <a name="line-179"></a><a name="Status"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Status</span> <a name="line-180"></a> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Status</span> <span class='hs-layout'>{</span> <a name="line-181"></a> <span class='hs-varid'>statusCode</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <a name="line-182"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>statusMessage</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <a name="line-183"></a> <span class='hs-layout'>}</span> <a name="line-184"></a> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Show</span><span class='hs-layout'>)</span> <a name="line-185"></a> <a name="line-186"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Eq</span> <span class='hs-conid'>Status</span> <span class='hs-keyword'>where</span> <a name="line-187"></a> <span class='hs-conid'>Status</span> <span class='hs-layout'>{</span> <span class='hs-varid'>statusCode</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>a</span> <span class='hs-layout'>}</span> <span class='hs-varop'>==</span> <span class='hs-conid'>Status</span> <span class='hs-layout'>{</span> <span class='hs-varid'>statusCode</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>b</span> <span class='hs-layout'>}</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>a</span> <span class='hs-varop'>==</span> <span class='hs-varid'>b</span> <a name="line-188"></a> <a name="line-189"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Ord</span> <span class='hs-conid'>Status</span> <span class='hs-keyword'>where</span> <a name="line-190"></a> <span class='hs-varid'>compare</span> <span class='hs-conid'>Status</span> <span class='hs-layout'>{</span> <span class='hs-varid'>statusCode</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>a</span> <span class='hs-layout'>}</span> <span class='hs-conid'>Status</span> <span class='hs-layout'>{</span> <span class='hs-varid'>statusCode</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>b</span> <span class='hs-layout'>}</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>a</span> <span class='hs-varop'>`compare`</span> <span class='hs-varid'>b</span> <a name="line-191"></a> <a name="line-192"></a><a name="status200"></a><span class='hs-comment'>-- | OK</span> <a name="line-193"></a><span class='hs-definition'>status200</span><span class='hs-layout'>,</span> <span class='hs-varid'>statusOK</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Status</span> <a name="line-194"></a><span class='hs-definition'>status200</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Status</span> <span class='hs-num'>200</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Ascii</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <span class='hs-str'>"OK"</span> <a name="line-195"></a><a name="statusOK"></a><span class='hs-definition'>statusOK</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>status200</span> <a name="line-196"></a> <a name="line-197"></a><a name="status201"></a><span class='hs-comment'>-- | Created</span> <a name="line-198"></a><span class='hs-definition'>status201</span><span class='hs-layout'>,</span> <span class='hs-varid'>statusCreated</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Status</span> <a name="line-199"></a><span class='hs-definition'>status201</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Status</span> <span class='hs-num'>200</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Ascii</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <span class='hs-str'>"Created"</span> <a name="line-200"></a><a name="statusCreated"></a><span class='hs-definition'>statusCreated</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>status201</span> <a name="line-201"></a> <a name="line-202"></a><a name="status301"></a><span class='hs-comment'>-- | Moved Permanently</span> <a name="line-203"></a><span class='hs-definition'>status301</span><span class='hs-layout'>,</span> <span class='hs-varid'>statusMovedPermanently</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Status</span> <a name="line-204"></a><span class='hs-definition'>status301</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Status</span> <span class='hs-num'>301</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Ascii</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <span class='hs-str'>"Moved Permanently"</span> <a name="line-205"></a><a name="statusMovedPermanently"></a><span class='hs-definition'>statusMovedPermanently</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>status301</span> <a name="line-206"></a> <a name="line-207"></a><a name="status302"></a><span class='hs-comment'>-- | Found</span> <a name="line-208"></a><span class='hs-definition'>status302</span><span class='hs-layout'>,</span> <span class='hs-varid'>statusFound</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Status</span> <a name="line-209"></a><span class='hs-definition'>status302</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Status</span> <span class='hs-num'>302</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Ascii</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <span class='hs-str'>"Found"</span> <a name="line-210"></a><a name="statusFound"></a><span class='hs-definition'>statusFound</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>status302</span> <a name="line-211"></a> <a name="line-212"></a><a name="status303"></a><span class='hs-comment'>-- | See Other</span> <a name="line-213"></a><span class='hs-definition'>status303</span><span class='hs-layout'>,</span> <span class='hs-varid'>statusSeeOther</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Status</span> <a name="line-214"></a><span class='hs-definition'>status303</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Status</span> <span class='hs-num'>303</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Ascii</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <span class='hs-str'>"See Other"</span> <a name="line-215"></a><a name="statusSeeOther"></a><span class='hs-definition'>statusSeeOther</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>status303</span> <a name="line-216"></a> <a name="line-217"></a><a name="status400"></a><span class='hs-comment'>-- | Bad Request</span> <a name="line-218"></a><span class='hs-definition'>status400</span><span class='hs-layout'>,</span> <span class='hs-varid'>statusBadRequest</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Status</span> <a name="line-219"></a><span class='hs-definition'>status400</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Status</span> <span class='hs-num'>400</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Ascii</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <span class='hs-str'>"Bad Request"</span> <a name="line-220"></a><a name="statusBadRequest"></a><span class='hs-definition'>statusBadRequest</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>status400</span> <a name="line-221"></a> <a name="line-222"></a><a name="status401"></a><span class='hs-comment'>-- | Unauthorized</span> <a name="line-223"></a><span class='hs-definition'>status401</span><span class='hs-layout'>,</span> <span class='hs-varid'>statusUnauthorized</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Status</span> <a name="line-224"></a><span class='hs-definition'>status401</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Status</span> <span class='hs-num'>401</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Ascii</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <span class='hs-str'>"Unauthorized"</span> <a name="line-225"></a><a name="statusUnauthorized"></a><span class='hs-definition'>statusUnauthorized</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>status401</span> <a name="line-226"></a> <a name="line-227"></a><a name="status403"></a><span class='hs-comment'>-- | Forbidden</span> <a name="line-228"></a><span class='hs-definition'>status403</span><span class='hs-layout'>,</span> <span class='hs-varid'>statusForbidden</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Status</span> <a name="line-229"></a><span class='hs-definition'>status403</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Status</span> <span class='hs-num'>403</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Ascii</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <span class='hs-str'>"Forbidden"</span> <a name="line-230"></a><a name="statusForbidden"></a><span class='hs-definition'>statusForbidden</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>status403</span> <a name="line-231"></a> <a name="line-232"></a><a name="status404"></a><span class='hs-comment'>-- | Not Found</span> <a name="line-233"></a><span class='hs-definition'>status404</span><span class='hs-layout'>,</span> <span class='hs-varid'>statusNotFound</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Status</span> <a name="line-234"></a><span class='hs-definition'>status404</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Status</span> <span class='hs-num'>404</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Ascii</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <span class='hs-str'>"Not Found"</span> <a name="line-235"></a><a name="statusNotFound"></a><span class='hs-definition'>statusNotFound</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>status404</span> <a name="line-236"></a> <a name="line-237"></a><a name="status405"></a><span class='hs-comment'>-- | Method Not Allowed</span> <a name="line-238"></a><span class='hs-definition'>status405</span><span class='hs-layout'>,</span> <span class='hs-varid'>statusNotAllowed</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Status</span> <a name="line-239"></a><span class='hs-definition'>status405</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Status</span> <span class='hs-num'>405</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Ascii</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <span class='hs-str'>"Method Not Allowed"</span> <a name="line-240"></a><a name="statusNotAllowed"></a><span class='hs-definition'>statusNotAllowed</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>status405</span> <a name="line-241"></a> <a name="line-242"></a><a name="status500"></a><span class='hs-comment'>-- | Internal Server Error</span> <a name="line-243"></a><span class='hs-definition'>status500</span><span class='hs-layout'>,</span> <span class='hs-varid'>statusServerError</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Status</span> <a name="line-244"></a><span class='hs-definition'>status500</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Status</span> <span class='hs-num'>500</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Ascii</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <span class='hs-str'>"Internal Server Error"</span> <a name="line-245"></a><a name="statusServerError"></a><span class='hs-definition'>statusServerError</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>status500</span> <a name="line-246"></a> <a name="line-247"></a><a name="Header"></a><span class='hs-comment'>-- | Header</span> <a name="line-248"></a><a name="Header"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Header</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>CIByteString</span><span class='hs-layout'>,</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-layout'>)</span> <a name="line-249"></a> <a name="line-250"></a><a name="RequestHeaders"></a><span class='hs-comment'>-- | Request Headers</span> <a name="line-251"></a><a name="RequestHeaders"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>RequestHeaders</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Header</span><span class='hs-keyglyph'>]</span> <a name="line-252"></a> <a name="line-253"></a><a name="ResponseHeaders"></a><span class='hs-comment'>-- | Response Headers</span> <a name="line-254"></a><a name="ResponseHeaders"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>ResponseHeaders</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Header</span><span class='hs-keyglyph'>]</span> <a name="line-255"></a> <a name="line-256"></a><a name="makeHeader"></a><span class='hs-definition'>makeHeader</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Header</span> <a name="line-257"></a><span class='hs-definition'>makeHeader</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a'</span><span class='hs-layout'>,</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <a name="line-258"></a> <span class='hs-keyword'>where</span> <span class='hs-varid'>a'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkCIByteString</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Ascii</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <span class='hs-varid'>a</span> <a name="line-259"></a> <a name="line-260"></a><a name="headerAccept"></a><span class='hs-comment'>-- | HTTP Headers</span> <a name="line-261"></a><span class='hs-definition'>headerAccept</span><span class='hs-layout'>,</span> <span class='hs-varid'>headerCacheControl</span><span class='hs-layout'>,</span> <span class='hs-varid'>headerConnection</span><span class='hs-layout'>,</span> <span class='hs-varid'>headerContentLength</span><span class='hs-layout'>,</span> <span class='hs-varid'>headerContentType</span><span class='hs-layout'>,</span> <span class='hs-varid'>headerContentMD5</span><span class='hs-layout'>,</span> <span class='hs-varid'>headerDate</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Header</span> <a name="line-262"></a><span class='hs-definition'>headerAccept</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>makeHeader</span> <span class='hs-str'>"Accept"</span> <a name="line-263"></a><a name="headerCacheControl"></a><span class='hs-definition'>headerCacheControl</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>makeHeader</span> <span class='hs-str'>"Cache-Control"</span> <a name="line-264"></a><a name="headerConnection"></a><span class='hs-definition'>headerConnection</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>makeHeader</span> <span class='hs-str'>"Connection"</span> <a name="line-265"></a><a name="headerContentLength"></a><span class='hs-definition'>headerContentLength</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>makeHeader</span> <span class='hs-str'>"Content-Length"</span> <a name="line-266"></a><a name="headerContentType"></a><span class='hs-definition'>headerContentType</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>makeHeader</span> <span class='hs-str'>"Content-Type"</span> <a name="line-267"></a><a name="headerContentMD5"></a><span class='hs-definition'>headerContentMD5</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>makeHeader</span> <span class='hs-str'>"Content-MD5"</span> <a name="line-268"></a><a name="headerDate"></a><span class='hs-definition'>headerDate</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>makeHeader</span> <span class='hs-str'>"Date"</span> <a name="line-269"></a> <a name="line-270"></a><a name="QueryItem"></a><span class='hs-comment'>-- | Query item</span> <a name="line-271"></a><a name="QueryItem"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>QueryItem</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-layout'>,</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-layout'>)</span> <a name="line-272"></a> <a name="line-273"></a><a name="Query"></a><span class='hs-comment'>-- | Query.</span> <a name="line-274"></a><a name="Query"></a><span class='hs-comment'>-- </span> <a name="line-275"></a><a name="Query"></a><span class='hs-comment'>-- General form: a=b&c=d, but if the value is Nothing, it becomes</span> <a name="line-276"></a><a name="Query"></a><span class='hs-comment'>-- a&c=d.</span> <a name="line-277"></a><a name="Query"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Query</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>QueryItem</span><span class='hs-keyglyph'>]</span> <a name="line-278"></a> <a name="line-279"></a><a name="SimpleQueryItem"></a><span class='hs-comment'>-- | Simplified Query item type without support for parameter-less items.</span> <a name="line-280"></a><a name="SimpleQueryItem"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>SimpleQueryItem</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-layout'>,</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-layout'>)</span> <a name="line-281"></a> <a name="line-282"></a><a name="SimpleQuery"></a><span class='hs-comment'>-- | Simplified Query type without support for parameter-less items.</span> <a name="line-283"></a><a name="SimpleQuery"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>SimpleQuery</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>SimpleQueryItem</span><span class='hs-keyglyph'>]</span> <a name="line-284"></a> <a name="line-285"></a><a name="renderQuery"></a><span class='hs-comment'>-- | Convert 'Query' to 'ByteString'.</span> <a name="line-286"></a><span class='hs-definition'>renderQuery</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Query</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <a name="line-287"></a><span class='hs-definition'>renderQuery</span> <span class='hs-varid'>useQuestionMark</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>concat</span> <a name="line-288"></a> <span class='hs-varop'>.</span> <span class='hs-varid'>addQuestionMark</span> <a name="line-289"></a> <span class='hs-varop'>.</span> <span class='hs-varid'>intercalate</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Ascii</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <span class='hs-str'>"&"</span><span class='hs-keyglyph'>]</span> <a name="line-290"></a> <span class='hs-varop'>.</span> <span class='hs-varid'>map</span> <span class='hs-varid'>showQueryItem</span> <a name="line-291"></a> <span class='hs-keyword'>where</span> <a name="line-292"></a> <span class='hs-varid'>addQuestionMark</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-keyglyph'>]</span> <a name="line-293"></a> <span class='hs-varid'>addQuestionMark</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span> <a name="line-294"></a> <span class='hs-varid'>addQuestionMark</span> <span class='hs-varid'>xs</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>useQuestionMark</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Ascii</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <span class='hs-str'>"?"</span> <span class='hs-conop'>:</span> <span class='hs-varid'>xs</span> <a name="line-295"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>xs</span> <a name="line-296"></a> <a name="line-297"></a> <span class='hs-varid'>showQueryItem</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-layout'>,</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-keyglyph'>]</span> <a name="line-298"></a> <span class='hs-varid'>showQueryItem</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-layout'>,</span> <span class='hs-conid'>Nothing</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>urlEncode</span> <span class='hs-varid'>n</span><span class='hs-keyglyph'>]</span> <a name="line-299"></a> <span class='hs-varid'>showQueryItem</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-layout'>,</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>urlEncode</span> <span class='hs-varid'>n</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ascii</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <span class='hs-str'>"="</span><span class='hs-layout'>,</span> <span class='hs-varid'>urlEncode</span> <span class='hs-varid'>v</span><span class='hs-keyglyph'>]</span> <a name="line-300"></a> <a name="line-301"></a><a name="renderSimpleQuery"></a><span class='hs-comment'>-- | Convert 'SimpleQuery' to 'ByteString'.</span> <a name="line-302"></a><span class='hs-definition'>renderSimpleQuery</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>SimpleQuery</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <a name="line-303"></a><span class='hs-definition'>renderSimpleQuery</span> <span class='hs-varid'>useQuestionMark</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>renderQuery</span> <span class='hs-varid'>useQuestionMark</span> <span class='hs-varop'>.</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <a name="line-304"></a> <a name="line-305"></a><a name="parseQuery"></a><span class='hs-comment'>-- | Parse 'Query' from a 'ByteString'.</span> <a name="line-306"></a><span class='hs-definition'>parseQuery</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Query</span> <a name="line-307"></a><span class='hs-definition'>parseQuery</span> <span class='hs-varid'>bs</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-conid'>Ascii</span><span class='hs-varop'>.</span><span class='hs-varid'>uncons</span> <span class='hs-varid'>bs</span> <span class='hs-keyword'>of</span> <a name="line-308"></a> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>[]</span> <a name="line-309"></a> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-chr'>'?'</span><span class='hs-layout'>,</span> <span class='hs-varid'>bs'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>parseQuery'</span> <span class='hs-varid'>bs'</span> <a name="line-310"></a> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>parseQuery'</span> <span class='hs-varid'>bs</span> <a name="line-311"></a> <span class='hs-keyword'>where</span> <a name="line-312"></a> <span class='hs-varid'>parseQuery'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-varid'>parseQueryItem</span> <span class='hs-varop'>.</span> <span class='hs-conid'>Ascii</span><span class='hs-varop'>.</span><span class='hs-varid'>split</span> <span class='hs-chr'>'&'</span> <a name="line-313"></a> <span class='hs-varid'>parseQueryItem</span> <span class='hs-varid'>q</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <a name="line-314"></a> <span class='hs-keyword'>where</span> <span class='hs-layout'>(</span><span class='hs-varid'>k'</span><span class='hs-layout'>,</span> <span class='hs-varid'>v'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Ascii</span><span class='hs-varop'>.</span><span class='hs-varid'>break</span> <span class='hs-layout'>(</span><span class='hs-varop'>==</span> <span class='hs-chr'>'='</span><span class='hs-layout'>)</span> <span class='hs-varid'>q</span> <a name="line-315"></a> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>urlDecode</span> <span class='hs-varid'>k'</span> <a name="line-316"></a> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>null</span> <span class='hs-varid'>v'</span> <a name="line-317"></a> <span class='hs-keyword'>then</span> <span class='hs-conid'>Nothing</span> <a name="line-318"></a> <span class='hs-keyword'>else</span> <span class='hs-conid'>Just</span> <span class='hs-varop'>$</span> <span class='hs-varid'>urlDecode</span> <span class='hs-varop'>$</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>tail</span> <span class='hs-varid'>v'</span> <a name="line-319"></a> <a name="line-320"></a><a name="parseSimpleQuery"></a><span class='hs-comment'>-- | Parse 'SimpleQuery' from a 'ByteString'.</span> <a name="line-321"></a><span class='hs-definition'>parseSimpleQuery</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>SimpleQuery</span> <a name="line-322"></a><span class='hs-definition'>parseSimpleQuery</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>second</span> <span class='hs-varop'>$</span> <span class='hs-varid'>fromMaybe</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>parseQuery</span> <a name="line-323"></a> <a name="line-324"></a><a name="urlEncode"></a><span class='hs-comment'>-- | Percent-encoding for URLs.</span> <a name="line-325"></a><span class='hs-definition'>urlEncode</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <a name="line-326"></a><span class='hs-definition'>urlEncode</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Ascii</span><span class='hs-varop'>.</span><span class='hs-varid'>concatMap</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ascii</span><span class='hs-varop'>.</span><span class='hs-varid'>pack</span> <span class='hs-varop'>.</span> <span class='hs-varid'>encodeChar</span><span class='hs-layout'>)</span> <a name="line-327"></a> <span class='hs-keyword'>where</span> <a name="line-328"></a> <span class='hs-varid'>encodeChar</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Char</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Char</span><span class='hs-keyglyph'>]</span> <a name="line-329"></a> <span class='hs-varid'>encodeChar</span> <span class='hs-varid'>ch</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>unreserved</span> <span class='hs-varid'>ch</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ch</span><span class='hs-keyglyph'>]</span> <a name="line-330"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>h2</span> <span class='hs-varop'>$</span> <span class='hs-varid'>ord</span> <span class='hs-varid'>ch</span> <a name="line-331"></a> <a name="line-332"></a> <span class='hs-varid'>unreserved</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Char</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-333"></a> <span class='hs-varid'>unreserved</span> <span class='hs-varid'>ch</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>ch</span> <span class='hs-varop'>>=</span> <span class='hs-chr'>'A'</span> <span class='hs-varop'>&&</span> <span class='hs-varid'>ch</span> <span class='hs-varop'><=</span> <span class='hs-chr'>'Z'</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span> <a name="line-334"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>ch</span> <span class='hs-varop'>>=</span> <span class='hs-chr'>'a'</span> <span class='hs-varop'>&&</span> <span class='hs-varid'>ch</span> <span class='hs-varop'><=</span> <span class='hs-chr'>'z'</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span> <a name="line-335"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>ch</span> <span class='hs-varop'>>=</span> <span class='hs-chr'>'0'</span> <span class='hs-varop'>&&</span> <span class='hs-varid'>ch</span> <span class='hs-varop'><=</span> <span class='hs-chr'>'9'</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span> <a name="line-336"></a> <span class='hs-varid'>unreserved</span> <span class='hs-chr'>'-'</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span> <a name="line-337"></a> <span class='hs-varid'>unreserved</span> <span class='hs-chr'>'_'</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span> <a name="line-338"></a> <span class='hs-varid'>unreserved</span> <span class='hs-chr'>'.'</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span> <a name="line-339"></a> <span class='hs-varid'>unreserved</span> <span class='hs-chr'>'~'</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span> <a name="line-340"></a> <span class='hs-varid'>unreserved</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span> <a name="line-341"></a> <a name="line-342"></a> <span class='hs-varid'>h2</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Char</span><span class='hs-keyglyph'>]</span> <a name="line-343"></a> <span class='hs-varid'>h2</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>v</span> <span class='hs-varop'>`divMod`</span> <span class='hs-num'>16</span> <span class='hs-keyword'>in</span> <span class='hs-keyglyph'>[</span><span class='hs-chr'>'%'</span><span class='hs-layout'>,</span> <span class='hs-varid'>h</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>h</span> <span class='hs-varid'>b</span><span class='hs-keyglyph'>]</span> <a name="line-344"></a> <a name="line-345"></a> <span class='hs-varid'>h</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Char</span> <a name="line-346"></a> <span class='hs-varid'>h</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>i</span> <span class='hs-varop'><</span> <span class='hs-num'>10</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>chr</span> <span class='hs-varop'>$</span> <span class='hs-varid'>ord</span> <span class='hs-chr'>'0'</span> <span class='hs-varop'>+</span> <span class='hs-varid'>i</span> <a name="line-347"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>chr</span> <span class='hs-varop'>$</span> <span class='hs-varid'>ord</span> <span class='hs-chr'>'A'</span> <span class='hs-varop'>+</span> <span class='hs-varid'>i</span> <span class='hs-comment'>-</span> <span class='hs-num'>10</span> <a name="line-348"></a> <a name="line-349"></a><a name="urlDecode"></a><span class='hs-comment'>-- | Percent-decoding.</span> <a name="line-350"></a><span class='hs-definition'>urlDecode</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <a name="line-351"></a><span class='hs-definition'>urlDecode</span> <span class='hs-varid'>bs</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-conid'>Ascii</span><span class='hs-varop'>.</span><span class='hs-varid'>uncons</span> <span class='hs-varid'>bs</span> <span class='hs-keyword'>of</span> <a name="line-352"></a> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span> <a name="line-353"></a> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-chr'>'%'</span><span class='hs-layout'>,</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>case</span> <span class='hs-varid'>readHex</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Ascii</span><span class='hs-varop'>.</span><span class='hs-varid'>unpack</span> <span class='hs-varid'>pc</span> <span class='hs-keyword'>of</span> <a name="line-354"></a> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>v</span><span class='hs-layout'>,</span> <span class='hs-str'>""</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>chr</span> <span class='hs-varid'>v</span> <span class='hs-varop'>`</span><span class='hs-conid'>Ascii</span><span class='hs-varop'>.</span><span class='hs-varid'>cons</span><span class='hs-varop'>`</span> <span class='hs-varid'>urlDecode</span> <span class='hs-varid'>bs'</span> <a name="line-355"></a> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Ascii</span><span class='hs-varop'>.</span><span class='hs-varid'>cons</span> <span class='hs-chr'>'%'</span> <span class='hs-varop'>$</span> <span class='hs-varid'>urlDecode</span> <span class='hs-varid'>x</span> <a name="line-356"></a> <span class='hs-keyword'>where</span> <span class='hs-layout'>(</span><span class='hs-varid'>pc</span><span class='hs-layout'>,</span> <span class='hs-varid'>bs'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Ascii</span><span class='hs-varop'>.</span><span class='hs-varid'>splitAt</span> <span class='hs-num'>2</span> <span class='hs-varid'>x</span> <a name="line-357"></a> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-varid'>bs'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Ascii</span><span class='hs-varop'>.</span><span class='hs-varid'>cons</span> <span class='hs-varid'>c</span> <span class='hs-varop'>$</span> <span class='hs-varid'>urlDecode</span> <span class='hs-varid'>bs'</span> </pre></body> </html>