diff --git a/PaymentServer.cabal b/PaymentServer.cabal index bd1e969adacfcf51184c4b46849c6709f1e34a58..246e201fce4d53e2d84cbdc50a75dfad18d0549d 100644 --- a/PaymentServer.cabal +++ b/PaymentServer.cabal @@ -26,8 +26,10 @@ library , optparse-applicative , aeson , bytestring + , utf8-string , servant , servant-server + , http-types , wai , wai-extra , wai-cors diff --git a/src/PaymentServer/Main.hs b/src/PaymentServer/Main.hs index 0c0dd73b58c858d65d7f6dff04d2963b3afafa61..274bc945f2464845b78147bfea284262ece349dd 100644 --- a/src/PaymentServer/Main.hs +++ b/src/PaymentServer/Main.hs @@ -6,6 +6,9 @@ module PaymentServer.Main ( main ) where +import Control.Exception.Base + ( SomeException + ) import Text.Printf ( printf ) @@ -18,10 +21,15 @@ import Data.Text import Data.Default ( def ) +import Network.HTTP.Types.Status + ( status500 + ) import Network.Wai.Handler.Warp ( Port , defaultSettings , setPort + , setOnException + , setOnExceptionResponse , run ) import Network.Wai.Handler.WarpTLS @@ -30,6 +38,9 @@ import Network.Wai.Handler.WarpTLS ) import Network.Wai ( Application + , Request + , Response + , responseLBS ) import Network.Wai.Middleware.Cors ( Origin @@ -79,6 +90,7 @@ import System.Exit import Data.Semigroup ((<>)) import qualified Data.Text.IO as TIO import qualified Data.ByteString as B +import qualified Data.ByteString.Lazy.UTF8 as LBS data Issuer = Trivial @@ -197,7 +209,18 @@ getRunner endpoint = (TLSEndpoint portNumber certificatePath chainPath keyPath) -> let tlsSettings = tlsSettingsChain certificatePath (maybeToList chainPath) keyPath - settings = setPort portNumber defaultSettings + onException :: Maybe Request -> SomeException -> IO () + onException _ exc = do + print "onException" + print exc + return () + onExceptionResponse :: SomeException -> Response + onExceptionResponse = (responseLBS status500 []) . LBS.fromString . ("exception: " ++) . show + settings = + setPort portNumber . + setOnException onException . + setOnExceptionResponse onExceptionResponse $ + defaultSettings in runTLS tlsSettings settings diff --git a/src/PaymentServer/Processors/Stripe.hs b/src/PaymentServer/Processors/Stripe.hs index 57137eda62fd1e9437607a15f47546f93b1cb603..9ee9c2730c334161a434f46179802a7e11efad5a 100644 --- a/src/PaymentServer/Processors/Stripe.hs +++ b/src/PaymentServer/Processors/Stripe.hs @@ -37,7 +37,7 @@ import Servant , Handler , err400 , err500 - , ServerError(errBody) + , ServerError(errHTTPCode, errBody) , throwError ) import Servant.API @@ -171,7 +171,14 @@ charge d key (Charges token voucher amount currency) = do else throwError err500 { errBody = "Voucher code mismatch" } _ -> throwError err400 { errBody = "Voucher code not found" } - Left StripeError {} -> throwError err400 { errBody = "Stripe charge didn't succeed" } + Left StripeError {} -> + let + errCode = (read "foo") :: Int + in + throwError err400 + { errHTTPCode = errCode + , errBody = "Stripe charge didn't succeed" + } where getCurrency :: Text -> Handler Currency getCurrency maybeCurrency =