HTTP 4000.1.1 → 4000.1.2
raw patch · 3 files changed
+134/−129 lines, 3 filesdep ~basePVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: base
API changes (from Hackage documentation)
- Network.Browser: err :: String -> BrowserAction t ()
- Network.Browser: out :: String -> BrowserAction t ()
+ Network.Browser: out, err :: String -> BrowserAction t ()
Files
- CHANGES +4/−0
- HTTP.cabal +91/−90
- Network/Browser.hs +39/−39
CHANGES view
@@ -1,3 +1,7 @@+Version 4000.1.1: release 2010-11-28+ * Be tolerant of LF (instead of CRLF which is the spec) in responses+ Patch by Chris Pettitt <cpettitt@gmail.com>.+ Version 4000.1.0: release 2010-11-09 * Retroactively fixed CHANGES to refer to 4000.x.x instead of 4004.x.x.
HTTP.cabal view
@@ -1,90 +1,91 @@-Name: HTTP-Version: 4000.1.1-Cabal-Version: >= 1.2-Build-type: Simple-License: BSD3-License-file: LICENSE-Copyright: - Copyright (c) 2002, Warrick Gray- Copyright (c) 2002-2005, Ian Lynagh- Copyright (c) 2003-2006, Bjorn Bringert- Copyright (c) 2004, Andre Furtado- Copyright (c) 2004, Ganesh Sittampalam- Copyright (c) 2004-2005, Dominic Steinitz- Copyright 2007 Robin Bate Boerop- Copyright 2008- Sigbjorn Finne-Author: Warrick Gray <warrick.gray@hotmail.com>-Maintainer: Ganesh Sittampalam <ganesh@earth.li>-Homepage: http://projects.haskell.org/http/-Category: Network-Synopsis: A library for client-side HTTP-Description: -- The HTTP package supports client-side web programming in Haskell. It lets you set up - HTTP connections, transmitting requests and processing the responses coming back, all- from within the comforts of Haskell. It's dependent on the network package to operate,- but other than that, the implementation is all written in Haskell.- .- A basic API for issuing single HTTP requests + receiving responses is provided. On top- of that, a session-level abstraction is also on offer (the @BrowserAction@ monad);- it taking care of handling the management of persistent connections, proxies,- state (cookies) and authentication credentials required to handle multi-step- interactions with a web server.- .- The representation of the bytes flowing across is extensible via the use of a type class,- letting you pick the representation of requests and responses that best fits your use.- Some pre-packaged, common instances are provided for you (@ByteString@, @String@.)- .- Here's an example use:- .- >- > do- > rsp <- Network.HTTP.simpleHTTP (getRequest "http://www.haskell.org/")- > -- fetch document and return it (as a 'String'.)- > fmap (take 100) (getResponseBody rsp)- >- > do - > rsp <- Network.Browser.browse $ do- > setAllowRedirects True -- handle HTTP redirects- > request $ getRequest "http://google.com/"- > fmap (take 100) (getResponseBody rsp)- > - .- Git repository available at <git://github.com/haskell/HTTP.git>--Extra-Source-Files: CHANGES--Flag old-base- description: Old, monolithic base- default: False--Library- Exposed-modules: - Network.BufferType,- Network.Stream,- Network.StreamDebugger,- Network.StreamSocket,- Network.TCP, - Network.HTTP,- Network.HTTP.Headers,- Network.HTTP.Base,- Network.HTTP.Stream,- Network.HTTP.Auth,- Network.HTTP.Cookie,- Network.HTTP.Proxy,- Network.HTTP.HandleStream,- Network.Browser- Other-modules:- Network.HTTP.Base64,- Network.HTTP.MD5,- Network.HTTP.MD5Aux,- Network.HTTP.Utils- GHC-options: -fwarn-missing-signatures -Wall- Build-depends: base >= 2 && < 4.4, network, parsec, mtl- if flag(old-base)- Build-depends: base < 3- else- Build-depends: base >= 3, array, old-time, bytestring-- if os(windows)- Build-depends: Win32+Name: HTTP +Version: 4000.1.2 +Cabal-Version: >= 1.2 +Build-type: Simple +License: BSD3 +License-file: LICENSE +Copyright: + Copyright (c) 2002, Warrick Gray + Copyright (c) 2002-2005, Ian Lynagh + Copyright (c) 2003-2006, Bjorn Bringert + Copyright (c) 2004, Andre Furtado + Copyright (c) 2004, Ganesh Sittampalam + Copyright (c) 2004-2005, Dominic Steinitz + Copyright 2007 Robin Bate Boerop + Copyright 2008- Sigbjorn Finne +Author: Warrick Gray <warrick.gray@hotmail.com> +Maintainer: Ganesh Sittampalam <ganesh@earth.li> +Homepage: http://projects.haskell.org/http/ +Category: Network +Synopsis: A library for client-side HTTP +Description: + + The HTTP package supports client-side web programming in Haskell. It lets you set up + HTTP connections, transmitting requests and processing the responses coming back, all + from within the comforts of Haskell. It's dependent on the network package to operate, + but other than that, the implementation is all written in Haskell. + . + A basic API for issuing single HTTP requests + receiving responses is provided. On top + of that, a session-level abstraction is also on offer (the @BrowserAction@ monad); + it taking care of handling the management of persistent connections, proxies, + state (cookies) and authentication credentials required to handle multi-step + interactions with a web server. + . + The representation of the bytes flowing across is extensible via the use of a type class, + letting you pick the representation of requests and responses that best fits your use. + Some pre-packaged, common instances are provided for you (@ByteString@, @String@.) + . + Here's an example use: + . + > + > do + > rsp <- Network.HTTP.simpleHTTP (getRequest "http://www.haskell.org/") + > -- fetch document and return it (as a 'String'.) + > fmap (take 100) (getResponseBody rsp) + > + > do + > rsp <- Network.Browser.browse $ do + > setAllowRedirects True -- handle HTTP redirects + > request $ getRequest "http://google.com/" + > fmap (take 100) (getResponseBody rsp) + > + . + Git repository available at <git://github.com/haskell/HTTP.git> + +Extra-Source-Files: CHANGES + +Flag old-base + description: Old, monolithic base + default: False + +Library + Exposed-modules: + Network.BufferType, + Network.Stream, + Network.StreamDebugger, + Network.StreamSocket, + Network.TCP, + Network.HTTP, + Network.HTTP.Headers, + Network.HTTP.Base, + Network.HTTP.Stream, + Network.HTTP.Auth, + Network.HTTP.Cookie, + Network.HTTP.Proxy, + Network.HTTP.HandleStream, + Network.Browser + Other-modules: + Network.HTTP.Base64, + Network.HTTP.MD5, + Network.HTTP.MD5Aux, + Network.HTTP.Utils + GHC-options: -fwarn-missing-signatures -Wall + Build-depends: base >= 2 && < 4.5, network, parsec, mtl + Extensions: FlexibleInstances + if flag(old-base) + Build-depends: base < 3 + else + Build-depends: base >= 3, array, old-time, bytestring + + if os(windows) + Build-depends: Win32
Network/Browser.hs view
@@ -540,14 +540,14 @@ -- Presumably this is the user's explicit and preferred proxy server. Proxy{} -> return p NoProxy{} -> do- flg <- getBS bsCheckProxy- if not flg- then return p - else do- np <- ioAction $ fetchProxy True{-issue warning on stderr if ill-formed...-}- -- note: this resets the check-proxy flag; a one-off affair.- setProxy np- return np+ flg <- getBS bsCheckProxy+ if not flg+ then return p + else do+ np <- ioAction $ fetchProxy True{-issue warning on stderr if ill-formed...-}+ -- note: this resets the check-proxy flag; a one-off affair.+ setProxy np+ return np -- | @setCheckForProxy flg@ sets the one-time check for proxy -- flag to @flg@. If @True@, the session will try to determine@@ -852,37 +852,37 @@ case allow_redirs of False -> return (Right (uri,rsp)) _ -> do- case retrieveHeaders HdrLocation rsp of- [] -> do - err "No Location: header in redirect response"- return (Right (uri,rsp))- (Header _ u:_) -> - case parseURIReference u of- Nothing -> do- err ("Parse of Location: header in a redirect response failed: " ++ u)- return (Right (uri,rsp))- Just newURI- | {-uriScheme newURI_abs /= uriScheme uri && -}(not (supportedScheme newURI_abs)) -> do- err ("Unable to handle redirect, unsupported scheme: " ++ show newURI_abs)- return (Right (uri, rsp))- | otherwise -> do - out ("Redirecting to " ++ show newURI_abs ++ " ...") - - -- Redirect using GET request method, depending on- -- response code.- let toGet = x `elem` [2,3]- method = if toGet then GET else rqMethod rq- rq1 = rq { rqMethod=method, rqURI=newURI_abs }- rq2 = if toGet then (replaceHeader HdrContentLength "0") (rq1 {rqBody = nullVal}) else rq1- - request' nullVal- rqState{ reqDenies = 0- , reqRedirects = succ(reqRedirects rqState)- , reqStopOnDeny = True- }- rq2- where- newURI_abs = maybe newURI id (newURI `relativeTo` uri)+ case retrieveHeaders HdrLocation rsp of+ [] -> do + err "No Location: header in redirect response"+ return (Right (uri,rsp))+ (Header _ u:_) -> + case parseURIReference u of+ Nothing -> do+ err ("Parse of Location: header in a redirect response failed: " ++ u)+ return (Right (uri,rsp))+ Just newURI+ | {-uriScheme newURI_abs /= uriScheme uri && -}(not (supportedScheme newURI_abs)) -> do+ err ("Unable to handle redirect, unsupported scheme: " ++ show newURI_abs)+ return (Right (uri, rsp))+ | otherwise -> do + out ("Redirecting to " ++ show newURI_abs ++ " ...") + + -- Redirect using GET request method, depending on+ -- response code.+ let toGet = x `elem` [2,3]+ method = if toGet then GET else rqMethod rq+ rq1 = rq { rqMethod=method, rqURI=newURI_abs }+ rq2 = if toGet then (replaceHeader HdrContentLength "0") (rq1 {rqBody = nullVal}) else rq1+ + request' nullVal+ rqState{ reqDenies = 0+ , reqRedirects = succ(reqRedirects rqState)+ , reqStopOnDeny = True+ }+ rq2+ where+ newURI_abs = maybe newURI id (newURI `relativeTo` uri) (3,0,5) -> case retrieveHeaders HdrLocation rsp of