Skip to content

Commit

Permalink
Specify User-Agent on every HTTP request (commercialhaskell#3628)
Browse files Browse the repository at this point in the history
Fix: commercialhaskell#3628

Wrap up functions in `Network.HTTP.Client` and `Network.HTTP.Simple` to
add User-Agent to the request object.
  • Loading branch information
igrep committed Dec 20, 2017
1 parent 7d68bd6 commit 416d8f1
Show file tree
Hide file tree
Showing 11 changed files with 79 additions and 15 deletions.
1 change: 1 addition & 0 deletions package.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@ library:
- Data.Store.VersionTagged
- Network.HTTP.Download
- Network.HTTP.Download.Verified
- Network.HTTP.StackClient
- Options.Applicative.Args
- Options.Applicative.Builder.Extra
- Options.Applicative.Complicated
Expand Down
5 changes: 3 additions & 2 deletions src/Hackage/Security/Client/Repository/HttpLib/HttpClient.hs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import qualified Data.ByteString as BS
import qualified Data.ByteString.Char8 as BS.C8
import qualified Network.HTTP.Client as HttpClient
import qualified Network.HTTP.Client.Internal as HttpClient
import qualified Network.HTTP.StackClient as StackClient
import qualified Network.HTTP.Types as HttpClient

import Hackage.Security.Client hiding (Header)
Expand Down Expand Up @@ -69,7 +70,7 @@ get manager reqHeaders uri callback = wrapCustomEx $ do
-- the URI contains URL auth. Not sure if this is a concern.
request' <- HttpClient.setUri HttpClient.defaultRequest uri
let request = setRequestHeaders reqHeaders request'
checkHttpException $ HttpClient.withResponse request manager $ \response -> do
checkHttpException $ StackClient.withResponseByManager request manager $ \response -> do
let br = wrapCustomEx $ HttpClient.responseBody response
callback (getResponseHeaders response) br

Expand All @@ -82,7 +83,7 @@ getRange manager reqHeaders uri (from, to) callback = wrapCustomEx $ do
request' <- HttpClient.setUri HttpClient.defaultRequest uri
let request = setRange from to
$ setRequestHeaders reqHeaders request'
checkHttpException $ HttpClient.withResponse request manager $ \response -> do
checkHttpException $ StackClient.withResponseByManager request manager $ \response -> do
let br = wrapCustomEx $ HttpClient.responseBody response
case () of
() | HttpClient.responseStatus response == HttpClient.partialContent206 ->
Expand Down
9 changes: 6 additions & 3 deletions src/Network/HTTP/Download.hs
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,12 @@ module Network.HTTP.Download
, download
, redownload
, httpJSON
, httpLbs
, httpLBS
, parseRequest
, parseUrlThrow
, setGithubHeaders
, withResponse
) where

