Sophie

Sophie

distrib > Fedora > 14 > x86_64 > media > updates > by-pkgid > f7ccb7fa64238255116d51472a1034e3 > files > 25

ghc-http-types-devel-0.3.1-1.fc14.i686.rpm

<?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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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&amp;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&amp;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'>-&gt;</span> <span class='hs-conid'>Query</span> <span class='hs-keyglyph'>-&gt;</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'>"&amp;"</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'>-&gt;</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'>-&gt;</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'>-&gt;</span> <span class='hs-conid'>SimpleQuery</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>'&amp;'</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>&gt;=</span> <span class='hs-chr'>'A'</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>ch</span> <span class='hs-varop'>&lt;=</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'>&gt;=</span> <span class='hs-chr'>'a'</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>ch</span> <span class='hs-varop'>&lt;=</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'>&gt;=</span> <span class='hs-chr'>'0'</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>ch</span> <span class='hs-varop'>&lt;=</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'>-&gt;</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'>-&gt;</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'>&lt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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>