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 +7/−2
- src/Smtpbz.hs +2/−0
- src/Smtpbz/Internal/Api.hs +12/−11
- src/Smtpbz/Internal/Has.hs +11/−5
- src/Smtpbz/Internal/Manager.hs +42/−0
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