Skip to content

Commit 3a04e95

Browse files
authored
Merge pull request aristidb#213 from bgamari/http-client-2.2
Support http-client == 2.2
2 parents eccbd53 + f18b362 commit 3a04e95

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+190
-125
lines changed

Aws/Aws.hs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ import qualified Data.Text.Encoding as T
5252
import qualified Data.Text.IO as T
5353
import qualified Network.HTTP.Conduit as HTTP
5454
import System.IO (stderr)
55+
import Prelude
5556

5657
-- | The severity of a log message, in rising order.
5758
data LogLevel
@@ -189,9 +190,9 @@ simpleAws :: (Transaction r a, AsMemoryResponse a, MonadIO io)
189190
-> ServiceConfiguration r NormalQuery
190191
-> r
191192
-> io (MemoryResponse a)
192-
simpleAws cfg scfg request
193-
= liftIO $ HTTP.withManager $ \manager ->
194-
loadToMemory =<< readResponseIO =<< aws cfg scfg manager request
193+
simpleAws cfg scfg request = liftIO $ runResourceT $ do
194+
manager <- liftIO $ HTTP.newManager HTTP.tlsManagerSettings
195+
loadToMemory =<< readResponseIO =<< aws cfg scfg manager request
195196

196197
-- | Run an AWS transaction, without enforcing that response and request type form a valid transaction pair.
197198
--
@@ -202,7 +203,6 @@ simpleAws cfg scfg request
202203
-- Metadata is wrapped in the Response, and also logged at level 'Info'.
203204
unsafeAws
204205
:: (ResponseConsumer r a,
205-
Monoid (ResponseMetadata a),
206206
Loggable (ResponseMetadata a),
207207
SignQuery r) =>
208208
Configuration -> ServiceConfiguration r NormalQuery -> HTTP.Manager -> r -> ResourceT IO (Response (ResponseMetadata a) a)
@@ -227,7 +227,6 @@ unsafeAws cfg scfg manager request = do
227227
-- Metadata is put in the 'IORef', but not logged.
228228
unsafeAwsRef
229229
:: (ResponseConsumer r a,
230-
Monoid (ResponseMetadata a),
231230
SignQuery r) =>
232231
Configuration -> ServiceConfiguration r NormalQuery -> HTTP.Manager -> IORef (ResponseMetadata a) -> r -> ResourceT IO a
233232
unsafeAwsRef cfg info manager metadataRef request = do
@@ -247,7 +246,7 @@ unsafeAwsRef cfg info manager metadataRef request = do
247246
logDebug $ "Response status: " ++ show (HTTP.responseStatus hresp)
248247
forM_ (HTTP.responseHeaders hresp) $ \(hname,hvalue) -> liftIO $
249248
logger cfg Debug $ T.decodeUtf8 $ "Response header '" `mappend` CI.original hname `mappend` "': '" `mappend` hvalue `mappend` "'"
250-
{-# SCC "unsafeAwsRef:responseConsumer" #-} responseConsumer request metadataRef hresp
249+
{-# SCC "unsafeAwsRef:responseConsumer" #-} responseConsumer httpRequest request metadataRef hresp
251250

252251
-- | Run a URI-only AWS transaction. Returns a URI that can be sent anywhere. Does not work with all requests.
253252
--

Aws/Core.hs

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ module Aws.Core
2222
, HeaderException(..)
2323
, FormException(..)
2424
, NoCredentialsException(..)
25+
, throwStatusCodeException
2526
-- ** Response deconstruction helpers
2627
, readHex2
2728
-- *** XML
@@ -111,8 +112,10 @@ import qualified Data.ByteString.UTF8 as BU
111112
import Data.Char
112113
import Data.Conduit (($$+-))
113114
import qualified Data.Conduit as C
115+
#if MIN_VERSION_http_conduit(2,2,0)
116+
import qualified Data.Conduit.Binary as CB
117+
#endif
114118
import qualified Data.Conduit.List as CL
115-
import Data.Default (def)
116119
import Data.IORef
117120
import Data.List
118121
import qualified Data.Map as M
@@ -130,14 +133,13 @@ import qualified Network.HTTP.Types as HTTP
130133
import System.Directory
131134
import System.Environment
132135
import System.FilePath ((</>))
133-
#if MIN_VERSION_time(1,5,0)
134-
import Data.Time.Format
135-
#else
136+
#if !MIN_VERSION_time(1,5,0)
136137
import System.Locale
137138
#endif
138139
import qualified Text.XML as XML
139140
import qualified Text.XML.Cursor as Cu
140141
import Text.XML.Cursor hiding (force, forceM)
142+
import Prelude
141143
-------------------------------------------------------------------------------
142144

143145
-- | Types that can be logged (textually).
@@ -201,14 +203,15 @@ class Monoid (ResponseMetadata resp) => ResponseConsumer req resp where
201203
-- metadata type for each AWS service.
202204
type ResponseMetadata resp
203205

204-
-- | Response parser. Takes the corresponding request, an 'IORef'
205-
-- for metadata, and HTTP response data.
206-
responseConsumer :: req -> IORef (ResponseMetadata resp) -> HTTPResponseConsumer resp
206+
-- | Response parser. Takes the corresponding AWS request, the derived
207+
-- @http-client@ request (for error reporting), an 'IORef' for metadata, and
208+
-- HTTP response data.
209+
responseConsumer :: HTTP.Request -> req -> IORef (ResponseMetadata resp) -> HTTPResponseConsumer resp
207210

208211
-- | Does not parse response. For debugging.
209212
instance ResponseConsumer r (HTTP.Response L.ByteString) where
210213
type ResponseMetadata (HTTP.Response L.ByteString) = ()
211-
responseConsumer _ _ resp = do
214+
responseConsumer _ _ _ resp = do
212215
bss <- HTTP.responseBody resp $$+- CL.consume
213216
return resp
214217
{ HTTP.responseBody = L.fromChunks bss
@@ -317,8 +320,8 @@ loadCredentialsFromEnv = liftIO $ do
317320
Traversable.sequence $ makeCredentials' <$> keyID <*> secret
318321

319322
loadCredentialsFromInstanceMetadata :: MonadIO io => io (Maybe Credentials)
320-
loadCredentialsFromInstanceMetadata = liftIO $ HTTP.withManager $ \mgr ->
321-
do
323+
loadCredentialsFromInstanceMetadata = do
324+
mgr <- liftIO $ HTTP.newManager HTTP.tlsManagerSettings
322325
-- check if the path is routable
323326
avail <- liftIO $ hostAvailable "169.254.169.254"
324327
if not avail
@@ -462,7 +465,7 @@ queryToHttpRequest :: SignedQuery -> IO (HTTP.Request (C.ResourceT IO))
462465
#endif
463466
queryToHttpRequest SignedQuery{..} = do
464467
mauth <- maybe (return Nothing) (Just<$>) sqAuthorization
465-
return $ def {
468+
return $ HTTP.defaultRequest {
466469
HTTP.method = httpMethod sqMethod
467470
, HTTP.secure = case sqProtocol of
468471
HTTP -> False
@@ -494,7 +497,11 @@ queryToHttpRequest SignedQuery{..} = do
494497
_ -> HTTP.RequestBodyBuilder 0 mempty
495498

496499
, HTTP.decompress = HTTP.alwaysDecompress
497-
, HTTP.checkStatus = \_ _ _ -> Nothing
500+
#if MIN_VERSION_http_conduit(2,2,0)
501+
, HTTP.checkResponse = \_ _ -> return ()
502+
#else
503+
, HTTP.checkStatus = \_ _ _-> Nothing
504+
#endif
498505

499506
, HTTP.redirectCount = 10
500507
}
@@ -792,6 +799,24 @@ newtype NoCredentialsException = NoCredentialsException { noCredentialsErrorMess
792799

793800
instance E.Exception NoCredentialsException
794801

802+
-- | A helper to throw an 'HTTP.StatusCodeException'.
803+
throwStatusCodeException :: HTTP.Request
804+
-> HTTP.Response (C.ResumableSource (ResourceT IO) ByteString)
805+
-> ResourceT IO a
806+
#if MIN_VERSION_http_conduit(2,2,0)
807+
throwStatusCodeException req resp = do
808+
let resp' = fmap (const ()) resp
809+
-- only take first 10kB of error response
810+
body <- HTTP.responseBody resp C.$$+- CB.take (10*1024)
811+
let sce = HTTP.StatusCodeException resp' (L.toStrict body)
812+
throwM $ HTTP.HttpExceptionRequest req sce
813+
#else
814+
throwStatusCodeException _req resp = do
815+
let cookies = HTTP.responseCookieJar resp
816+
headers = HTTP.responseHeaders resp
817+
status = HTTP.responseStatus resp
818+
throwM $ HTTP.StatusCodeException status headers cookies
819+
#endif
795820

796821
-- | A specific element (case-insensitive, ignoring namespace - sadly necessary), extracting only the textual contents.
797822
elContent :: T.Text -> Cursor -> [T.Text]

Aws/DynamoDb/Commands/DeleteItem.hs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import Control.Applicative
2626
import Data.Aeson
2727
import Data.Default
2828
import qualified Data.Text as T
29+
import Prelude
2930
-------------------------------------------------------------------------------
3031
import Aws.Core
3132
import Aws.DynamoDb.Core
@@ -97,7 +98,7 @@ instance FromJSON DeleteItemResponse where
9798

9899
instance ResponseConsumer r DeleteItemResponse where
99100
type ResponseMetadata DeleteItemResponse = DdbResponse
100-
responseConsumer _ ref resp = ddbResponseConsumer ref resp
101+
responseConsumer _ _ ref resp = ddbResponseConsumer ref resp
101102

102103

103104
instance AsMemoryResponse DeleteItemResponse where

Aws/DynamoDb/Commands/GetItem.hs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import Control.Applicative
1919
import Data.Aeson
2020
import Data.Default
2121
import qualified Data.Text as T
22+
import Prelude
2223
-------------------------------------------------------------------------------
2324
import Aws.Core
2425
import Aws.DynamoDb.Core
@@ -84,7 +85,7 @@ instance FromJSON GetItemResponse where
8485

8586
instance ResponseConsumer r GetItemResponse where
8687
type ResponseMetadata GetItemResponse = DdbResponse
87-
responseConsumer _ ref resp = ddbResponseConsumer ref resp
88+
responseConsumer _ _ ref resp = ddbResponseConsumer ref resp
8889

8990

9091
instance AsMemoryResponse GetItemResponse where

Aws/DynamoDb/Commands/PutItem.hs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import Control.Applicative
2626
import Data.Aeson
2727
import Data.Default
2828
import qualified Data.Text as T
29+
import Prelude
2930
-------------------------------------------------------------------------------
3031
import Aws.Core
3132
import Aws.DynamoDb.Core
@@ -98,7 +99,7 @@ instance FromJSON PutItemResponse where
9899

99100
instance ResponseConsumer r PutItemResponse where
100101
type ResponseMetadata PutItemResponse = DdbResponse
101-
responseConsumer _ ref resp = ddbResponseConsumer ref resp
102+
responseConsumer _ _ ref resp = ddbResponseConsumer ref resp
102103

103104

104105
instance AsMemoryResponse PutItemResponse where

Aws/DynamoDb/Commands/Query.hs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,8 @@ instance SignQuery Query where
135135

136136
instance ResponseConsumer r QueryResponse where
137137
type ResponseMetadata QueryResponse = DdbResponse
138-
responseConsumer _ ref resp = ddbResponseConsumer ref resp
138+
responseConsumer _ _ ref resp
139+
= ddbResponseConsumer ref resp
139140

140141

141142
instance AsMemoryResponse QueryResponse where

Aws/DynamoDb/Commands/Scan.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ instance SignQuery Scan where
114114

115115
instance ResponseConsumer r ScanResponse where
116116
type ResponseMetadata ScanResponse = DdbResponse
117-
responseConsumer _ ref resp = ddbResponseConsumer ref resp
117+
responseConsumer _ _ ref resp = ddbResponseConsumer ref resp
118118

119119

120120
instance AsMemoryResponse ScanResponse where

Aws/DynamoDb/Commands/Table.hs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import Data.Time.Clock.POSIX
4444
import Data.Typeable
4545
import qualified Data.Vector as V
4646
import GHC.Generics (Generic)
47+
import Prelude
4748
-------------------------------------------------------------------------------
4849
import Aws.Core
4950
import Aws.DynamoDb.Core
@@ -293,7 +294,7 @@ instance A.FromJSON TableDescription where
293294
{- Can't derive these instances onto the return values
294295
instance ResponseConsumer r TableDescription where
295296
type ResponseMetadata TableDescription = DyMetadata
296-
responseConsumer _ _ = ddbResponseConsumer
297+
responseConsumer _ _ _ = ddbResponseConsumer
297298
instance AsMemoryResponse TableDescription where
298299
type MemoryResponse TableDescription = TableDescription
299300
loadToMemory = return
@@ -351,7 +352,7 @@ newtype CreateTableResult = CreateTableResult { ctStatus :: TableDescription }
351352
-- ResponseConsumer and AsMemoryResponse can't be derived
352353
instance ResponseConsumer r CreateTableResult where
353354
type ResponseMetadata CreateTableResult = DdbResponse
354-
responseConsumer _ = ddbResponseConsumer
355+
responseConsumer _ _ = ddbResponseConsumer
355356
instance AsMemoryResponse CreateTableResult where
356357
type MemoryResponse CreateTableResult = TableDescription
357358
loadToMemory = return . ctStatus
@@ -376,7 +377,7 @@ newtype DescribeTableResult = DescribeTableResult { dtStatus :: TableDescription
376377
-- ResponseConsumer can't be derived
377378
instance ResponseConsumer r DescribeTableResult where
378379
type ResponseMetadata DescribeTableResult = DdbResponse
379-
responseConsumer _ = ddbResponseConsumer
380+
responseConsumer _ _ = ddbResponseConsumer
380381
instance AsMemoryResponse DescribeTableResult where
381382
type MemoryResponse DescribeTableResult = TableDescription
382383
loadToMemory = return . dtStatus
@@ -408,7 +409,7 @@ newtype UpdateTableResult = UpdateTableResult { uStatus :: TableDescription }
408409
-- ResponseConsumer can't be derived
409410
instance ResponseConsumer r UpdateTableResult where
410411
type ResponseMetadata UpdateTableResult = DdbResponse
411-
responseConsumer _ = ddbResponseConsumer
412+
responseConsumer _ _ = ddbResponseConsumer
412413
instance AsMemoryResponse UpdateTableResult where
413414
type MemoryResponse UpdateTableResult = TableDescription
414415
loadToMemory = return . uStatus
@@ -433,7 +434,7 @@ newtype DeleteTableResult = DeleteTableResult { dStatus :: TableDescription }
433434
-- ResponseConsumer can't be derived
434435
instance ResponseConsumer r DeleteTableResult where
435436
type ResponseMetadata DeleteTableResult = DdbResponse
436-
responseConsumer _ = ddbResponseConsumer
437+
responseConsumer _ _ = ddbResponseConsumer
437438
instance AsMemoryResponse DeleteTableResult where
438439
type MemoryResponse DeleteTableResult = TableDescription
439440
loadToMemory = return . dStatus
@@ -459,7 +460,7 @@ instance A.FromJSON ListTablesResult where
459460
parseJSON = A.genericParseJSON capitalizeOpt
460461
instance ResponseConsumer r ListTablesResult where
461462
type ResponseMetadata ListTablesResult = DdbResponse
462-
responseConsumer _ = ddbResponseConsumer
463+
responseConsumer _ _ = ddbResponseConsumer
463464
instance AsMemoryResponse ListTablesResult where
464465
type MemoryResponse ListTablesResult = [T.Text]
465466
loadToMemory = return . tableNames

Aws/DynamoDb/Commands/UpdateItem.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ module Aws.DynamoDb.Commands.UpdateItem
2525
, AttributeUpdate(..)
2626
, au
2727
, UpdateAction(..)
28-
, UpdateItem(..)
2928
, UpdateItemResponse(..)
3029
) where
3130

@@ -34,6 +33,7 @@ import Control.Applicative
3433
import Data.Aeson
3534
import Data.Default
3635
import qualified Data.Text as T
36+
import Prelude
3737
-------------------------------------------------------------------------------
3838
import Aws.Core
3939
import Aws.DynamoDb.Core
@@ -158,7 +158,7 @@ instance FromJSON UpdateItemResponse where
158158

159159
instance ResponseConsumer r UpdateItemResponse where
160160
type ResponseMetadata UpdateItemResponse = DdbResponse
161-
responseConsumer _ ref resp = ddbResponseConsumer ref resp
161+
responseConsumer _ _ ref resp = ddbResponseConsumer ref resp
162162

163163

164164
instance AsMemoryResponse UpdateItemResponse where

Aws/DynamoDb/Core.hs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,7 @@ instance DynVal UTCTime where
399399

400400
-------------------------------------------------------------------------------
401401
pico :: Rational
402-
pico = toRational $ 10 ^ (12 :: Integer)
402+
pico = toRational $ (10 :: Integer) ^ (12 :: Integer)
403403

404404

405405
-------------------------------------------------------------------------------
@@ -1142,6 +1142,7 @@ data QuerySelect
11421142
instance Default QuerySelect where def = SelectAll
11431143

11441144
-------------------------------------------------------------------------------
1145+
querySelectJson :: KeyValue t => QuerySelect -> [t]
11451146
querySelectJson (SelectSpecific as) =
11461147
[ "Select" .= String "SPECIFIC_ATTRIBUTES"
11471148
, "AttributesToGet" .= as]
@@ -1338,7 +1339,7 @@ getAttr k m = do
13381339
-- | Parse attribute if it's present in the 'Item'. Fail if attribute
13391340
-- is present but conversion fails.
13401341
getAttr'
1341-
:: forall a. (Typeable a, DynVal a)
1342+
:: forall a. (DynVal a)
13421343
=> T.Text
13431344
-- ^ Attribute name
13441345
-> Item

0 commit comments

Comments
 (0)