[Haskell] New version of the HTTP module

Graham Klyne GK at ninebynine.org
Wed Mar 17 14:05:00 EST 2004

At 11:18 17/03/04 +0100, Bjorn Bringert wrote:
>I have reverted the type of the exported openTCP to String -> IO
>Connection, it now always uses port 80 like the old version did. Instead 
>there is an internal function openTCPPort that takes a port number. I will 
>try to have a look at the Browser module to see what needs to be done to 
>make it support arbitrary port numbers and if it needs any other updates.
>An updated version of HTTP.hs is available at 

OK, that works.

I just re-ran the HXml Toolbox HUnitExample test successfully, using the 
new HTTP module (with some further edits) and my new URI module.  I also 
had to apply a small edits to Browser.hs (to include Proxy in the export list).

I am finding that there are some (easily fixed) incompatibilities with my 
revised Network.URI module.  (I also note that the HTTP module duplicates 
the Authority-parsing functionality that is also present in my Network.URI 
module, but that can be sorted out later.)

In my module, I changed the structure of the URI datatype, though I do 
provide functions to access components with their original 
names.  Unfortunately, the HTTP module makes some use of the "value { 
component=value }" syntax to define new URI values, which is not 
compatible.  If we are to adopt my version, these instances will need 
changing.  This will, in turn, require some synchronization of the change-over.

Here are the differences:
Compare: (<)D:\Cvs\DEV\HaskellUtils\Network\HTTP.hs (46201 bytes)
    with: (>)D:\Cvs\DEV\HaskellUtils\Network\HTTP-bjorn.hs (45931 bytes)

< -- ** Changes by Graham Klyne:
< --      - export httpVersion
< --      - use new URI module (similar to old, but uses revised URI datatype)
<     httpVersion,        -- [GK]
<             alt_uri = show $ if null (uriPath u) || head (uriPath u) /= '/'
<                         then u { uriPath = '/' : uriPath u }
 >             alt_uri = show $ if null (path u) || head (path u) /= '/'
 >                         then u { path = '/' : path u }
<                  -- r { rqURI = (rqURI r){ scheme = "", authority = "" } }
<                  r { rqURI = (rqURI r){ uriScheme = "", uriAuthority = 
Nothing } }
 >                  r { rqURI = (rqURI r){ scheme = "", authority = "" } }

My full codebase for HTTP and URI can be seen at:

My suggestion would be that we make the change-over by moving these to the 
library CVS as a single unit.  But I guess we should see if the URI changes 
are going to cause any other similar problems.

Do we have a stand-alone test harness for the HTTP code?  I've been using 
the HXml Toolbox unit tests.


Graham Klyne
For email:

More information about the Libraries mailing list