{-# LANGUAGE OverloadedStrings #-}
module Network.HTTP.Date.Parser (parseHTTPDate) where
import Control.Applicative
import Control.Monad
import Data.Attoparsec.ByteString
import Data.Attoparsec.ByteString.Char8
import Data.ByteString
import Data.Char
import Network.HTTP.Date.Types
parseHTTPDate :: ByteString -> Maybe HTTPDate
parseHTTPDate :: ByteString -> Maybe HTTPDate
parseHTTPDate bs :: ByteString
bs = case Parser HTTPDate -> ByteString -> Either String HTTPDate
forall a. Parser a -> ByteString -> Either String a
parseOnly Parser HTTPDate
rfc1123Date ByteString
bs of
Right ut :: HTTPDate
ut -> HTTPDate -> Maybe HTTPDate
forall a. a -> Maybe a
Just HTTPDate
ut
_ -> Maybe HTTPDate
forall a. Maybe a
Nothing
rfc1123Date :: Parser HTTPDate
rfc1123Date :: Parser HTTPDate
rfc1123Date = do
Int
w <- Parser Int
wkday
Parser ByteString ByteString -> Parser ByteString ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Parser ByteString ByteString -> Parser ByteString ())
-> Parser ByteString ByteString -> Parser ByteString ()
forall a b. (a -> b) -> a -> b
$ ByteString -> Parser ByteString ByteString
string ", "
(y :: Int
y,m :: Int
m,d :: Int
d) <- Parser (Int, Int, Int)
date1
Parser ByteString ()
sp
(h :: Int
h,n :: Int
n,s :: Int
s) <- Parser (Int, Int, Int)
time
Parser ByteString ()
sp
Parser ByteString ByteString -> Parser ByteString ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Parser ByteString ByteString -> Parser ByteString ())
-> Parser ByteString ByteString -> Parser ByteString ()
forall a b. (a -> b) -> a -> b
$ ByteString -> Parser ByteString ByteString
string "GMT" Parser ByteString ByteString
-> Parser ByteString ByteString -> Parser ByteString ByteString
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString -> Parser ByteString ByteString
string "+0000" Parser ByteString ByteString
-> Parser ByteString ByteString -> Parser ByteString ByteString
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString -> Parser ByteString ByteString
string "UTC"
HTTPDate -> Parser HTTPDate
forall (m :: * -> *) a. Monad m => a -> m a
return (HTTPDate -> Parser HTTPDate) -> HTTPDate -> Parser HTTPDate
forall a b. (a -> b) -> a -> b
$ HTTPDate
defaultHTTPDate {
hdYear :: Int
hdYear = Int
y
, hdMonth :: Int
hdMonth = Int
m
, hdDay :: Int
hdDay = Int
d
, hdHour :: Int
hdHour = Int
h
, hdMinute :: Int
hdMinute = Int
n
, hdSecond :: Int
hdSecond = Int
s
, hdWkday :: Int
hdWkday = Int
w
}
wkday :: Parser Int
wkday :: Parser Int
wkday = 1 Int -> Parser ByteString ByteString -> Parser Int
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ ByteString -> Parser ByteString ByteString
string "Mon"
Parser Int -> Parser Int -> Parser Int
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> 2 Int -> Parser ByteString ByteString -> Parser Int
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ ByteString -> Parser ByteString ByteString
string "Tue"
Parser Int -> Parser Int -> Parser Int
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> 3 Int -> Parser ByteString ByteString -> Parser Int
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ ByteString -> Parser ByteString ByteString
string "Wed"
Parser Int -> Parser Int -> Parser Int
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> 4 Int -> Parser ByteString ByteString -> Parser Int
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ ByteString -> Parser ByteString ByteString
string "Thu"
Parser Int -> Parser Int -> Parser Int
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> 5 Int -> Parser ByteString ByteString -> Parser Int
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ ByteString -> Parser ByteString ByteString
string "Fri"
Parser Int -> Parser Int -> Parser Int
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> 6 Int -> Parser ByteString ByteString -> Parser Int
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ ByteString -> Parser ByteString ByteString
string "Sat"
Parser Int -> Parser Int -> Parser Int
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> 7 Int -> Parser ByteString ByteString -> Parser Int
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ ByteString -> Parser ByteString ByteString
string "Sun"
date1 :: Parser (Int,Int,Int)
date1 :: Parser (Int, Int, Int)
date1 = do
Int
d <- Parser Int
day
Parser ByteString ()
sp
Int
m <- Parser Int
month
Parser ByteString ()
sp
Int
y <- Parser Int
year
(Int, Int, Int) -> Parser (Int, Int, Int)
forall (m :: * -> *) a. Monad m => a -> m a
return (Int
y,Int
m,Int
d)
where
day :: Parser Int
day = Parser Int
digit2
year :: Parser Int
year = Parser Int
digit4
sp :: Parser ()
sp :: Parser ByteString ()
sp = () () -> Parser ByteString Char -> Parser ByteString ()
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Char -> Parser ByteString Char
char ' '
time :: Parser (Int,Int,Int)
time :: Parser (Int, Int, Int)
time = do
Int
h <- Parser Int
digit2
Parser ByteString Char -> Parser ByteString ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Parser ByteString Char -> Parser ByteString ())
-> Parser ByteString Char -> Parser ByteString ()
forall a b. (a -> b) -> a -> b
$ Char -> Parser ByteString Char
char ':'
Int
m <- Parser Int
digit2
Parser ByteString Char -> Parser ByteString ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Parser ByteString Char -> Parser ByteString ())
-> Parser ByteString Char -> Parser ByteString ()
forall a b. (a -> b) -> a -> b
$ Char -> Parser ByteString Char
char ':'
Int
s <- Parser Int
digit2
(Int, Int, Int) -> Parser (Int, Int, Int)
forall (m :: * -> *) a. Monad m => a -> m a
return (Int
h,Int
m,Int
s)
month :: Parser Int
month :: Parser Int
month = 1 Int -> Parser ByteString ByteString -> Parser Int
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ ByteString -> Parser ByteString ByteString
string "Jan"
Parser Int -> Parser Int -> Parser Int
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> 2 Int -> Parser ByteString ByteString -> Parser Int
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ ByteString -> Parser ByteString ByteString
string "Feb"
Parser Int -> Parser Int -> Parser Int
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> 3 Int -> Parser ByteString ByteString -> Parser Int
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ ByteString -> Parser ByteString ByteString
string "Mar"
Parser Int -> Parser Int -> Parser Int
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> 4 Int -> Parser ByteString ByteString -> Parser Int
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ ByteString -> Parser ByteString ByteString
string "Apr"
Parser Int -> Parser Int -> Parser Int
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> 5 Int -> Parser ByteString ByteString -> Parser Int
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ ByteString -> Parser ByteString ByteString
string "May"
Parser Int -> Parser Int -> Parser Int
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> 6 Int -> Parser ByteString ByteString -> Parser Int
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ ByteString -> Parser ByteString ByteString
string "Jun"
Parser Int -> Parser Int -> Parser Int
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> 7 Int -> Parser ByteString ByteString -> Parser Int
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ ByteString -> Parser ByteString ByteString
string "Jul"
Parser Int -> Parser Int -> Parser Int
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> 8 Int -> Parser ByteString ByteString -> Parser Int
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ ByteString -> Parser ByteString ByteString
string "Aug"
Parser Int -> Parser Int -> Parser Int
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> 9 Int -> Parser ByteString ByteString -> Parser Int
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ ByteString -> Parser ByteString ByteString
string "Sep"
Parser Int -> Parser Int -> Parser Int
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> 10 Int -> Parser ByteString ByteString -> Parser Int
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ ByteString -> Parser ByteString ByteString
string "Oct"
Parser Int -> Parser Int -> Parser Int
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> 11 Int -> Parser ByteString ByteString -> Parser Int
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ ByteString -> Parser ByteString ByteString
string "Nov"
Parser Int -> Parser Int -> Parser Int
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> 12 Int -> Parser ByteString ByteString -> Parser Int
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ ByteString -> Parser ByteString ByteString
string "Dec"
digit2 :: Parser Int
digit2 :: Parser Int
digit2 = do
Int
x1 <- Char -> Int
toInt (Char -> Int) -> Parser ByteString Char -> Parser Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser ByteString Char
digit
Int
x2 <- Char -> Int
toInt (Char -> Int) -> Parser ByteString Char -> Parser Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser ByteString Char
digit
Int -> Parser Int
forall (m :: * -> *) a. Monad m => a -> m a
return (Int -> Parser Int) -> Int -> Parser Int
forall a b. (a -> b) -> a -> b
$ Int
x1 Int -> Int -> Int
forall a. Num a => a -> a -> a
* 10 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
x2
digit4 :: Parser Int
digit4 :: Parser Int
digit4 = do
Int
x1 <- Char -> Int
toInt (Char -> Int) -> Parser ByteString Char -> Parser Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser ByteString Char
digit
Int
x2 <- Char -> Int
toInt (Char -> Int) -> Parser ByteString Char -> Parser Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser ByteString Char
digit
Int
x3 <- Char -> Int
toInt (Char -> Int) -> Parser ByteString Char -> Parser Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser ByteString Char
digit
Int
x4 <- Char -> Int
toInt (Char -> Int) -> Parser ByteString Char -> Parser Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser ByteString Char
digit
Int -> Parser Int
forall (m :: * -> *) a. Monad m => a -> m a
return (Int -> Parser Int) -> Int -> Parser Int
forall a b. (a -> b) -> a -> b
$ Int
x1 Int -> Int -> Int
forall a. Num a => a -> a -> a
* 1000 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
x2 Int -> Int -> Int
forall a. Num a => a -> a -> a
* 100 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
x3 Int -> Int -> Int
forall a. Num a => a -> a -> a
* 10 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
x4
toInt :: Char -> Int
toInt :: Char -> Int
toInt c :: Char
c = Char -> Int
ord Char
c Int -> Int -> Int
forall a. Num a => a -> a -> a
- Char -> Int
ord '0'