import Stack.Prelude
Expand All @@ -30,7 +33,8 @@ import Data.Text.Encoding (decodeUtf8With)
import Network.HTTP.Client (Request, Response, path, checkResponse, parseUrlThrow, parseRequest)
import Network.HTTP.Client.Conduit (requestHeaders)
import Network.HTTP.Download.Verified
import Network.HTTP.Simple (httpJSON, withResponse, getResponseBody, getResponseHeaders, getResponseStatusCode,
import Network.HTTP.StackClient (httpJSON, httpLbs, httpLBS, withResponse)
import Network.HTTP.Simple (getResponseBody, getResponseHeaders, getResponseStatusCode,
setRequestHeader)
import Path.IO (doesFileExist)
import System.Directory (createDirectoryIfMissing,
Expand Down Expand Up @@ -112,5 +116,4 @@ instance Exception DownloadException

-- | Set the user-agent request header
setGithubHeaders :: Request -> Request
setGithubHeaders = setRequestHeader "User-Agent" ["The Haskell Stack"]
. setRequestHeader "Accept" ["application/vnd.github.v3+json"]
setGithubHeaders = setRequestHeader "Accept" ["application/vnd.github.v3+json"]
3 changes: 2 additions & 1 deletion src/Network/HTTP/Download/Verified.hs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@ import Data.Text.Encoding (decodeUtf8With)
import Data.Text.Encoding.Error (lenientDecode)
import GHC.IO.Exception (IOException(..),IOErrorType(..))
import Network.HTTP.Client (getUri, path)
import Network.HTTP.Simple (Request, HttpException, httpSink, getResponseHeaders)
import Network.HTTP.StackClient (httpSink)
import Network.HTTP.Simple (Request, HttpException, getResponseHeaders)
import Network.HTTP.Types.Header (hContentLength, hContentMD5)
import Path
import Stack.Types.Runner
Expand Down
57 changes: 57 additions & 0 deletions src/Network/HTTP/StackClient.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
{-# LANGUAGE OverloadedStrings #-}

module Network.HTTP.StackClient
( httpJSON
, httpLbs
, httpLBS
, httpNoBody
, httpSink
, setUserAgent
, withResponse
, withResponseByManager
) where

import Control.Monad.Catch (MonadMask)
import Data.Aeson (FromJSON)
import qualified Data.ByteString as Strict
import Data.ByteString.Lazy (ByteString)
import Data.Conduit (ConduitM, Sink)
import qualified Network.HTTP.Client
import Network.HTTP.Client (BodyReader, Manager, Request, Response)
import Network.HTTP.Simple (setRequestHeader)
import qualified Network.HTTP.Simple
import UnliftIO (MonadIO)


setUserAgent :: Request -> Request
setUserAgent = setRequestHeader "User-Agent" ["The Haskell Stack"]


httpJSON :: (MonadIO m, FromJSON a) => Request -> m (Response a)
httpJSON = Network.HTTP.Simple.httpJSON . setUserAgent


httpLbs :: MonadIO m => Request -> m (Response ByteString)
httpLbs = Network.HTTP.Simple.httpLbs . setUserAgent


httpLBS :: MonadIO m => Request -> m (Response ByteString)
httpLBS = httpLbs


httpNoBody :: MonadIO m => Request -> m (Response ())
httpNoBody = Network.HTTP.Simple.httpNoBody . setUserAgent


httpSink :: (MonadIO m, MonadMask m) => Request -> (Response () -> Sink Strict.ByteString m a) -> m a
httpSink = Network.HTTP.Simple.httpSink . setUserAgent


withResponse
:: (MonadIO m, MonadMask m, MonadIO n)
=> Request -> (Response (ConduitM i Strict.ByteString n ()) -> m a) -> m a
withResponse = Network.HTTP.Simple.withResponse . setUserAgent


withResponseByManager :: Request -> Manager -> (Response BodyReader -> IO a) -> IO a
withResponseByManager = Network.HTTP.Client.withResponse . setUserAgent
3 changes: 2 additions & 1 deletion src/Stack/Config.hs
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,8 @@ import Distribution.Version (simplifyVersionRange, mkVersion')
import GHC.Conc (getNumProcessors)
import Lens.Micro (lens)
import Network.HTTP.Client (parseUrlThrow)
import Network.HTTP.Simple (httpJSON, getResponseBody)
import Network.HTTP.StackClient (httpJSON)
import Network.HTTP.Simple (getResponseBody)
import Options.Applicative (Parser, strOption, long, help)
import Path
import Path.Extra (toFilePathNoTrailingSep)
Expand Down
3 changes: 2 additions & 1 deletion src/Stack/Ls.hs
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,9 @@ import qualified Data.Text as T
import qualified Data.Text.IO as T
import Data.Typeable (Typeable)
import qualified Data.Vector as V
import Network.HTTP.StackClient (httpJSON)
import Network.HTTP.Simple
(addRequestHeader, getResponseBody, httpJSON, parseRequest,
(addRequestHeader, getResponseBody, parseRequest,
setRequestManager)
import Network.HTTP.Types.Header (hAccept)
import qualified Options.Applicative as OA
Expand Down
2 changes: 1 addition & 1 deletion src/Stack/New.hs
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ import Data.Time.Calendar
import Data.Time.Clock
import qualified Data.Yaml as Yaml
import Network.HTTP.Download
import Network.HTTP.Simple
import Network.HTTP.Simple (Request, HttpException, getResponseStatusCode, getResponseBody)
import Path
import Path.IO
import Stack.Constants
Expand Down
2 changes: 1 addition & 1 deletion src/Stack/Setup.hs
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ import qualified Distribution.System as Cabal
import Distribution.Text (simpleParse)
import Distribution.Version (mkVersion')
import Lens.Micro (set)
import Network.HTTP.Simple (getResponseBody, httpLBS, withResponse, getResponseStatusCode)
import Network.HTTP.Simple (getResponseBody, getResponseStatusCode)
import Network.HTTP.Download
import Path
import Path.CheckInstall (warnInstallSearchPathIssues)
Expand Down
2 changes: 1 addition & 1 deletion src/Stack/Sig/Sign.hs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import qualified Data.ByteString.Lazy as L
import qualified Data.Text as T
import Network.HTTP.Client (RequestBody (RequestBodyBS))
import Network.HTTP.Download
import Network.HTTP.Simple
import Network.HTTP.Simple (setRequestMethod, setRequestBody, getResponseStatusCode)
import Network.HTTP.Types (methodPut)
import Path
import Stack.Package
Expand Down
7 changes: 3 additions & 4 deletions src/Stack/Upload.hs
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,11 @@ import qualified Data.Text.IO as TIO
import Network.HTTP.Client (Response,
RequestBody(RequestBodyLBS),
Request)
import Network.HTTP.Simple (withResponse,
getResponseStatusCode,
import Network.HTTP.StackClient (withResponse, httpNoBody)
import Network.HTTP.Simple (getResponseStatusCode,
getResponseBody,
setRequestHeader,
parseRequest,
httpNoBody)
parseRequest)
import Network.HTTP.Client.MultipartFormData (formDataBody, partFileRequestBody,
partBS, partLBS)
import Network.HTTP.Client.TLS (getGlobalManager,
Expand Down

0 comments on commit 416d8f1

Please sign in to comment.