Move parseHttpAccept to Snap module
This commit is contained in:
parent
a2fd56d42c
commit
bc8955aa30
2 changed files with 28 additions and 32 deletions
|
@ -30,8 +30,6 @@ module System.Remote.Common
|
|||
, buildAll
|
||||
, buildCombined
|
||||
, buildOne
|
||||
|
||||
, parseHttpAccept
|
||||
) where
|
||||
|
||||
import Control.Applicative ((<$>))
|
||||
|
@ -44,15 +42,12 @@ import qualified Data.Aeson.Types as A
|
|||
import qualified Data.ByteString as S
|
||||
import qualified Data.ByteString.Char8 as S8
|
||||
import qualified Data.ByteString.Lazy as L
|
||||
import Data.Function (on)
|
||||
import qualified Data.HashMap.Strict as M
|
||||
import Data.IORef (IORef, atomicModifyIORef, readIORef)
|
||||
import Data.Int (Int64)
|
||||
import qualified Data.List as List
|
||||
import qualified Data.Map as Map
|
||||
import qualified Data.Text as T
|
||||
import Data.Time.Clock.POSIX (getPOSIXTime)
|
||||
import Data.Word (Word8)
|
||||
import qualified GHC.Stats as Stats
|
||||
import Prelude hiding (read)
|
||||
|
||||
|
@ -419,33 +414,6 @@ builtinCounters = Map.fromList [
|
|||
, ("par_max_bytes_copied" , show . Stats.parMaxBytesCopied)
|
||||
]
|
||||
|
||||
------------------------------------------------------------------------
|
||||
|
||||
-- Utilities for working with accept headers
|
||||
|
||||
-- | Parse the HTTP accept string to determine supported content types.
|
||||
parseHttpAccept :: S.ByteString -> [S.ByteString]
|
||||
parseHttpAccept = List.map fst
|
||||
. List.sortBy (rcompare `on` snd)
|
||||
. List.map grabQ
|
||||
. S.split 44 -- comma
|
||||
where
|
||||
rcompare :: Double -> Double -> Ordering
|
||||
rcompare = flip compare
|
||||
grabQ s =
|
||||
let (s', q) = breakDiscard 59 s -- semicolon
|
||||
(_, q') = breakDiscard 61 q -- equals sign
|
||||
in (trimWhite s', readQ $ trimWhite q')
|
||||
readQ s = case reads $ S8.unpack s of
|
||||
(x, _):_ -> x
|
||||
_ -> 1.0
|
||||
trimWhite = S.dropWhile (== 32) -- space
|
||||
|
||||
breakDiscard :: Word8 -> S.ByteString -> (S.ByteString, S.ByteString)
|
||||
breakDiscard w s =
|
||||
let (x, y) = S.break (== w) s
|
||||
in (x, S.drop 1 y)
|
||||
|
||||
------------------------------------------------------------------------
|
||||
-- Utilities for working with timestamps
|
||||
|
||||
|
|
|
@ -12,6 +12,7 @@ import Control.Monad.IO.Class (liftIO)
|
|||
import qualified Data.Aeson.Types as A
|
||||
import qualified Data.ByteString as S
|
||||
import qualified Data.ByteString.Char8 as S8
|
||||
import Data.Function (on)
|
||||
import qualified Data.HashMap.Strict as M
|
||||
import Data.IORef (IORef)
|
||||
import qualified Data.List as List
|
||||
|
@ -19,6 +20,7 @@ import qualified Data.Map as Map
|
|||
import Data.Maybe (listToMaybe)
|
||||
import qualified Data.Text as T
|
||||
import qualified Data.Text.Encoding as T
|
||||
import Data.Word (Word8)
|
||||
import Network.Socket (NameInfoFlag(NI_NUMERICHOST), addrAddress, getAddrInfo,
|
||||
getNameInfo)
|
||||
import Paths_ekg (getDataDir)
|
||||
|
@ -165,3 +167,29 @@ serveOne refs = do
|
|||
r <- getResponse
|
||||
finishWith r
|
||||
{-# INLINABLE serveOne #-}
|
||||
|
||||
------------------------------------------------------------------------
|
||||
-- Utilities for working with accept headers
|
||||
|
||||
-- | Parse the HTTP accept string to determine supported content types.
|
||||
parseHttpAccept :: S.ByteString -> [S.ByteString]
|
||||
parseHttpAccept = List.map fst
|
||||
. List.sortBy (rcompare `on` snd)
|
||||
. List.map grabQ
|
||||
. S.split 44 -- comma
|
||||
where
|
||||
rcompare :: Double -> Double -> Ordering
|
||||
rcompare = flip compare
|
||||
grabQ s =
|
||||
let (s', q) = breakDiscard 59 s -- semicolon
|
||||
(_, q') = breakDiscard 61 q -- equals sign
|
||||
in (trimWhite s', readQ $ trimWhite q')
|
||||
readQ s = case reads $ S8.unpack s of
|
||||
(x, _):_ -> x
|
||||
_ -> 1.0
|
||||
trimWhite = S.dropWhile (== 32) -- space
|
||||
|
||||
breakDiscard :: Word8 -> S.ByteString -> (S.ByteString, S.ByteString)
|
||||
breakDiscard w s =
|
||||
let (x, y) = S.break (== w) s
|
||||
in (x, S.drop 1 y)
|
||||
|
|
Loading…
Reference in a new issue