Skip to content

Commit e082165

Browse files
committed
user headers take precedent over inline headers
1 parent a48172b commit e082165

File tree

1 file changed

+16
-14
lines changed

1 file changed

+16
-14
lines changed

dhall/ghc-src/Dhall/Import/UserHeaders.hs

+16-14
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ module Dhall.Import.UserHeaders
1414

1515
import Data.HashMap.Strict (HashMap)
1616
import Data.Text (Text)
17+
import Data.ByteString (ByteString)
18+
import Data.CaseInsensitive (CI)
1719
import qualified Data.Text.IO as IO
1820
import Data.Text.Encoding (decodeUtf8)
1921
import Network.HTTP.Types (Header)
@@ -23,9 +25,8 @@ import System.FilePath ((</>))
2325
import Data.Either.Combinators (rightToMaybe)
2426
import Control.Exception (tryJust)
2527
import Control.Monad (guard)
26-
import Control.Monad.Catch (throwM)
2728
import System.IO.Error (isDoesNotExistError)
28-
import Dhall.Core (Expr, Import)
29+
import Dhall.Core (Expr, Import, throws)
2930
import Dhall.Parser (Src)
3031
import Dhall.Import.Headers (SiteHeaders)
3132
import qualified Dhall.Parser as Parser
@@ -98,10 +99,7 @@ noopUserHeaders = UserHeaders
9899

99100
loadHeaderExpr :: UserHeaders -> FilePath -> Text -> IO SiteHeaders
100101
loadHeaderExpr UserHeaders { loadRelativeTo } directory text = do
101-
-- TODO surely there's a helper for this
102-
expr <- case Parser.exprFromText mempty text of
103-
Left exn -> throwM exn
104-
Right expr -> pure expr
102+
expr <- throws (Parser.exprFromText mempty text)
105103
loadRelativeTo directory expr
106104

107105
loadAllHeaders :: UserHeaders -> IO SiteHeaders
@@ -113,14 +111,18 @@ addUserHeaders :: HTTP.Request -> HashMap Text Headers -> HTTP.Request
113111
addUserHeaders request config = addHeaders $ HashMap.lookupDefault [] origin config where
114112
origin = decodeUtf8 (HTTP.host request) <> ":" <> Text.pack (show (HTTP.port request))
115113

116-
-- TODO how should we combine user / explicit headers?
117-
-- I think for forwards compat we should override mheaders (if any)
118-
-- with userHeaders.
119-
-- TODO check how library deals with multiple conflicting headers
120-
-- in the list
121-
addHeaders newHeaders = request {
122-
HTTP.requestHeaders = (HTTP.requestHeaders request) <> newHeaders
123-
}
114+
addHeaders newHeaders =
115+
request {
116+
HTTP.requestHeaders = originalHeaders <> newHeaders
117+
}
118+
where
119+
originalHeaders = filter (not . overridden) (HTTP.requestHeaders request)
120+
121+
overridden :: Header -> Bool
122+
overridden (key, _value) = any (matchesKey key) newHeaders
123+
124+
matchesKey :: CI ByteString -> Header -> Bool
125+
matchesKey key (candidate, _value) = key == candidate
124126

125127
-- TODO make this lazy / load only once (see ./HTTP newManager)
126128
withUserHeaders :: UserHeaders -> HTTP.Request -> IO HTTP.Request

0 commit comments

Comments
 (0)