    -----------------------------------------------------------------------------
    -- |
    -- Module      :  Network.AWS.AWSConnection
    -- Copyright   :  (c) Greg Heartsfield 2007
    -- License     :  BSD3
    --
    -- Connection and authentication info for an Amazon AWS request.
    -----------------------------------------------------------------------------
    module Network.AWS.AWSConnection (
       -- * Constants
       defaultAmazonS3Host, defaultAmazonS3Port,
       -- * Function Types
       amazonS3Connection, amazonS3ConnectionFromEnv,
       -- * Data Types
       AWSConnection(..)
       ) where

    import System.Environment

    -- | An Amazon Web Services connection.  Everything needed to connect
    --   and authenticate requests.
    data AWSConnection =
        AWSConnection { awsHost :: String, -- ^ Service provider hostname
                        awsPort :: Int,    -- ^ Service provider port number
                        awsAccessKey :: String, -- ^ Access Key ID
                        awsSecretKey :: String  -- ^ Secret Access Key
                      } deriving (Show)

    -- | Hostname used for connecting to Amazon's production S3 service (@s3.amazonaws.com@).
    defaultAmazonS3Host :: String
    defaultAmazonS3Host = "s3.amazonaws.com"

    -- | Port number used for connecting to Amazon's production S3 service (@80@).
    defaultAmazonS3Port :: Int
    defaultAmazonS3Port = 80

    -- | Create an AWSConnection to Amazon from credentials.  Uses the
    --   production service.
    amazonS3Connection :: String -- ^ Access Key ID
                       -> String -- ^ Secret Access Key
                       -> AWSConnection -- ^ Connection to Amazon S3
    amazonS3Connection = AWSConnection defaultAmazonS3Host defaultAmazonS3Port

    -- | Retrieve Access and Secret keys from environment variables
    --   AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY, respectively.
    --   Either variable being undefined or empty will result in
    --   'Nothing'.
    amazonS3ConnectionFromEnv :: IO (Maybe AWSConnection)
    amazonS3ConnectionFromEnv =
        do ak <- getEnvKey "AWS_ACCESS_KEY_ID"
           sk0 <- getEnvKey "AWS_ACCESS_KEY_SECRET"
           sk1 <- getEnvKey "AWS_SECRET_ACCESS_KEY"
           return $ case (ak, sk0, sk1) of
                      ("",  _,  _) -> Nothing
                      ( _, "", "") -> Nothing
                      ( _, "",  _) -> Just (amazonS3Connection ak sk1)
                      ( _,  _,  _) -> Just (amazonS3Connection ak sk0)
        where getEnvKey s = fmap (maybe "" id . lookup s) getEnvironment