packages feed

smtpbz 1.1.0 → 1.2.0

raw patch · 5 files changed

+74/−18 lines, 5 filesdep +crypton-connectiondep +data-defaultdep +tlsPVP ok

version bump matches the API change (PVP)

Dependencies added: crypton-connection, data-default, tls

API changes (from Hackage documentation)

- Smtpbz: apiKey :: Has t => t -> ByteString
- Smtpbz: baseUrl :: Has t => t -> Text
- Smtpbz: class Has t
- Smtpbz: httpMan :: Has t => t -> Manager
- Smtpbz.Internal.Api: [$sel:address:Unsubscribe] :: Unsubscribe -> Maybe ByteString
- Smtpbz.Internal.Api: [$sel:from:LogMessages] :: LogMessages -> Maybe ByteString
- Smtpbz.Internal.Api: [$sel:from:SmtpSend] :: SmtpSend -> ByteString
- Smtpbz.Internal.Api: [$sel:html:SmtpSend] :: SmtpSend -> ByteString
- Smtpbz.Internal.Api: [$sel:isOpen:LogMessages] :: LogMessages -> Maybe Bool
- Smtpbz.Internal.Api: [$sel:limit:LogMessages] :: LogMessages -> Maybe Int
- Smtpbz.Internal.Api: [$sel:limit:Unsubscribe] :: Unsubscribe -> Maybe Int
- Smtpbz.Internal.Api: [$sel:name:SmtpSend] :: SmtpSend -> Maybe ByteString
- Smtpbz.Internal.Api: [$sel:offset:LogMessages] :: LogMessages -> Maybe Int
- Smtpbz.Internal.Api: [$sel:offset:Unsubscribe] :: Unsubscribe -> Maybe Int
- Smtpbz.Internal.Api: [$sel:reason:Unsubscribe] :: Unsubscribe -> Maybe ByteString
- Smtpbz.Internal.Api: [$sel:replyTo:SmtpSend] :: SmtpSend -> Maybe ByteString
- Smtpbz.Internal.Api: [$sel:subject:SmtpSend] :: SmtpSend -> ByteString
- Smtpbz.Internal.Api: [$sel:tag:LogMessages] :: LogMessages -> Maybe ByteString
- Smtpbz.Internal.Api: [$sel:text:SmtpSend] :: SmtpSend -> Maybe ByteString
- Smtpbz.Internal.Api: [$sel:to:LogMessages] :: LogMessages -> Maybe ByteString
- Smtpbz.Internal.Api: [$sel:to:SmtpSend] :: SmtpSend -> ByteString
+ Smtpbz.Internal.Api: [address] :: Unsubscribe -> Maybe ByteString
+ Smtpbz.Internal.Api: [from] :: SmtpSend -> ByteString
+ Smtpbz.Internal.Api: [html] :: SmtpSend -> ByteString
+ Smtpbz.Internal.Api: [isOpen] :: LogMessages -> Maybe Bool
+ Smtpbz.Internal.Api: [limit] :: Unsubscribe -> Maybe Int
+ Smtpbz.Internal.Api: [name] :: SmtpSend -> Maybe ByteString
+ Smtpbz.Internal.Api: [offset] :: Unsubscribe -> Maybe Int
+ Smtpbz.Internal.Api: [reason] :: Unsubscribe -> Maybe ByteString
+ Smtpbz.Internal.Api: [replyTo] :: SmtpSend -> Maybe ByteString
+ Smtpbz.Internal.Api: [subject] :: SmtpSend -> ByteString
+ Smtpbz.Internal.Api: [tag] :: LogMessages -> Maybe ByteString
+ Smtpbz.Internal.Api: [text] :: SmtpSend -> Maybe ByteString
+ Smtpbz.Internal.Api: [to] :: SmtpSend -> ByteString
+ Smtpbz.Internal.Manager: Manager :: Manager -> Manager
+ Smtpbz.Internal.Manager: [unManager] :: Manager -> Manager
+ Smtpbz.Internal.Manager: newManager :: MonadIO m => m Manager
+ Smtpbz.Internal.Manager: newtype Manager

Files

