    {-# LANGUAGE DeriveDataTypeable #-}
    {-# LANGUAGE DeriveGeneric      #-}
    module Servant.API.IsSecure
      ( -- $issecure
        IsSecure(..)
      ) where

    import           Data.Typeable
                     (Typeable)
    import           GHC.Generics
                     (Generic)

    -- | Was this request made over an SSL connection?
    --
    -- Note that this value will not tell you if the client originally
    -- made this request over SSL, but rather whether the current
    -- connection is SSL. The distinction lies with reverse proxies.
    -- In many cases, the client will connect to a load balancer over SSL,
    -- but connect to the WAI handler without SSL. In such a case,
    -- the handlers would get 'NotSecure', but from a user perspective,
    -- there is a secure connection.
    data IsSecure = Secure    -- ^ the connection to the server
                              --   is secure (HTTPS)
                  | NotSecure -- ^ the connection to the server
                              --   is not secure (HTTP)
      deriving (Eq, Show, Read, Generic, Ord, Typeable)

    -- $issecure
    --
    -- | Use 'IsSecure' whenever your request handlers need to know whether
    --   the connection to the server is secure or not.
    --   This would make the request handlers receive an argument of type 'IsSecure',
    --   whose value can be one of 'Secure' (HTTPS) or 'NotSecure' (HTTP).
    --
    -- Example:
    --
    -- >>> type API = "sensitive-data" :> IsSecure :> Get '[JSON] NationSecrets

    -- $setup
    -- >>> import Servant.API
    -- >>> data NationSecrets