Sophie

Sophie

distrib > Fedora > 15 > i386 > by-pkgid > fe020c59895ac11f31b8eb3941ad2f43 > files > 136

ghc-HTTP-devel-4000.1.1-8.fc15.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.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-2"></a><span class='hs-comment'>-- |</span>
<a name="line-3"></a><span class='hs-comment'>-- Module      :  Network.HTTP</span>
<a name="line-4"></a><span class='hs-comment'>-- Copyright   :  (c) Warrick Gray 2002, Bjorn Bringert 2003-2005, 2007 Robin Bate Boerop</span>
<a name="line-5"></a><span class='hs-comment'>-- License     :  BSD</span>
<a name="line-6"></a><span class='hs-comment'>-- </span>
<a name="line-7"></a><span class='hs-comment'>-- Maintainer  :  Sigbjorn Finne &lt;sigbjorn.finne@gmail.com&gt;</span>
<a name="line-8"></a><span class='hs-comment'>-- Stability   :  experimental</span>
<a name="line-9"></a><span class='hs-comment'>-- Portability :  non-portable (not tested)</span>
<a name="line-10"></a><span class='hs-comment'>--</span>
<a name="line-11"></a><span class='hs-comment'>-- The 'Network.HTTP' module provides a simple interface for sending and</span>
<a name="line-12"></a><span class='hs-comment'>-- receiving content over HTTP in Haskell. Here's how to fetch a document from</span>
<a name="line-13"></a><span class='hs-comment'>-- a URL and return it as a String:</span>
<a name="line-14"></a><span class='hs-comment'>--</span>
<a name="line-15"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-16"></a><span class='hs-comment'>-- &gt;    simpleHTTP (getRequest "<a href="http://www.haskell.org/">http://www.haskell.org/</a>") &gt;&gt;= fmap (take 100) . getResponseBody</span>
<a name="line-17"></a><span class='hs-comment'>-- &gt;        -- fetch document and return it (as a 'String'.)</span>
<a name="line-18"></a><span class='hs-comment'>--</span>
<a name="line-19"></a><span class='hs-comment'>-- Other functions let you control the submission and transfer of HTTP</span>
<a name="line-20"></a><span class='hs-comment'>-- 'Request's and 'Response's more carefully, letting you integrate the use</span>
<a name="line-21"></a><span class='hs-comment'>-- of 'Network.HTTP' functionality into your application.</span>
<a name="line-22"></a><span class='hs-comment'>--</span>
<a name="line-23"></a><span class='hs-comment'>-- The module also exports the main types of the package, 'Request' and 'Response',</span>
<a name="line-24"></a><span class='hs-comment'>-- along with 'Header' and functions for working with these.</span>
<a name="line-25"></a><span class='hs-comment'>--</span>
<a name="line-26"></a><span class='hs-comment'>-- The actual functionality is implemented by modules in the @Network.HTTP.*@</span>
<a name="line-27"></a><span class='hs-comment'>-- namespace, letting you either use the default implementation here</span>
<a name="line-28"></a><span class='hs-comment'>-- by importing @Network.HTTP@ or, for more specific uses, selectively</span>
<a name="line-29"></a><span class='hs-comment'>-- import the modules in @Network.HTTP.*@. To wit, more than one kind of</span>
<a name="line-30"></a><span class='hs-comment'>-- representation of the bulk data that flows across a HTTP connection is </span>
<a name="line-31"></a><span class='hs-comment'>-- supported. (see "Network.HTTP.HandleStream".)</span>
<a name="line-32"></a><span class='hs-comment'>-- </span>
<a name="line-33"></a><span class='hs-comment'>-- /NOTE:/ The 'Request' send actions will normalize the @Request@ prior to transmission.</span>
<a name="line-34"></a><span class='hs-comment'>-- Normalization such as having the request path be in the expected form and, possibly,</span>
<a name="line-35"></a><span class='hs-comment'>-- introduce a default @Host:@ header if one isn't already present. If you do not </span>
<a name="line-36"></a><span class='hs-comment'>-- want the requests tampered with, but sent as-is, please import and use the</span>
<a name="line-37"></a><span class='hs-comment'>-- the "Network.HTTP.HandleStream" or "Network.HTTP.Stream" modules instead. They</span>
<a name="line-38"></a><span class='hs-comment'>-- export the same functions, but leaves construction and any normalization of </span>
<a name="line-39"></a><span class='hs-comment'>-- @Request@s to the user.</span>
<a name="line-40"></a><span class='hs-comment'>--</span>
<a name="line-41"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-42"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Network</span><span class='hs-varop'>.</span><span class='hs-conid'>HTTP</span> 
<a name="line-43"></a>       <span class='hs-layout'>(</span> <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'>Base</span>
<a name="line-44"></a>       <span class='hs-layout'>,</span> <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'>Headers</span>
<a name="line-45"></a>
<a name="line-46"></a>         <span class='hs-comment'>{- the functionality that the implementation modules, 
<a name="line-47"></a>	    Network.HTTP.HandleStream and Network.HTTP.Stream,
<a name="line-48"></a>	    exposes:
<a name="line-49"></a>	 -}</span>
<a name="line-50"></a>       <span class='hs-layout'>,</span> <span class='hs-varid'>simpleHTTP</span>      <span class='hs-comment'>-- :: Request -&gt; IO (Result Response)</span>
<a name="line-51"></a>       <span class='hs-layout'>,</span> <span class='hs-varid'>simpleHTTP_</span>     <span class='hs-comment'>-- :: Stream s =&gt; s -&gt; Request -&gt; IO (Result Response)</span>
<a name="line-52"></a>       <span class='hs-layout'>,</span> <span class='hs-varid'>sendHTTP</span>        <span class='hs-comment'>-- :: Stream s =&gt; s -&gt; Request -&gt; IO (Result Response)</span>
<a name="line-53"></a>       <span class='hs-layout'>,</span> <span class='hs-varid'>sendHTTP_notify</span> <span class='hs-comment'>-- :: Stream s =&gt; s -&gt; Request -&gt; IO () -&gt; IO (Result Response)</span>
<a name="line-54"></a>       <span class='hs-layout'>,</span> <span class='hs-varid'>receiveHTTP</span>     <span class='hs-comment'>-- :: Stream s =&gt; s -&gt; IO (Result Request)</span>
<a name="line-55"></a>       <span class='hs-layout'>,</span> <span class='hs-varid'>respondHTTP</span>     <span class='hs-comment'>-- :: Stream s =&gt; s -&gt; Response -&gt; IO ()</span>
<a name="line-56"></a>
<a name="line-57"></a>       <span class='hs-layout'>,</span> <span class='hs-keyword'>module</span> <span class='hs-conid'>Network</span><span class='hs-varop'>.</span><span class='hs-conid'>TCP</span>
<a name="line-58"></a>       
<a name="line-59"></a>       <span class='hs-layout'>,</span> <span class='hs-varid'>getRequest</span>      <span class='hs-comment'>-- :: String -&gt; Request_String</span>
<a name="line-60"></a>       <span class='hs-layout'>,</span> <span class='hs-varid'>postRequest</span>     <span class='hs-comment'>-- :: String -&gt; Request_String</span>
<a name="line-61"></a>       
<a name="line-62"></a>       <span class='hs-layout'>,</span> <span class='hs-varid'>getResponseBody</span> <span class='hs-comment'>-- :: Requesty ty -&gt; ty</span>
<a name="line-63"></a>       <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-64"></a>
<a name="line-65"></a><span class='hs-comment'>-----------------------------------------------------------------</span>
<a name="line-66"></a><span class='hs-comment'>------------------ Imports --------------------------------------</span>
<a name="line-67"></a><span class='hs-comment'>-----------------------------------------------------------------</span>
<a name="line-68"></a>
<a name="line-69"></a><span class='hs-keyword'>import</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'>Headers</span>
<a name="line-70"></a><span class='hs-keyword'>import</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'>Base</span>
<a name="line-71"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</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'>HandleStream</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>S</span>
<a name="line-72"></a><span class='hs-comment'>-- old implementation: import Network.HTTP.Stream</span>
<a name="line-73"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Network</span><span class='hs-varop'>.</span><span class='hs-conid'>TCP</span>
<a name="line-74"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Network</span><span class='hs-varop'>.</span><span class='hs-conid'>Stream</span> <span class='hs-layout'>(</span> <span class='hs-conid'>Result</span> <span class='hs-layout'>)</span>
<a name="line-75"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Network</span><span class='hs-varop'>.</span><span class='hs-conid'>URI</span>    <span class='hs-layout'>(</span> <span class='hs-varid'>parseURI</span> <span class='hs-layout'>)</span>
<a name="line-76"></a>
<a name="line-77"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span> <span class='hs-varid'>fromMaybe</span> <span class='hs-layout'>)</span>
<a name="line-78"></a>
<a name="line-79"></a><span class='hs-comment'>{-
<a name="line-80"></a> Note: if you switch over/back to using Network.HTTP.Stream here, you'll
<a name="line-81"></a> have to wrap the results from 'openStream' as Connections via 'hstreamToConnection'
<a name="line-82"></a> prior to delegating to the Network.HTTP.Stream functions.
<a name="line-83"></a>-}</span>
<a name="line-84"></a>
<a name="line-85"></a><span class='hs-comment'>-- | @simpleHTTP req@ transmits the 'Request' @req@ by opening a /direct/, non-persistent</span>
<a name="line-86"></a><span class='hs-comment'>-- connection to the HTTP server that @req@ is destined for, followed by transmitting</span>
<a name="line-87"></a><span class='hs-comment'>-- it and gathering up the response as a 'Result'. Prior to sending the request,</span>
<a name="line-88"></a><span class='hs-comment'>-- it is normalized (via 'normalizeRequest'). If you have to mediate the request</span>
<a name="line-89"></a><span class='hs-comment'>-- via an HTTP proxy, you will have to normalize the request yourself. Or switch to</span>
<a name="line-90"></a><span class='hs-comment'>-- using 'Network.Browser' instead.</span>
<a name="line-91"></a><span class='hs-comment'>--</span>
<a name="line-92"></a><span class='hs-comment'>-- Examples:</span>
<a name="line-93"></a><span class='hs-comment'>--</span>
<a name="line-94"></a><span class='hs-comment'>-- &gt; simpleHTTP (getRequest "<a href="http://hackage.haskell.org/">http://hackage.haskell.org/</a>")</span>
<a name="line-95"></a><span class='hs-comment'>-- &gt; simpleHTTP (getRequest "<a href="http://hackage.haskell.org:8012/">http://hackage.haskell.org:8012/</a>")</span>
<a name="line-96"></a>
<a name="line-97"></a><a name="simpleHTTP"></a><span class='hs-definition'>simpleHTTP</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>HStream</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Request</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Result</span> <span class='hs-layout'>(</span><span class='hs-conid'>Response</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-98"></a><span class='hs-definition'>simpleHTTP</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-99"></a>  <span class='hs-varid'>auth</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getAuth</span> <span class='hs-varid'>r</span>
<a name="line-100"></a>  <span class='hs-varid'>c</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>openStream</span> <span class='hs-layout'>(</span><span class='hs-varid'>host</span> <span class='hs-varid'>auth</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromMaybe</span> <span class='hs-num'>80</span> <span class='hs-layout'>(</span><span class='hs-varid'>port</span> <span class='hs-varid'>auth</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-101"></a>  <span class='hs-keyword'>let</span> <span class='hs-varid'>norm_r</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>normalizeRequest</span> <span class='hs-varid'>defaultNormalizeRequestOptions</span><span class='hs-layout'>{</span><span class='hs-varid'>normDoClose</span><span class='hs-keyglyph'>=</span><span class='hs-conid'>True</span><span class='hs-layout'>}</span> <span class='hs-varid'>r</span>
<a name="line-102"></a>  <span class='hs-varid'>simpleHTTP_</span> <span class='hs-varid'>c</span> <span class='hs-varid'>norm_r</span>
<a name="line-103"></a>   
<a name="line-104"></a><a name="simpleHTTP_"></a><span class='hs-comment'>-- | Identical to 'simpleHTTP', but acting on an already opened stream.</span>
<a name="line-105"></a><span class='hs-definition'>simpleHTTP_</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HStream</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>HandleStream</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Request</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Result</span> <span class='hs-layout'>(</span><span class='hs-conid'>Response</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-106"></a><span class='hs-definition'>simpleHTTP_</span> <span class='hs-varid'>s</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> 
<a name="line-107"></a>  <span class='hs-keyword'>let</span> <span class='hs-varid'>norm_r</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>normalizeRequest</span> <span class='hs-varid'>defaultNormalizeRequestOptions</span><span class='hs-layout'>{</span><span class='hs-varid'>normDoClose</span><span class='hs-keyglyph'>=</span><span class='hs-conid'>True</span><span class='hs-layout'>}</span> <span class='hs-varid'>r</span>
<a name="line-108"></a>  <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-varid'>sendHTTP</span> <span class='hs-varid'>s</span> <span class='hs-varid'>norm_r</span>
<a name="line-109"></a>
<a name="line-110"></a><a name="sendHTTP"></a><span class='hs-comment'>-- | @sendHTTP hStream httpRequest@ transmits @httpRequest@ (after normalization) over</span>
<a name="line-111"></a><span class='hs-comment'>-- @hStream@, but does not alter the status of the connection, nor request it to be</span>
<a name="line-112"></a><span class='hs-comment'>-- closed upon receiving the response.</span>
<a name="line-113"></a><span class='hs-definition'>sendHTTP</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HStream</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>HandleStream</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Request</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Result</span> <span class='hs-layout'>(</span><span class='hs-conid'>Response</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-114"></a><span class='hs-definition'>sendHTTP</span> <span class='hs-varid'>conn</span> <span class='hs-varid'>rq</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-115"></a>  <span class='hs-keyword'>let</span> <span class='hs-varid'>norm_r</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>normalizeRequest</span> <span class='hs-varid'>defaultNormalizeRequestOptions</span> <span class='hs-varid'>rq</span> 
<a name="line-116"></a>  <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-varid'>sendHTTP</span> <span class='hs-varid'>conn</span> <span class='hs-varid'>norm_r</span>
<a name="line-117"></a>
<a name="line-118"></a><a name="sendHTTP_notify"></a><span class='hs-comment'>-- | @sendHTTP_notify hStream httpRequest action@ behaves like 'sendHTTP', but</span>
<a name="line-119"></a><span class='hs-comment'>-- lets you supply an IO @action@ to execute once the request has been successfully</span>
<a name="line-120"></a><span class='hs-comment'>-- transmitted over the connection. Useful when you want to set up tracing of</span>
<a name="line-121"></a><span class='hs-comment'>-- request transmission and its performance.</span>
<a name="line-122"></a><span class='hs-definition'>sendHTTP_notify</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HStream</span> <span class='hs-varid'>ty</span>
<a name="line-123"></a>                <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>HandleStream</span> <span class='hs-varid'>ty</span>
<a name="line-124"></a>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Request</span> <span class='hs-varid'>ty</span>
<a name="line-125"></a>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-126"></a>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Result</span> <span class='hs-layout'>(</span><span class='hs-conid'>Response</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-127"></a><span class='hs-definition'>sendHTTP_notify</span> <span class='hs-varid'>conn</span> <span class='hs-varid'>rq</span> <span class='hs-varid'>onSendComplete</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-128"></a>  <span class='hs-keyword'>let</span> <span class='hs-varid'>norm_r</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>normalizeRequest</span> <span class='hs-varid'>defaultNormalizeRequestOptions</span> <span class='hs-varid'>rq</span> 
<a name="line-129"></a>  <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-varid'>sendHTTP_notify</span> <span class='hs-varid'>conn</span> <span class='hs-varid'>norm_r</span> <span class='hs-varid'>onSendComplete</span>
<a name="line-130"></a>
<a name="line-131"></a><a name="receiveHTTP"></a><span class='hs-comment'>-- | @receiveHTTP hStream@ reads a 'Request' from the 'HandleStream' @hStream@</span>
<a name="line-132"></a><span class='hs-definition'>receiveHTTP</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HStream</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>HandleStream</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Result</span> <span class='hs-layout'>(</span><span class='hs-conid'>Request</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-133"></a><span class='hs-definition'>receiveHTTP</span> <span class='hs-varid'>conn</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-varid'>receiveHTTP</span> <span class='hs-varid'>conn</span>
<a name="line-134"></a>
<a name="line-135"></a><a name="respondHTTP"></a><span class='hs-comment'>-- | @respondHTTP hStream httpResponse@ transmits an HTTP 'Response' over</span>
<a name="line-136"></a><span class='hs-comment'>-- the 'HandleStream' @hStream@. It could be used to implement simple web</span>
<a name="line-137"></a><span class='hs-comment'>-- server interactions, performing the dual role to 'sendHTTP'.</span>
<a name="line-138"></a><span class='hs-definition'>respondHTTP</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HStream</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>HandleStream</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Response</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-139"></a><span class='hs-definition'>respondHTTP</span> <span class='hs-varid'>conn</span> <span class='hs-varid'>rsp</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-varid'>respondHTTP</span> <span class='hs-varid'>conn</span> <span class='hs-varid'>rsp</span>
<a name="line-140"></a>
<a name="line-141"></a><a name="getRequest"></a><span class='hs-comment'>-- | @getRequest urlString@ is convenience constructor for basic GET 'Request's. If</span>
<a name="line-142"></a><span class='hs-comment'>-- @urlString@ isn't a syntactically valid URL, the function raises an error.</span>
<a name="line-143"></a><span class='hs-definition'>getRequest</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Request_String</span>
<a name="line-144"></a><span class='hs-definition'>getRequest</span> <span class='hs-varid'>urlString</span> <span class='hs-keyglyph'>=</span> 
<a name="line-145"></a>  <span class='hs-keyword'>case</span> <span class='hs-varid'>parseURI</span> <span class='hs-varid'>urlString</span> <span class='hs-keyword'>of</span>
<a name="line-146"></a>    <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>error</span> <span class='hs-layout'>(</span><span class='hs-str'>"getRequest: Not a valid URL - "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>urlString</span><span class='hs-layout'>)</span>
<a name="line-147"></a>    <span class='hs-conid'>Just</span> <span class='hs-varid'>u</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>mkRequest</span> <span class='hs-conid'>GET</span> <span class='hs-varid'>u</span>
<a name="line-148"></a>
<a name="line-149"></a><a name="postRequest"></a><span class='hs-comment'>-- | @postRequest urlString@ is convenience constructor for POST 'Request's. If</span>
<a name="line-150"></a><span class='hs-comment'>-- @urlString@ isn\'t a syntactically valid URL, the function raises an error.</span>
<a name="line-151"></a><span class='hs-definition'>postRequest</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Request_String</span>
<a name="line-152"></a><span class='hs-definition'>postRequest</span> <span class='hs-varid'>urlString</span> <span class='hs-keyglyph'>=</span> 
<a name="line-153"></a>  <span class='hs-keyword'>case</span> <span class='hs-varid'>parseURI</span> <span class='hs-varid'>urlString</span> <span class='hs-keyword'>of</span>
<a name="line-154"></a>    <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>error</span> <span class='hs-layout'>(</span><span class='hs-str'>"postRequest: Not a valid URL - "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>urlString</span><span class='hs-layout'>)</span>
<a name="line-155"></a>    <span class='hs-conid'>Just</span> <span class='hs-varid'>u</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>mkRequest</span> <span class='hs-conid'>POST</span> <span class='hs-varid'>u</span>
<a name="line-156"></a>
<a name="line-157"></a><a name="getResponseBody"></a><span class='hs-comment'>-- | @getResponseBody response@ takes the response of a HTTP requesting action and</span>
<a name="line-158"></a><span class='hs-comment'>-- tries to extricate the body of the 'Response' @response@. If the request action</span>
<a name="line-159"></a><span class='hs-comment'>-- returned an error, an IO exception is raised.</span>
<a name="line-160"></a><span class='hs-definition'>getResponseBody</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Result</span> <span class='hs-layout'>(</span><span class='hs-conid'>Response</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>ty</span>
<a name="line-161"></a><span class='hs-definition'>getResponseBody</span> <span class='hs-layout'>(</span><span class='hs-conid'>Left</span> <span class='hs-varid'>err</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fail</span> <span class='hs-layout'>(</span><span class='hs-varid'>show</span> <span class='hs-varid'>err</span><span class='hs-layout'>)</span>
<a name="line-162"></a><span class='hs-definition'>getResponseBody</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>rspBody</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-163"></a>
<a name="line-164"></a><span class='hs-comment'>--</span>
<a name="line-165"></a><span class='hs-comment'>-- * TODO</span>
<a name="line-166"></a><span class='hs-comment'>--     - request pipelining</span>
<a name="line-167"></a><span class='hs-comment'>--     - https upgrade (includes full TLS, i.e. SSL, implementation)</span>
<a name="line-168"></a><span class='hs-comment'>--         - use of Stream classes will pay off</span>
<a name="line-169"></a><span class='hs-comment'>--         - consider C implementation of encryption\/decryption</span>
<a name="line-170"></a><span class='hs-comment'>--     - comm timeouts</span>
<a name="line-171"></a><span class='hs-comment'>--     - MIME &amp; entity stuff (happening in separate module)</span>
<a name="line-172"></a><span class='hs-comment'>--     - support \"*\" uri-request-string for OPTIONS request method</span>
<a name="line-173"></a><span class='hs-comment'>-- </span>
<a name="line-174"></a><span class='hs-comment'>-- </span>
<a name="line-175"></a><span class='hs-comment'>-- * Header notes:</span>
<a name="line-176"></a><span class='hs-comment'>--</span>
<a name="line-177"></a><span class='hs-comment'>--     [@Host@]</span>
<a name="line-178"></a><span class='hs-comment'>--                  Required by HTTP\/1.1, if not supplied as part</span>
<a name="line-179"></a><span class='hs-comment'>--                  of a request a default Host value is extracted</span>
<a name="line-180"></a><span class='hs-comment'>--                  from the request-uri.</span>
<a name="line-181"></a><span class='hs-comment'>-- </span>
<a name="line-182"></a><span class='hs-comment'>--     [@Connection@] </span>
<a name="line-183"></a><span class='hs-comment'>--                  If this header is present in any request or</span>
<a name="line-184"></a><span class='hs-comment'>--                  response, and it's value is "close", then</span>
<a name="line-185"></a><span class='hs-comment'>--                  the current request\/response is the last </span>
<a name="line-186"></a><span class='hs-comment'>--                  to be allowed on that connection.</span>
<a name="line-187"></a><span class='hs-comment'>-- </span>
<a name="line-188"></a><span class='hs-comment'>--     [@Expect@]</span>
<a name="line-189"></a><span class='hs-comment'>--                  Should a request contain a body, an Expect</span>
<a name="line-190"></a><span class='hs-comment'>--                  header will be added to the request.  The added</span>
<a name="line-191"></a><span class='hs-comment'>--                  header has the value \"100-continue\".  After</span>
<a name="line-192"></a><span class='hs-comment'>--                  a 417 \"Expectation Failed\" response the request</span>
<a name="line-193"></a><span class='hs-comment'>--                  is attempted again without this added Expect</span>
<a name="line-194"></a><span class='hs-comment'>--                  header.</span>
<a name="line-195"></a><span class='hs-comment'>--                  </span>
<a name="line-196"></a><span class='hs-comment'>--     [@TransferEncoding,ContentLength,...@]</span>
<a name="line-197"></a><span class='hs-comment'>--                  if request is inconsistent with any of these</span>
<a name="line-198"></a><span class='hs-comment'>--                  header values then you may not receive any response</span>
<a name="line-199"></a><span class='hs-comment'>--                  or will generate an error response (probably 4xx).</span>
<a name="line-200"></a><span class='hs-comment'>--</span>
<a name="line-201"></a><span class='hs-comment'>--</span>
<a name="line-202"></a><span class='hs-comment'>-- * Response code notes</span>
<a name="line-203"></a><span class='hs-comment'>-- Some response codes induce special behaviour:</span>
<a name="line-204"></a><span class='hs-comment'>--</span>
<a name="line-205"></a><span class='hs-comment'>--   [@1xx@]   \"100 Continue\" will cause any unsent request body to be sent.</span>
<a name="line-206"></a><span class='hs-comment'>--             \"101 Upgrade\" will be returned.</span>
<a name="line-207"></a><span class='hs-comment'>--             Other 1xx responses are ignored.</span>
<a name="line-208"></a><span class='hs-comment'>-- </span>
<a name="line-209"></a><span class='hs-comment'>--   [@417@]   The reason for this code is \"Expectation failed\", indicating</span>
<a name="line-210"></a><span class='hs-comment'>--             that the server did not like the Expect \"100-continue\" header</span>
<a name="line-211"></a><span class='hs-comment'>--             added to a request.  Receipt of 417 will induce another</span>
<a name="line-212"></a><span class='hs-comment'>--             request attempt (without Expect header), unless no Expect header</span>
<a name="line-213"></a><span class='hs-comment'>--             had been added (in which case 417 response is returned).</span>
</pre></body>
</html>