@@ -14,6 +14,8 @@ module Dhall.Import.UserHeaders
14
14
15
15
import Data.HashMap.Strict (HashMap )
16
16
import Data.Text (Text )
17
+ import Data.ByteString (ByteString )
18
+ import Data.CaseInsensitive (CI )
17
19
import qualified Data.Text.IO as IO
18
20
import Data.Text.Encoding (decodeUtf8 )
19
21
import Network.HTTP.Types (Header )
@@ -23,9 +25,8 @@ import System.FilePath ((</>))
23
25
import Data.Either.Combinators (rightToMaybe )
24
26
import Control.Exception (tryJust )
25
27
import Control.Monad (guard )
26
- import Control.Monad.Catch (throwM )
27
28
import System.IO.Error (isDoesNotExistError )
28
- import Dhall.Core (Expr , Import )
29
+ import Dhall.Core (Expr , Import , throws )
29
30
import Dhall.Parser (Src )
30
31
import Dhall.Import.Headers (SiteHeaders )
31
32
import qualified Dhall.Parser as Parser
@@ -98,10 +99,7 @@ noopUserHeaders = UserHeaders
98
99
99
100
loadHeaderExpr :: UserHeaders -> FilePath -> Text -> IO SiteHeaders
100
101
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)
105
103
loadRelativeTo directory expr
106
104
107
105
loadAllHeaders :: UserHeaders -> IO SiteHeaders
@@ -113,14 +111,18 @@ addUserHeaders :: HTTP.Request -> HashMap Text Headers -> HTTP.Request
113
111
addUserHeaders request config = addHeaders $ HashMap. lookupDefault [] origin config where
114
112
origin = decodeUtf8 (HTTP. host request) <> " :" <> Text. pack (show (HTTP. port request))
115
113
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
124
126
125
127
-- TODO make this lazy / load only once (see ./HTTP newManager)
126
128
withUserHeaders :: UserHeaders -> HTTP. Request -> IO HTTP. Request
0 commit comments