smtpbz.cabal view
@@ -1,11 +1,11 @@ cabal-version: 1.12 --- This file has been generated from package.yaml by hpack version 0.36.0.+-- This file has been generated from package.yaml by hpack version 0.38.0. -- -- see: https://github.com/sol/hpack  name:           smtpbz-version:        1.1.0+version:        1.2.0 synopsis:       Unofficial API client for smtp.bz description:    See README.markdown category:       Web@@ -30,18 +30,23 @@       Smtpbz       Smtpbz.Internal.Api       Smtpbz.Internal.Has+      Smtpbz.Internal.Manager   other-modules:       Paths_smtpbz   hs-source-dirs:       src   default-extensions:       OverloadedStrings+      ImportQualifiedPost   ghc-options: -funbox-strict-fields -Wall   build-depends:       aeson     , base >=4.7 && <5     , bytestring+    , crypton-connection+    , data-default     , http-conduit     , http-types     , text+    , tls   default-language: Haskell2010
src/Smtpbz.hs view
@@ -1,7 +1,9 @@ module Smtpbz   ( module Smtpbz.Internal.Has+  , module Smtpbz.Internal.Manager   , module Smtpbz.Internal.Api   ) where  import Smtpbz.Internal.Has (Has(..))+import Smtpbz.Internal.Manager import Smtpbz.Internal.Api
src/Smtpbz/Internal/Api.hs view
@@ -30,17 +30,18 @@   , debugPrintResponse   ) where -import           Data.Bool (bool)-import           Data.ByteString (ByteString)-import qualified Data.ByteString.Lazy as Lazy (ByteString)-import qualified Data.ByteString.Lazy.Char8 as ByteString.Lazy-import           Data.Maybe (mapMaybe)-import           Data.String (fromString)-import qualified Network.HTTP.Conduit as Http-import qualified Network.HTTP.Types as Http-import           Text.Printf (printf)+import Data.Bool (bool)+import Data.ByteString (ByteString)+import Data.ByteString.Lazy qualified as Lazy (ByteString)+import Data.ByteString.Lazy.Char8 qualified as ByteString.Lazy+import Data.Maybe (mapMaybe)+import Data.String (fromString)+import Network.HTTP.Conduit qualified as Http+import Network.HTTP.Types qualified as Http+import Text.Printf (printf) -import           Smtpbz.Internal.Has (Has(..))+import Smtpbz.Internal.Has (Has(..))+import Smtpbz.Internal.Manager (Manager(..))   -- | User data.@@ -196,7 +197,7 @@  callApi :: Has smtpbz => smtpbz -> Http.Request -> IO (Http.Response Lazy.ByteString) callApi smtpbz req =-  Http.httpLbs req (httpMan smtpbz)+  Http.httpLbs req (unManager (httpMan smtpbz))  -- | Check if response status code is in [200, 300). successfulCall :: Http.Response Lazy.ByteString -> Bool
src/Smtpbz/Internal/Has.hs view
@@ -3,11 +3,12 @@   ( Has(..)   ) where -import           Data.ByteString (ByteString)-import           Data.Text (Text)-import qualified Network.HTTP.Conduit as Http+import Data.ByteString (ByteString)+import Data.Text (Text) +import Smtpbz.Internal.Manager (Manager) + -- | smtp.bz configuration that is used by the library -- and the user may want to override. class Has t where@@ -15,5 +16,10 @@   apiKey :: t -> ByteString   -- | API base URL; Most likely, https://api.smtp.bz/v1   baseUrl :: t -> Text-  -- | The 'Http.Manager' under which all requests will be made.-  httpMan :: t -> Http.Manager+  -- | The Manager under which all requests will be made.+  --+  -- The default Manager is incompatible with outdated smtpbz servers because+  -- it requires the Extended Main Secret extension, which those servers do not support.+  -- Therefore, we define a newtype to prevent unintentional passing of an incompatible+  -- Manager to API methods, which would result in a runtime error.+  httpMan :: t -> Manager
+ src/Smtpbz/Internal/Manager.hs view
@@ -0,0 +1,42 @@+module Smtpbz.Internal.Manager+  ( Manager(..)+  , newManager+  ) where++import Control.Monad.IO.Class (MonadIO, liftIO)+import Data.Default (def)+import Network.HTTP.Conduit qualified as Http+import Network.Connection (TLSSettings(..))+import Network.TLS (Supported(..), EMSMode(AllowEMS), clientSupported)+++-- A thin wrapper over 'Http.Manager' that API methods require.+--+-- Use 'newManager' to create a 'Manager' that is functionally equivalent to the+-- the default 'Http.Manager' but compatible with smtpbz servers. Alternatively,+-- you can wrap your own 'Http.Manager' if you're certain that it is compatible+-- with smtpbz servers.+newtype Manager = Manager { unManager :: Http.Manager }++-- | Create a 'Manager' that is functionally equivalent to the default 'Http.Manager'+-- but compatible with smtpbz servers.+--+-- Currently, this means relaxing the Extended Main Secret extension requirement.+newManager :: MonadIO m => m Manager+newManager =+  fmap Manager (liftIO (Http.newManager (Http.mkManagerSettings tlsSettings Nothing)))++-- | I'm unsure why http-client's API is so bad, but+-- we have to do a little bit of dancing here to cover+-- every possibility.+tlsSettings :: TLSSettings+tlsSettings =+  case defaultTlsSettings of+    settings@(TLSSettingsSimple {settingClientSupported = supported}) ->+      settings {settingClientSupported = supported {supportedExtendedMainSecret = AllowEMS}}+    TLSSettings params ->+      TLSSettings params {clientSupported = (clientSupported params) {supportedExtendedMainSecret = AllowEMS}}++defaultTlsSettings :: TLSSettings+defaultTlsSettings =+  def