stackage-server/src/Handler/StackageSdist.hs
2020-02-12 02:10:14 +03:00

53 lines
1.8 KiB
Haskell

{-# LANGUAGE NoImplicitPrelude #-}
module Handler.StackageSdist
( getStackageSdistR
, pnvToSnapshotPackageInfo
) where
import Import
import Stackage.Database
import Handler.Package (packagePage)
handlePNVTarball :: PackageNameP -> VersionP -> Handler TypedContent
handlePNVTarball name version =
redirect $
concat -- TODO: Should this be switched to HTTPS by now?
-- unfortunately using insecure HTTP for cabal's sake
[ "http://hackage.fpcomplete.com/package/"
, toPathPiece name
, "-"
, toPathPiece version
, ".tar.gz"
]
getStackageSdistR
:: SnapName -> PackageNameVersion -> HandlerFor App TypedContent
getStackageSdistR sname pnv =
track "Handler.StackageSdist.getStackageSdistR" $
pnvToSnapshotPackageInfo sname pnv handlePNVTarball $ \isSameVersion spi ->
if isSameVersion
then packagePage (Just spi) (spiPackageName spi) >>= sendResponse
else redirect $
SnapshotR sname $
StackageSdistR $ PNVNameVersion (spiPackageName spi) (spiVersion spi)
pnvToSnapshotPackageInfo ::
SnapName
-> PackageNameVersion
-> (PackageNameP -> VersionP -> HandlerFor App b)
-> (Bool -> SnapshotPackageInfo -> HandlerFor App b)
-> HandlerFor App b
pnvToSnapshotPackageInfo sname pnv tarballHandler spiHandler =
case pnv of
PNVName pname -> spiHelper sname pname >>= spiHandler False
PNVNameVersion pname version ->
spiHelper sname pname >>= \spi -> spiHandler (version == spiVersion spi) spi
PNVTarball name version -> tarballHandler name version
spiHelper :: SnapName -> PackageNameP -> Handler SnapshotPackageInfo
spiHelper sname pname = getSnapshotPackageInfo sname pname >>= maybe notFound return