module Network.Salvia.Handler.Range
( Range (..)
, contentRange
, range
, rangeL
)
where
import Data.Record.Label
import Data.List
import Network.Protocol.Http
import Safe
data Range = Range (Maybe Integer) (Maybe Integer) (Maybe Integer)
deriving Show
contentRange :: Http Response :-> Maybe Range
contentRange = lmap rangeL `iso` header "Content-Range"
range :: Http Request :-> Maybe Range
range = lmap rangeL `iso` header "Range"
rangeL :: String :<->: Range
rangeL = parser <-> printer
where
printer (Range f t x) = concat ["bytes ", maybe "" show f, "-", maybe "" show t, maybe "" (('/':).show) x]
parser r =
case span (/='-') . maybe r id $ stripPrefix "bytes=" r of
(f, _:a) -> case span (/='/') a of
(t, _:x) -> Range (readMay f) (readMay t) (readMay x)
(t, _) -> Range (readMay f) (readMay t) Nothing
(f, []) -> Range (readMay f) Nothing Nothing