Search code examples
haskellbrowseroperating-systemhaskell-snap-framework

Snap interface - getting the OS and Browser information


I am using the Snap information and I was wondering if there was some type of Request function ( such as ::Request -> IO Snap() or ::Request -> Handler App App()) that returns the OS or Browser information of the user visiting the webpage.

I would like to get the OS and Browser information of the person who is visiting the webpage.


Solution

  • You can get the User-Agent HTTP header via getHeader, because Request has a HasHeaders instance.

    Example snippet:

    import qualified Data.ByteString.Char8 as CS
    import qualified Data.CaseInsensitive as CI
    import Data.Maybe (listToMaybe)
    
    uaName :: ByteString
    uaName = CS.pack "User-Agent"
    -- You can avoid CS.pack with OverloadedStrings extension.
    
    uahName :: CI ByteString
    uahName = CI.mk uaName
    -- OverloadedStrings also gets rid of the CI.mk call.
    
    getUserAgent :: Request -> Snap (Maybe ByteString)
    getUserAgent rq = return . coerce $ getHeader uahName rq
     where 
        coerce :: Maybe [ByteString] -> Maybe ByteString
        coerce = (>>= listToMaybe)
        -- Some HTTP headers can appear multiple times, hence the list.
        -- `coerce` ignores all but the first occurrence.
    

    For more detailed / less voluntary information, you could inject JS into an initial request and set cookies that can be extracted with rqCookies in a lter request.