@@ -40,19 +40,20 @@ module Network.Google.Compute.Metadata
40 , getMetadata
40 , getMetadata
43+import Control.Exception (throwIO)
43import Control.Monad.Catch
44import Control.Monad.Catch
44import Control.Monad.IO.Class (MonadIO (..))
45import Control.Monad.IO.Class (MonadIO (..))
45import Data.Aeson (eitherDecode')
46import Data.Aeson (eitherDecode')
46import Data.ByteString (ByteString)
47import Data.ByteString (ByteString)
47import qualified Data.ByteString.Lazy as LBS
48import qualified Data.ByteString.Lazy as LBS
48import Data.Char (toLower)
49import Data.Char (toLower)
49−import Data.Default.Class (def)
50import qualified Data.Text.Encoding as Text
50import qualified Data.Text.Encoding as Text
51import qualified Data.Text.Lazy as LText
51import qualified Data.Text.Lazy as LText
52import qualified Data.Text.Lazy.Encoding as LText
52import qualified Data.Text.Lazy.Encoding as LText
53import Network.Google.Prelude (Text, (<>))
53import Network.Google.Prelude (Text, (<>))
54−import Network.HTTP.Conduit (HttpException (..), Manager)
54+import Network.HTTP.Client (HttpException (..),
55+ HttpExceptionContent (..), Manager)
55−import qualified Network.HTTP.Conduit as Client
56+import qualified Network.HTTP.Client as Client
56import Network.HTTP.Types (HeaderName)
57import Network.HTTP.Types (HeaderName)
57import System.Environment (lookupEnv)
58import System.Environment (lookupEnv)
@@ -91,7 +92,7 @@ isGCE m = liftIO $ do
91 failure = const (pure False)
92 failure = const (pure False)
93 rq = metadataRequest
94 rq = metadataRequest
94− { Client.responseTimeout = Just 1000000
95+ { Client.responseTimeout = Client.responseTimeoutMicro 1000000
97-- | A directory of custom metadata values that have been set for this project.
98-- | A directory of custom metadata values that have been set for this project.
@@ -223,20 +224,24 @@ getMetadata :: MonadIO m
223 -> [Int] -- ^ Acceptable status code responses.
224 -> [Int] -- ^ Acceptable status code responses.
224 -> Manager
225 -> Manager
225 -> m (Client.Response LBS.ByteString)
226 -> m (Client.Response LBS.ByteString)
226−getMetadata path ss m =
227+getMetadata path statuses m =
227− liftIO . flip Client.httpLbs m $ metadataRequest
228+ liftIO . flip Client.httpLbs m $
228− { Client.path = "/computeMetadata/v1/" <> path
230+ { Client.path = "/computeMetadata/v1/" <> path
229− , Client.checkStatus = \s hs cj ->
231+ , Client.checkResponse = \rq rs ->
230− let c = fromEnum s
232+ let c = fromEnum (Client.responseStatus rs)
231− in if 200 <= c && c < 300 && notElem c ss
233+ in if 200 <= c && c < 300 && notElem c statuses
232− then Nothing
234+ then return ()
236+ bs <- Client.brReadSome (Client.responseBody rs) 4096
237+ throwIO . HttpExceptionRequest rq $
233− else Just . toException $ StatusCodeException s hs cj
238+ StatusCodeException (() <$ rs) (LBS.toStrict bs)
236-- | A default @http-client@ 'Client.Request' with the host, port, and headers
241-- | A default @http-client@ 'Client.Request' with the host, port, and headers
237-- set appropriately for @metadata.google.internal@ use.
242-- set appropriately for @metadata.google.internal@ use.
238metadataRequest :: Client.Request
243metadataRequest :: Client.Request
239−metadataRequest = def
244+metadataRequest = Client.defaultRequest
240 { Client.host = "metadata.google.internal"
245 { Client.host = "metadata.google.internal"
241 , Client.port = 80
246 , Client.port = 80
242 , Client.secure = False
247 , Client.secure = False