- Licensed under the GNU AGPL version 3 or higher.
-}
+{-# LANGUAGE CPP #-}
+
module P2P.Http.Url where
import Data.List
+import Network.URI
+#ifdef WITH_SERVANT
+import Servant.Client (BaseUrl(..), Scheme(..))
+import Text.Read
+#endif
defaultP2PHttpProtocolPort :: Int
defaultP2PHttpProtocolPort = 9417 -- Git protocol is 9418
isP2PHttpProtocolUrl s =
"annex+http://" `isPrefixOf` s ||
"annex+https://" `isPrefixOf` s
+
+data P2PHttpUrl =
+#ifdef WITH_SERVANT
+ P2PHttpUrl String BaseUrl
+#else
+ P2PHttpUrl String
+#endif
+
+parseP2PHttpUrl :: String -> Maybe P2PHttpUrl
+parseP2PHttpUrl us
+ | isP2PHttpProtocolUrl us = case parseURI (drop prefixlen us) of
+ Nothing -> Nothing
+#ifdef WITH_SERVANT
+ Just u ->
+ case uriScheme u of
+ "http:" -> mkbaseurl Http u
+ "https:" -> mkbaseurl Https u
+ _ -> Nothing
+#else
+ Just _ ->
+ Just (P2PHttpUrl us)
+#endif
+ | otherwise = Nothing
+ where
+ prefixlen = length "annex+"
+#ifdef WITH_SERVANT
+ mkbaseurl s u = do
+ auth <- uriAuthority u
+ port <- if null (uriPort auth)
+ then Just defaultP2PHttpProtocolPort
+ else readMaybe (dropWhile (== ':') (uriPort auth))
+ return $ P2PHttpUrl us $ BaseUrl
+ { baseUrlScheme = s
+ , baseUrlHost = uriRegName auth
+ , baseUrlPath = uriPath u
+ , baseUrlPort = port
+ }
+#endif
import Utility.ThreadScheduler (Seconds(..))
import Utility.Url (Scheme, mkScheme)
import Network.Socket (PortNumber)
+import P2P.Http.Url
import Control.Concurrent.STM
import qualified Data.Set as S
, remoteAnnexClusterNode :: Maybe [RemoteName]
, remoteAnnexClusterGateway :: [ClusterUUID]
, remoteUrl :: Maybe String
+ , remoteAnnexP2PHttpUrl :: Maybe P2PHttpUrl
{- These settings are specific to particular types of remotes
- including special remotes. -}
| B.null b -> Nothing
| otherwise -> Just (decodeBS b)
_ -> Nothing
+ , remoteAnnexP2PHttpUrl =
+ case Git.Config.getMaybe (remoteConfig remotename (remoteGitConfigKey AnnexUrlField)) r of
+ Just (ConfigValue b) ->
+ parseP2PHttpUrl (decodeBS b)
+ _ -> Nothing
, remoteAnnexShell = getmaybe ShellField
, remoteAnnexSshOptions = getoptions SshOptionsField
, remoteAnnexRsyncOptions = getoptions RsyncOptionsField
| ClusterNodeField
| ClusterGatewayField
| UrlField
+ | AnnexUrlField
| ShellField
| SshOptionsField
| RsyncOptionsField
ClusterNodeField -> uninherited "cluster-node"
ClusterGatewayField -> uninherited "cluster-gateway"
UrlField -> uninherited "url"
+ AnnexUrlField -> uninherited "annexurl"
ShellField -> inherited "shell"
SshOptionsField -> inherited "ssh-options"
RsyncOptionsField -> inherited "rsync-options"