uniform-http-0.1.5.1: src/Uniform/HttpURI.hs
-----------------------------------------------------------------------------
--
-- Module : Store.RDFstore.HttpCall
--
-- | using http simple to sparql queries and to create requests
-- part of uniform (to use only text
-- wraps URI in URI
-----------------------------------------------------------------------------
--{-# OPTIONS_GHC -F -pgmF htfpp #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE IncoherentInstances #-} -- necessary for overlapping
-- {-# LANGUAGE OverlappingInstances #-}
{-# LANGUAGE Unsafe #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
-- {-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE StandaloneDeriving
-- , GeneralizedNewtypeDeriving
, DeriveGeneric
, DeriveAnyClass
#-}
{-# OPTIONS_GHC -fno-warn-missing-methods #-}
module Uniform.HttpURI (
-- TimeOutSec, mkTimeOut, mkTimeOutDefault
-- , URI, HttpQueryParams
module Uniform.HttpURI
-- , module Uniform.Zero
-- , module Uniform.Strings
-- , module N.Network.URI
-- , uriT
) where
import qualified Network.URI as N
-- import Network.URI (URI(..))
-- URI is a newtype with URI as a wrapper
-- import Uniform.Error (errorT)
import Uniform.Json
-- import Uniform.ListForm -- (IsString (..), (</>), (<.>))
-- import Uniform.Strings
-- import Uniform.Strings.Infix ((</>), (<.>))
import UniformBase
--import qualified Network.URI.Encode as N2
newtype URI = URI Text
deriving (Show, Read, Eq, Ord, Generic, Zeros)
-- do not use the constructor on unchecked inputs
unURI (URI a) = a
uriT = unURI
-- ^ gets the URI as a plain text
instance ToJSON URI
instance FromJSON URI
instance NiceStrings URI where shownice s = unwords' ["URI", unURI s]
makeURI :: Text -> URI
makeURI = parseURI
-- make an URI (construct and show as string)
addToURI :: URI -> Text -> URI -- an url encoded string (use s2url or t2url)
-- add a text at end to an URI
addToURI u t = makeURI $ uriT u <> "/" <> t -- infix does hide </>
-- less secure but simpler
-- = case (t2,u2) of
-- (Just t3, Just u3) -> URI . showT $ N.nonStrictRelativeTo t3 u3
-- _ -> errorT ["addToURI failed u,t", showT u2, showT t2]
-- where
-- t2 = N.parseURI . t2s $ t
-- u2 = N.parseURI . t2s . uriT $ u
-- addToURI2 :: URI -> URL -> URI -- an url encoded string (use s2url or t2url)
-- -- add a text at end to an URI
-- addToURI2 u t = --appendOne u t --
-- makeURI $ (uriT u) </> (s2t . unURL $ t)
-- a server URI (not including the port, but absolute)
newtype ServerURI = ServerURI {unServerURI :: URI}
deriving (Show, Read, Eq, Ord, Generic, Zeros, Semigroup, Monoid
-- , ListForms
)
mkServerURI = ServerURI
mkServerURI4text = ServerURI . makeURI
-- --deriving -- <> and mempty missing for Semigroup
-- instance ToJSON ServerURI
-- instance Read N.URI where
-- instance Zeros N.URI where zero = N.nullURI -- fromJustNote "zero mk URI" $ mkURI ""
-- deriving instance Read URI
-- deriving instance Read (RText l)
-- instance ToJSON URI
-- instance FromJSON URI
-- -- instance ToJSON N.URI
-- -- instance ToJSON N.URI -- not possible, issue Auth
-- -- instance ToJSON N.URIAuth
-- -- deriving instance Generic N.URIAuth
-- -- instance (Zeros ServerURI, Zeros (LF ServerURI)) => ListForms ServerURI
-- -- where
-- -- type LF ServerURI = Text
-- -- mkOne = mkServerURI -- = ServerURI . makeAbsURI
-- -- appendTwo a b = ServerURI $ appendTwo (unServerURI a) (unServerURI b)
-- --instance ListForms URI where
-- -- type LF URI = Text
-- -- mkOne = makeURI
-- -- appendTwo a b = makeURI $ appendTwo (showT a) (showT b)
-- mkServerURI :: Text -> ServerURI -- useful, because it is typed!
-- mkServerURI = ServerURI . makeURI -- check for absolute uri?
-- | a type for the application path when calling Http
-- after the URI till the ? (starts with /)
newtype HttpPath = HttpPath Text
deriving (Show, Read, Eq, Ord, Generic, Zeros)
mkHttpPath :: Text -> HttpPath
mkHttpPath = HttpPath -- could check for acceptance here?
-- | the type for the paramter key - value pairs, comes after the ?
unHttpQueryParams :: HttpQueryParams -> [(Text, Maybe Text)]
mkHttpQueryParams :: [(Text, Maybe Text)] -> HttpQueryParams
newtype HttpQueryParams = HttpQueryParams [(Text, Maybe Text)]
deriving (Show, Read, Eq, Generic, Zeros, Semigroup, Monoid)
unHttpQueryParams (HttpQueryParams p) = p
mkHttpQueryParams = HttpQueryParams
--instance Zeros HttpQueryParams where zero = HttpQueryParams []
-- unclear why automatic derivation does not work
-- instance ListForms HttpQueryParams where
-- type LF HttpQueryParams = (Text, Maybe Text)
-- mkOne a = HttpQueryParams [a]
-- appendTwo = (<>)
-- combineHttpQueryParams :: HttpQueryParams -> HttpQueryParams -> HttpQueryParams
-- combineHttpQueryParams p1 p2 = p1 <> p2
-- -- HttpQueryParams (p11 ++ p22)
-- -- where p11 = unHttpQueryParams p1
-- -- p22 = unHttpQueryParams p2
-- -- newtype URI = URI N.URI deriving (Eq, Ord, Generic, Semigroup, Monoid)
-- -- show and read is separately instantiated
-- -- zeros not available for N.URI
-- -- un2 (URI u) = u -- to remove the newtype level
-- -- instance Zeros URI where
-- -- zero = makeURI "http://zero.zero" -- there is no obvious zero here
-- -- instance FromJSON N.URI
-- -- instance FromJSON N.URIAuth
-- -- instance ListForms URI where
-- -- type LF URI = Text
-- -- mkOne = makeURI -- do not test here for validity, because it is used for appendTwo
-- -- appendTwo a b = makeURI $ appendTwo (uriT a) (uriT b)
parseURI :: Text -> URI
-- reads a text string, checks for URI conformity
-- and renders as text wrapped in URI
-- if this is the only way to convert a text to an URI
-- they must be always save
parseURI u = URI . showT $ maybe (errorT ["parseURI in Uniform.HttpURI not acceptable string \n", u, "END of string"])
id
(N.parseURI . t2s $ u )
-- fmap URI . N.parseURI . t2s $ t
-- -- parseAbsoluteURI :: Text -> Maybe URI
-- -- parseAbsoluteURI u = maybe (errorT ["parseAbsoluteURI in Uniform.HttpURI not acceptable string \n", u, "END of string"])
-- -- (Just . URI)
-- -- (N.parseAbsoluteURI . t2s $ u )
-- -- -- fmap URI . N.parseAbsoluteURI . t2s $ t
makeAbsURI :: Text -> URI
makeAbsURI = makeURI -- leave if later a differentiation is desired
-- -- makeAbsURI u = -- error "absfr"
-- -- fromMaybe (errorT ["makeAbsURI in Uniform.HttpURI not acceptable string \n", u, "END of string"])
-- -- (parseAbsoluteURI u :: Maybe URI)
-- -- -- URI $ maybe (errorT ["makeAbsURI in Uniform.HttpURI", u])
-- -- -- id
-- -- -- (N.parseAbsoluteURI . t2s $ u)
-- makeURI :: Text -> URI
-- -- makeURI u = -- error "sdafsfs"
-- -- fromMaybe (errorT ["makeURI in Uniform.HttpURI not acceptable string \n", u, "END of string"])
-- -- (parseURI u :: Maybe URI)
-- -- -- alternative code: makeURI2 = fromMaybe zero . parseURI
-- makeURI u = fromJustNote "makeURI" $ mkURI u
-- uriT = showT
-- addToURI :: URI -> Text -> URI -- an url encoded string (use s2url or t2url)
-- -- add a text at end to an URI
-- addToURI u t = --appendOne u t --
-- makeURI $ (uriT u) </> (s2t . unURL . s2url . t2s $ t)
-- addToURI2 :: URI -> URL -> URI -- an url encoded string (use s2url or t2url)
-- -- add a text at end to an URI
-- addToURI2 u t = --appendOne u t --
-- makeURI $ (uriT u) </> (s2t . unURL $ t)
newtype PortNumber = PortNumber Int
deriving (Eq, Ord, Show, Read, Generic, Zeros)
mkPortNumber i = if i > 0 && i < 64000 then PortNumber i
else errorT ["PortNumber out of range", showT i]
unPortNumber (PortNumber i) = i
addPort2ServerURI :: ServerURI -> PortNumber -> ServerURI
-- addPort2ServerURI u p = mkOne $ appendTwo (uriT . unServerURI $ u)
-- (":" <> (showT . unPortNumber $ p))
addPort2ServerURI (ServerURI u) (PortNumber i) = mkServerURI (makeURI $ uriT u <:> showT i)
-- -- uriT :: URI -> Text
-- -- -- ^ convert an uri to a text (but not a show instance with "")
-- -- uriT = s2t . uriS
-- -- uriS :: URI -> String
-- -- uriS u = N.uriToString defaultUserInfoMap (un2 u) $ ""
-- -- -- to filter out the password, if any in a URI
-- -- -- copied
-- -- defaultUserInfoMap :: String -> String
-- -- defaultUserInfoMap uinf = user ++ newpass
-- -- where
-- -- (user,pass) = break (==':') uinf
-- -- newpass = if null pass || (pass == "@")
-- -- || (pass == ":@")
-- -- then pass
-- -- else ":...@"
-- -- deriving instance Show URI
-- -- deriving instance Read URI
-- -- deriving instance Read N.URI
-- -- deriving instance Read N.URIAuth
-- -- deriving instance {-# Overlapping #-} Show N.URI
-- -- -- the defined in N are not regular Show !!
-- -- deriving instance {-# Overlapping #-} Show N.URIAuth
-- -- instance IsString URI where
-- -- fromString = read . show
-- -- -- instance Show URI where
-- -- -- showsPrec _ s s2 = (show $ uriS s )++ s2
-- -- -- instance Read URI where
-- -- -- readsPrec i r = maybe [] (\res -> [(URI res, rem1)] ) $ N.parseURI x
-- -- -- where [(x ::String , rem1)] = readsPrec i r