{-# LANGUAGE DeriveGeneric, FlexibleInstances, FlexibleContexts #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE BinaryLiterals #-}
{-# LANGUAGE LambdaCase #-}
module Network.GitLFS (
TransferRequest(..),
TransferRequestOperation(..),
TransferAdapter(..),
TransferRequestObject(..),
startTransferRequest,
TransferResponse(..),
TransferResponseOperation(..),
IsTransferResponseOperation,
DownloadOperation(..),
UploadOperation(..),
OperationParams(..),
ParsedTransferResponse(..),
parseTransferResponse,
downloadOperationRequest,
uploadOperationRequests,
ServerSupportsChunks(..),
Endpoint,
guessEndpoint,
modifyEndpointRequest,
sshDiscoverEndpointCommand,
parseSshDiscoverEndpointResponse,
TransferResponseError(..),
TransferResponseObjectError(..),
Url,
SHA256,
GitRef(..),
NumSeconds,
HTTPHeader,
HTTPHeaderValue,
) where
import Data.Aeson
import Data.Aeson.Types
import GHC.Generics
import Network.HTTP.Client
import Data.List
import qualified Data.Map as M
import qualified Data.Text as T
import qualified Data.Text.Encoding as E
import qualified Data.ByteString.Lazy as L
import qualified Data.CaseInsensitive as CI
import qualified Network.URI as URI
data TransferRequest = TransferRequest
{ TransferRequest -> TransferRequestOperation
req_operation :: TransferRequestOperation
, TransferRequest -> [TransferAdapter]
req_transfers :: [TransferAdapter]
, TransferRequest -> Maybe GitRef
req_ref :: Maybe GitRef
, TransferRequest -> [TransferRequestObject]
req_objects :: [TransferRequestObject]
}
deriving (forall x. Rep TransferRequest x -> TransferRequest
forall x. TransferRequest -> Rep TransferRequest x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep TransferRequest x -> TransferRequest
$cfrom :: forall x. TransferRequest -> Rep TransferRequest x
Generic, Int -> TransferRequest -> ShowS
[TransferRequest] -> ShowS
TransferRequest -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TransferRequest] -> ShowS
$cshowList :: [TransferRequest] -> ShowS
show :: TransferRequest -> String
$cshow :: TransferRequest -> String
showsPrec :: Int -> TransferRequest -> ShowS
$cshowsPrec :: Int -> TransferRequest -> ShowS
Show)
instance ToJSON TransferRequest where
toJSON :: TransferRequest -> Value
toJSON = forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
genericToJSON Options
transferRequestOptions
toEncoding :: TransferRequest -> Encoding
toEncoding = forall a.
(Generic a, GToJSON' Encoding Zero (Rep a)) =>
Options -> a -> Encoding
genericToEncoding Options
transferRequestOptions
instance FromJSON TransferRequest where
parseJSON :: Value -> Parser TransferRequest
parseJSON = forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
genericParseJSON Options
transferRequestOptions
transferRequestOptions :: Options
transferRequestOptions :: Options
transferRequestOptions = Options -> Options
stripFieldPrefix Options
nonNullOptions
data TransferRequestObject = TransferRequestObject
{ TransferRequestObject -> Url
req_oid :: SHA256
, TransferRequestObject -> NumSeconds
req_size :: Integer
}
deriving (forall x. Rep TransferRequestObject x -> TransferRequestObject
forall x. TransferRequestObject -> Rep TransferRequestObject x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep TransferRequestObject x -> TransferRequestObject
$cfrom :: forall x. TransferRequestObject -> Rep TransferRequestObject x
Generic, Int -> TransferRequestObject -> ShowS
[TransferRequestObject] -> ShowS
TransferRequestObject -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TransferRequestObject] -> ShowS
$cshowList :: [TransferRequestObject] -> ShowS
show :: TransferRequestObject -> String
$cshow :: TransferRequestObject -> String
showsPrec :: Int -> TransferRequestObject -> ShowS
$cshowsPrec :: Int -> TransferRequestObject -> ShowS
Show)
instance ToJSON TransferRequestObject where
toJSON :: TransferRequestObject -> Value
toJSON = forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
genericToJSON Options
transferRequestObjectOptions
toEncoding :: TransferRequestObject -> Encoding
toEncoding = forall a.
(Generic a, GToJSON' Encoding Zero (Rep a)) =>
Options -> a -> Encoding
genericToEncoding Options
transferRequestObjectOptions
instance FromJSON TransferRequestObject where
parseJSON :: Value -> Parser TransferRequestObject
parseJSON = forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
genericParseJSON Options
transferRequestObjectOptions
transferRequestObjectOptions :: Options
transferRequestObjectOptions :: Options
transferRequestObjectOptions = Options -> Options
stripFieldPrefix Options
defaultOptions
data TransferRequestOperation = RequestDownload | RequestUpload
deriving (Int -> TransferRequestOperation -> ShowS
[TransferRequestOperation] -> ShowS
TransferRequestOperation -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TransferRequestOperation] -> ShowS
$cshowList :: [TransferRequestOperation] -> ShowS
show :: TransferRequestOperation -> String
$cshow :: TransferRequestOperation -> String
showsPrec :: Int -> TransferRequestOperation -> ShowS
$cshowsPrec :: Int -> TransferRequestOperation -> ShowS
Show)
instance ToJSON TransferRequestOperation where
toJSON :: TransferRequestOperation -> Value
toJSON TransferRequestOperation
RequestDownload = Value
"download"
toJSON TransferRequestOperation
RequestUpload = Value
"upload"
instance FromJSON TransferRequestOperation where
parseJSON :: Value -> Parser TransferRequestOperation
parseJSON (String Url
"download") = forall (f :: * -> *) a. Applicative f => a -> f a
pure TransferRequestOperation
RequestDownload
parseJSON (String Url
"upload") = forall (f :: * -> *) a. Applicative f => a -> f a
pure TransferRequestOperation
RequestUpload
parseJSON Value
invalid = forall a. String -> Value -> Parser a
typeMismatch String
"TransferRequestOperation" Value
invalid
data TransferResponse op = TransferResponse
{ forall op. TransferResponse op -> Maybe TransferAdapter
transfer :: Maybe TransferAdapter
, forall op. TransferResponse op -> [TransferResponseOperation op]
objects :: [TransferResponseOperation op]
}
deriving (forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall op x. Rep (TransferResponse op) x -> TransferResponse op
forall op x. TransferResponse op -> Rep (TransferResponse op) x
$cto :: forall op x. Rep (TransferResponse op) x -> TransferResponse op
$cfrom :: forall op x. TransferResponse op -> Rep (TransferResponse op) x
Generic, Int -> TransferResponse op -> ShowS
forall op. Show op => Int -> TransferResponse op -> ShowS
forall op. Show op => [TransferResponse op] -> ShowS
forall op. Show op => TransferResponse op -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TransferResponse op] -> ShowS
$cshowList :: forall op. Show op => [TransferResponse op] -> ShowS
show :: TransferResponse op -> String
$cshow :: forall op. Show op => TransferResponse op -> String
showsPrec :: Int -> TransferResponse op -> ShowS
$cshowsPrec :: forall op. Show op => Int -> TransferResponse op -> ShowS
Show)
instance IsTransferResponseOperation op => ToJSON (TransferResponse op) where
toJSON :: TransferResponse op -> Value
toJSON = forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
genericToJSON Options
nonNullOptions
toEncoding :: TransferResponse op -> Encoding
toEncoding = forall a.
(Generic a, GToJSON' Encoding Zero (Rep a)) =>
Options -> a -> Encoding
genericToEncoding Options
nonNullOptions
instance IsTransferResponseOperation op => FromJSON (TransferResponse op)
data TransferResponseError = TransferResponseError
{ TransferResponseError -> Url
resperr_message :: T.Text
, TransferResponseError -> Maybe Url
resperr_request_id :: Maybe T.Text
, TransferResponseError -> Maybe Url
resperr_documentation_url :: Maybe Url
}
deriving (forall x. Rep TransferResponseError x -> TransferResponseError
forall x. TransferResponseError -> Rep TransferResponseError x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep TransferResponseError x -> TransferResponseError
$cfrom :: forall x. TransferResponseError -> Rep TransferResponseError x
Generic, Int -> TransferResponseError -> ShowS
[TransferResponseError] -> ShowS
TransferResponseError -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TransferResponseError] -> ShowS
$cshowList :: [TransferResponseError] -> ShowS
show :: TransferResponseError -> String
$cshow :: TransferResponseError -> String
showsPrec :: Int -> TransferResponseError -> ShowS
$cshowsPrec :: Int -> TransferResponseError -> ShowS
Show)
instance ToJSON TransferResponseError where
toJSON :: TransferResponseError -> Value
toJSON = forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
genericToJSON Options
transferResponseErrorOptions
toEncoding :: TransferResponseError -> Encoding
toEncoding = forall a.
(Generic a, GToJSON' Encoding Zero (Rep a)) =>
Options -> a -> Encoding
genericToEncoding Options
transferResponseErrorOptions
instance FromJSON TransferResponseError where
parseJSON :: Value -> Parser TransferResponseError
parseJSON = forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
genericParseJSON Options
transferResponseErrorOptions
transferResponseErrorOptions :: Options
transferResponseErrorOptions :: Options
transferResponseErrorOptions = Options -> Options
stripFieldPrefix Options
nonNullOptions
data TransferResponseObjectError = TransferResponseObjectError
{ TransferResponseObjectError -> Int
respobjerr_code :: Int
, TransferResponseObjectError -> Url
respobjerr_message :: T.Text
}
deriving (forall x.
Rep TransferResponseObjectError x -> TransferResponseObjectError
forall x.
TransferResponseObjectError -> Rep TransferResponseObjectError x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep TransferResponseObjectError x -> TransferResponseObjectError
$cfrom :: forall x.
TransferResponseObjectError -> Rep TransferResponseObjectError x
Generic, Int -> TransferResponseObjectError -> ShowS
[TransferResponseObjectError] -> ShowS
TransferResponseObjectError -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TransferResponseObjectError] -> ShowS
$cshowList :: [TransferResponseObjectError] -> ShowS
show :: TransferResponseObjectError -> String
$cshow :: TransferResponseObjectError -> String
showsPrec :: Int -> TransferResponseObjectError -> ShowS
$cshowsPrec :: Int -> TransferResponseObjectError -> ShowS
Show)
instance ToJSON TransferResponseObjectError where
toJSON :: TransferResponseObjectError -> Value
toJSON = forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
genericToJSON Options
transferResponseObjectErrorOptions
toEncoding :: TransferResponseObjectError -> Encoding
toEncoding = forall a.
(Generic a, GToJSON' Encoding Zero (Rep a)) =>
Options -> a -> Encoding
genericToEncoding Options
transferResponseObjectErrorOptions
instance FromJSON TransferResponseObjectError where
parseJSON :: Value -> Parser TransferResponseObjectError
parseJSON = forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
genericParseJSON Options
transferResponseObjectErrorOptions
transferResponseObjectErrorOptions :: Options
transferResponseObjectErrorOptions :: Options
transferResponseObjectErrorOptions = Options -> Options
stripFieldPrefix Options
nonNullOptions
data TransferAdapter = Basic
deriving (Int -> TransferAdapter -> ShowS
[TransferAdapter] -> ShowS
TransferAdapter -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TransferAdapter] -> ShowS
$cshowList :: [TransferAdapter] -> ShowS
show :: TransferAdapter -> String
$cshow :: TransferAdapter -> String
showsPrec :: Int -> TransferAdapter -> ShowS
$cshowsPrec :: Int -> TransferAdapter -> ShowS
Show)
instance ToJSON TransferAdapter where
toJSON :: TransferAdapter -> Value
toJSON TransferAdapter
Basic = Value
"basic"
instance FromJSON TransferAdapter where
parseJSON :: Value -> Parser TransferAdapter
parseJSON (String Url
"basic") = forall (f :: * -> *) a. Applicative f => a -> f a
pure TransferAdapter
Basic
parseJSON Value
invalid = forall a. String -> Value -> Parser a
typeMismatch String
"basic" Value
invalid
data TransferResponseOperation op = TransferResponseOperation
{ forall op. TransferResponseOperation op -> Url
resp_oid :: SHA256
, forall op. TransferResponseOperation op -> NumSeconds
resp_size :: Integer
, forall op. TransferResponseOperation op -> Maybe Bool
resp_authenticated :: Maybe Bool
, forall op. TransferResponseOperation op -> Maybe op
resp_actions :: Maybe op
, forall op.
TransferResponseOperation op -> Maybe TransferResponseObjectError
resp_error :: Maybe TransferResponseObjectError
}
deriving (forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall op x.
Rep (TransferResponseOperation op) x
-> TransferResponseOperation op
forall op x.
TransferResponseOperation op
-> Rep (TransferResponseOperation op) x
$cto :: forall op x.
Rep (TransferResponseOperation op) x
-> TransferResponseOperation op
$cfrom :: forall op x.
TransferResponseOperation op
-> Rep (TransferResponseOperation op) x
Generic, Int -> TransferResponseOperation op -> ShowS
forall op. Show op => Int -> TransferResponseOperation op -> ShowS
forall op. Show op => [TransferResponseOperation op] -> ShowS
forall op. Show op => TransferResponseOperation op -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TransferResponseOperation op] -> ShowS
$cshowList :: forall op. Show op => [TransferResponseOperation op] -> ShowS
show :: TransferResponseOperation op -> String
$cshow :: forall op. Show op => TransferResponseOperation op -> String
showsPrec :: Int -> TransferResponseOperation op -> ShowS
$cshowsPrec :: forall op. Show op => Int -> TransferResponseOperation op -> ShowS
Show)
instance ToJSON op => ToJSON (TransferResponseOperation op) where
toJSON :: TransferResponseOperation op -> Value
toJSON = forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
genericToJSON Options
transferResponseOperationOptions
toEncoding :: TransferResponseOperation op -> Encoding
toEncoding = forall a.
(Generic a, GToJSON' Encoding Zero (Rep a)) =>
Options -> a -> Encoding
genericToEncoding Options
transferResponseOperationOptions
instance FromJSON op => FromJSON (TransferResponseOperation op) where
parseJSON :: Value -> Parser (TransferResponseOperation op)
parseJSON = forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
genericParseJSON Options
transferResponseOperationOptions
transferResponseOperationOptions :: Options
transferResponseOperationOptions :: Options
transferResponseOperationOptions = Options -> Options
stripFieldPrefix Options
nonNullOptions
class (FromJSON op, ToJSON op) => IsTransferResponseOperation op
data DownloadOperation = DownloadOperation
{ DownloadOperation -> OperationParams
download :: OperationParams }
deriving (forall x. Rep DownloadOperation x -> DownloadOperation
forall x. DownloadOperation -> Rep DownloadOperation x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep DownloadOperation x -> DownloadOperation
$cfrom :: forall x. DownloadOperation -> Rep DownloadOperation x
Generic, Int -> DownloadOperation -> ShowS
[DownloadOperation] -> ShowS
DownloadOperation -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DownloadOperation] -> ShowS
$cshowList :: [DownloadOperation] -> ShowS
show :: DownloadOperation -> String
$cshow :: DownloadOperation -> String
showsPrec :: Int -> DownloadOperation -> ShowS
$cshowsPrec :: Int -> DownloadOperation -> ShowS
Show)
instance IsTransferResponseOperation DownloadOperation
instance ToJSON DownloadOperation
instance FromJSON DownloadOperation
data UploadOperation = UploadOperation
{ UploadOperation -> OperationParams
upload :: OperationParams
, UploadOperation -> Maybe OperationParams
verify :: Maybe OperationParams
}
deriving (forall x. Rep UploadOperation x -> UploadOperation
forall x. UploadOperation -> Rep UploadOperation x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep UploadOperation x -> UploadOperation
$cfrom :: forall x. UploadOperation -> Rep UploadOperation x
Generic, Int -> UploadOperation -> ShowS
[UploadOperation] -> ShowS
UploadOperation -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [UploadOperation] -> ShowS
$cshowList :: [UploadOperation] -> ShowS
show :: UploadOperation -> String
$cshow :: UploadOperation -> String
showsPrec :: Int -> UploadOperation -> ShowS
$cshowsPrec :: Int -> UploadOperation -> ShowS
Show)
instance IsTransferResponseOperation UploadOperation
instance ToJSON UploadOperation where
toJSON :: UploadOperation -> Value
toJSON = forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
genericToJSON Options
nonNullOptions
toEncoding :: UploadOperation -> Encoding
toEncoding = forall a.
(Generic a, GToJSON' Encoding Zero (Rep a)) =>
Options -> a -> Encoding
genericToEncoding Options
nonNullOptions
instance FromJSON UploadOperation
data OperationParams = OperationParams
{ OperationParams -> Url
href :: Url
, :: Maybe (M.Map HTTPHeader HTTPHeaderValue)
, OperationParams -> Maybe NumSeconds
expires_in :: Maybe NumSeconds
, OperationParams -> Maybe Url
expires_at :: Maybe T.Text
}
deriving (forall x. Rep OperationParams x -> OperationParams
forall x. OperationParams -> Rep OperationParams x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep OperationParams x -> OperationParams
$cfrom :: forall x. OperationParams -> Rep OperationParams x
Generic, Int -> OperationParams -> ShowS
[OperationParams] -> ShowS
OperationParams -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [OperationParams] -> ShowS
$cshowList :: [OperationParams] -> ShowS
show :: OperationParams -> String
$cshow :: OperationParams -> String
showsPrec :: Int -> OperationParams -> ShowS
$cshowsPrec :: Int -> OperationParams -> ShowS
Show)
instance ToJSON OperationParams where
toJSON :: OperationParams -> Value
toJSON = forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
genericToJSON Options
nonNullOptions
toEncoding :: OperationParams -> Encoding
toEncoding = forall a.
(Generic a, GToJSON' Encoding Zero (Rep a)) =>
Options -> a -> Encoding
genericToEncoding Options
nonNullOptions
instance FromJSON OperationParams
data Verification = Verification
{ Verification -> Url
verification_oid :: SHA256
, Verification -> NumSeconds
verification_size :: Integer
}
deriving (forall x. Rep Verification x -> Verification
forall x. Verification -> Rep Verification x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Verification x -> Verification
$cfrom :: forall x. Verification -> Rep Verification x
Generic, Int -> Verification -> ShowS
[Verification] -> ShowS
Verification -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Verification] -> ShowS
$cshowList :: [Verification] -> ShowS
show :: Verification -> String
$cshow :: Verification -> String
showsPrec :: Int -> Verification -> ShowS
$cshowsPrec :: Int -> Verification -> ShowS
Show)
instance ToJSON Verification where
toJSON :: Verification -> Value
toJSON = forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
genericToJSON Options
verificationOptions
toEncoding :: Verification -> Encoding
toEncoding = forall a.
(Generic a, GToJSON' Encoding Zero (Rep a)) =>
Options -> a -> Encoding
genericToEncoding Options
verificationOptions
instance FromJSON Verification where
parseJSON :: Value -> Parser Verification
parseJSON = forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
genericParseJSON Options
verificationOptions
verificationOptions :: Options
verificationOptions :: Options
verificationOptions = Options -> Options
stripFieldPrefix Options
defaultOptions
data SshDiscoveryResponse = SshDiscoveryResponse
{ SshDiscoveryResponse -> Url
endpoint_href :: Url
, :: Maybe (M.Map HTTPHeader HTTPHeaderValue)
, SshDiscoveryResponse -> Maybe NumSeconds
endpoint_expires_in :: Maybe NumSeconds
, SshDiscoveryResponse -> Maybe Url
endpoint_expires_at :: Maybe T.Text
} deriving (forall x. Rep SshDiscoveryResponse x -> SshDiscoveryResponse
forall x. SshDiscoveryResponse -> Rep SshDiscoveryResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep SshDiscoveryResponse x -> SshDiscoveryResponse
$cfrom :: forall x. SshDiscoveryResponse -> Rep SshDiscoveryResponse x
Generic, Int -> SshDiscoveryResponse -> ShowS
[SshDiscoveryResponse] -> ShowS
SshDiscoveryResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SshDiscoveryResponse] -> ShowS
$cshowList :: [SshDiscoveryResponse] -> ShowS
show :: SshDiscoveryResponse -> String
$cshow :: SshDiscoveryResponse -> String
showsPrec :: Int -> SshDiscoveryResponse -> ShowS
$cshowsPrec :: Int -> SshDiscoveryResponse -> ShowS
Show)
instance ToJSON SshDiscoveryResponse where
toJSON :: SshDiscoveryResponse -> Value
toJSON = forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
genericToJSON Options
sshDiscoveryResponseOptions
toEncoding :: SshDiscoveryResponse -> Encoding
toEncoding = forall a.
(Generic a, GToJSON' Encoding Zero (Rep a)) =>
Options -> a -> Encoding
genericToEncoding Options
sshDiscoveryResponseOptions
instance FromJSON SshDiscoveryResponse where
parseJSON :: Value -> Parser SshDiscoveryResponse
parseJSON = forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
genericParseJSON Options
sshDiscoveryResponseOptions
sshDiscoveryResponseOptions :: Options
sshDiscoveryResponseOptions :: Options
sshDiscoveryResponseOptions = Options -> Options
stripFieldPrefix Options
nonNullOptions
data GitRef = GitRef
{ GitRef -> Url
name :: T.Text }
deriving (forall x. Rep GitRef x -> GitRef
forall x. GitRef -> Rep GitRef x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep GitRef x -> GitRef
$cfrom :: forall x. GitRef -> Rep GitRef x
Generic, Int -> GitRef -> ShowS
[GitRef] -> ShowS
GitRef -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GitRef] -> ShowS
$cshowList :: [GitRef] -> ShowS
show :: GitRef -> String
$cshow :: GitRef -> String
showsPrec :: Int -> GitRef -> ShowS
$cshowsPrec :: Int -> GitRef -> ShowS
Show)
instance FromJSON GitRef
instance ToJSON GitRef
type SHA256 = T.Text
data Endpoint = Endpoint Request
deriving (Int -> Endpoint -> ShowS
[Endpoint] -> ShowS
Endpoint -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Endpoint] -> ShowS
$cshowList :: [Endpoint] -> ShowS
show :: Endpoint -> String
$cshow :: Endpoint -> String
showsPrec :: Int -> Endpoint -> ShowS
$cshowsPrec :: Int -> Endpoint -> ShowS
Show)
sshDiscoverEndpointCommand :: FilePath -> TransferRequestOperation -> [String]
sshDiscoverEndpointCommand :: String -> TransferRequestOperation -> [String]
sshDiscoverEndpointCommand String
remotepath TransferRequestOperation
tro =
[ String
"git-lfs-authenticate"
, String
remotepath
, case TransferRequestOperation
tro of
TransferRequestOperation
RequestDownload -> String
"download"
TransferRequestOperation
RequestUpload -> String
"upload"
]
mkEndpoint :: URI.URI -> Maybe Endpoint
mkEndpoint :: URI -> Maybe Endpoint
mkEndpoint URI
uri = do
Request
r <- forall (m :: * -> *). MonadThrow m => URI -> m Request
requestFromURI URI
uri
let r' :: Request
r' = Request -> Request
addLfsJsonHeaders forall a b. (a -> b) -> a -> b
$ Request
r { path :: Method
path = Request -> Method
path Request
r forall a. Semigroup a => a -> a -> a
<> Method
"/objects/batch" }
forall (m :: * -> *) a. Monad m => a -> m a
return (Request -> Endpoint
Endpoint Request
r')
parseSshDiscoverEndpointResponse :: L.ByteString -> Maybe Endpoint
parseSshDiscoverEndpointResponse :: ByteString -> Maybe Endpoint
parseSshDiscoverEndpointResponse ByteString
resp = do
SshDiscoveryResponse
sr <- forall a. FromJSON a => ByteString -> Maybe a
decode ByteString
resp
URI
uri <- String -> Maybe URI
URI.parseURI (Url -> String
T.unpack (SshDiscoveryResponse -> Url
endpoint_href SshDiscoveryResponse
sr))
Endpoint
endpoint <- URI -> Maybe Endpoint
mkEndpoint URI
uri
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Endpoint -> (Request -> Request) -> Endpoint
modifyEndpointRequest Endpoint
endpoint forall a b. (a -> b) -> a -> b
$ case SshDiscoveryResponse -> Maybe (Map Url Url)
endpoint_header SshDiscoveryResponse
sr of
Maybe (Map Url Url)
Nothing -> forall a. a -> a
id
Just Map Url Url
headers ->
let headers' :: [(HeaderName, Method)]
headers' = forall a b. (a -> b) -> [a] -> [b]
map (Url, Url) -> (HeaderName, Method)
convheader (forall k a. Map k a -> [(k, a)]
M.toList Map Url Url
headers)
in \Request
req -> Request
req
{ requestHeaders :: [(HeaderName, Method)]
requestHeaders = Request -> [(HeaderName, Method)]
requestHeaders Request
req forall a. [a] -> [a] -> [a]
++ [(HeaderName, Method)]
headers' }
where
convheader :: (Url, Url) -> (HeaderName, Method)
convheader (Url
k, Url
v) = (forall s. FoldCase s => s -> CI s
CI.mk (Url -> Method
E.encodeUtf8 Url
k), Url -> Method
E.encodeUtf8 Url
v)
guessEndpoint :: URI.URI -> Maybe Endpoint
guessEndpoint :: URI -> Maybe Endpoint
guessEndpoint URI
uri = case URI -> String
URI.uriScheme URI
uri of
String
"https:" -> Maybe Endpoint
endpoint
String
"http:" -> Maybe Endpoint
endpoint
String
_ -> forall a. Maybe a
Nothing
where
endpoint :: Maybe Endpoint
endpoint = URI -> Maybe Endpoint
mkEndpoint forall a b. (a -> b) -> a -> b
$ URI
uri
{ uriScheme :: String
URI.uriScheme = String
"https:"
, uriPath :: String
URI.uriPath = String
guessedpath
}
guessedpath :: String
guessedpath
| String
".git" forall a. Eq a => [a] -> [a] -> Bool
`isSuffixOf` URI -> String
URI.uriPath URI
uri =
URI -> String
URI.uriPath URI
uri forall a. [a] -> [a] -> [a]
++ String
"/info/lfs"
| String
".git/" forall a. Eq a => [a] -> [a] -> Bool
`isSuffixOf` URI -> String
URI.uriPath URI
uri =
URI -> String
URI.uriPath URI
uri forall a. [a] -> [a] -> [a]
++ String
"info/lfs"
| Bool
otherwise = (forall {a}. Eq a => a -> [a] -> [a]
droptrailing Char
'/' (URI -> String
URI.uriPath URI
uri)) forall a. [a] -> [a] -> [a]
++ String
".git/info/lfs"
droptrailing :: a -> [a] -> [a]
droptrailing a
c = forall a. [a] -> [a]
reverse forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> [a]
dropWhile (forall a. Eq a => a -> a -> Bool
== a
c) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> [a]
reverse
modifyEndpointRequest :: Endpoint -> (Request -> Request) -> Endpoint
modifyEndpointRequest :: Endpoint -> (Request -> Request) -> Endpoint
modifyEndpointRequest (Endpoint Request
r) Request -> Request
f = Request -> Endpoint
Endpoint (Request -> Request
f Request
r)
startTransferRequest :: Endpoint -> TransferRequest -> Request
startTransferRequest :: Endpoint -> TransferRequest -> Request
startTransferRequest (Endpoint Request
r) TransferRequest
tr = Request
r
{ method :: Method
method = Method
"POST"
, requestBody :: RequestBody
requestBody = ByteString -> RequestBody
RequestBodyLBS (forall a. ToJSON a => a -> ByteString
encode TransferRequest
tr)
}
addLfsJsonHeaders :: Request -> Request
Request
r = Request
r
{ requestHeaders :: [(HeaderName, Method)]
requestHeaders = Request -> [(HeaderName, Method)]
requestHeaders Request
r forall a. [a] -> [a] -> [a]
++
[ (HeaderName
"Accept", Method
lfsjson)
, (HeaderName
"Content-Type", Method
lfsjson)
]
}
where
lfsjson :: Method
lfsjson = Method
"application/vnd.git-lfs+json"
data ParsedTransferResponse op
= ParsedTransferResponse (TransferResponse op)
| ParsedTransferResponseError TransferResponseError
| ParseFailed String
parseTransferResponse
:: IsTransferResponseOperation op
=> L.ByteString
-> ParsedTransferResponse op
parseTransferResponse :: forall op.
IsTransferResponseOperation op =>
ByteString -> ParsedTransferResponse op
parseTransferResponse ByteString
resp = case forall a. FromJSON a => ByteString -> Either String a
eitherDecode ByteString
resp of
Right TransferResponse op
tr -> forall op. TransferResponse op -> ParsedTransferResponse op
ParsedTransferResponse TransferResponse op
tr
Left String
err ->
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (forall a b. a -> b -> a
const forall a b. (a -> b) -> a -> b
$ forall op. String -> ParsedTransferResponse op
ParseFailed String
err) forall op. TransferResponseError -> ParsedTransferResponse op
ParsedTransferResponseError forall a b. (a -> b) -> a -> b
$
forall a. FromJSON a => ByteString -> Either String a
eitherDecode ByteString
resp
downloadOperationRequest :: DownloadOperation -> Maybe Request
downloadOperationRequest :: DownloadOperation -> Maybe Request
downloadOperationRequest = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a b. (a, b) -> a
fst forall b c a. (b -> c) -> (a -> b) -> a -> c
. OperationParams -> Maybe (Request, ServerSupportsChunks)
operationParamsRequest forall b c a. (b -> c) -> (a -> b) -> a -> c
. DownloadOperation -> OperationParams
download
uploadOperationRequests :: UploadOperation -> (ServerSupportsChunks -> RequestBody) -> SHA256 -> Integer -> Maybe [Request]
uploadOperationRequests :: UploadOperation
-> (ServerSupportsChunks -> RequestBody)
-> Url
-> NumSeconds
-> Maybe [Request]
uploadOperationRequests UploadOperation
op ServerSupportsChunks -> RequestBody
mkcontent Url
oid NumSeconds
size =
case (Maybe Request
mkdlreq, Maybe Request
mkverifyreq) of
(Maybe Request
Nothing, Maybe Request
_) -> forall a. a -> a
check forall a. Maybe a
Nothing
(Just Request
dlreq, Maybe Request
Nothing) -> forall a. a -> a
check forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just [Request
dlreq]
(Just Request
dlreq, Just Request
verifyreq) -> forall a. a -> a
check forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just [Request
dlreq, Request
verifyreq]
where
check :: t -> t
check t
a
| forall a. Show a => a -> String
show NumSeconds
x forall a. Eq a => a -> a -> Bool
== forall a. Show a => a -> String
show NumSeconds
b12 = t -> t
check t
a
| Bool
otherwise = t
a
where
b12 :: Integer
b12 :: NumSeconds
b12 = NumSeconds
1
x :: Integer
x :: NumSeconds
x = forall a. Num a => a -> a -> a
(+)NumSeconds
0b1NumSeconds
2
mkdlreq :: Maybe Request
mkdlreq = (Request, ServerSupportsChunks) -> Request
mkdlreq'
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> OperationParams -> Maybe (Request, ServerSupportsChunks)
operationParamsRequest (UploadOperation -> OperationParams
upload UploadOperation
op)
mkdlreq' :: (Request, ServerSupportsChunks) -> Request
mkdlreq' (Request
r, ServerSupportsChunks
ssc) = Request
r
{ method :: Method
method = Method
"PUT"
, requestBody :: RequestBody
requestBody = ServerSupportsChunks -> RequestBody
mkcontent ServerSupportsChunks
ssc
}
mkverifyreq :: Maybe Request
mkverifyreq = forall {b}. (Request, b) -> Request
mkverifyreq'
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (OperationParams -> Maybe (Request, ServerSupportsChunks)
operationParamsRequest forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< UploadOperation -> Maybe OperationParams
verify UploadOperation
op)
mkverifyreq' :: (Request, b) -> Request
mkverifyreq' (Request
r, b
_ssc) = Request -> Request
addLfsJsonHeaders forall a b. (a -> b) -> a -> b
$ Request
r
{ method :: Method
method = Method
"POST"
, requestBody :: RequestBody
requestBody = ByteString -> RequestBody
RequestBodyLBS forall a b. (a -> b) -> a -> b
$ forall a. ToJSON a => a -> ByteString
encode forall a b. (a -> b) -> a -> b
$
Url -> NumSeconds -> Verification
Verification Url
oid NumSeconds
size
}
newtype ServerSupportsChunks = ServerSupportsChunks Bool
operationParamsRequest :: OperationParams -> Maybe (Request, ServerSupportsChunks)
operationParamsRequest :: OperationParams -> Maybe (Request, ServerSupportsChunks)
operationParamsRequest OperationParams
ps = do
Request
r <- forall (m :: * -> *). MonadThrow m => String -> m Request
parseRequest (Url -> String
T.unpack (OperationParams -> Url
href OperationParams
ps))
let headers :: [(HeaderName, Method)]
headers = forall a b. (a -> b) -> [a] -> [b]
map (Url, Url) -> (HeaderName, Method)
convheader forall a b. (a -> b) -> a -> b
$ forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] forall k a. Map k a -> [(k, a)]
M.toList (OperationParams -> Maybe (Map Url Url)
header OperationParams
ps)
let headers' :: [(HeaderName, Method)]
headers' = forall a. (a -> Bool) -> [a] -> [a]
filter forall {a} {b}. (Eq a, IsString a) => (a, b) -> Bool
allowedheader [(HeaderName, Method)]
headers
let ssc :: ServerSupportsChunks
ssc = Bool -> ServerSupportsChunks
ServerSupportsChunks forall a b. (a -> b) -> a -> b
$
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (forall a. Eq a => a -> a -> Bool
== (HeaderName
"Transfer-Encoding", Method
"chunked")) [(HeaderName, Method)]
headers
forall (m :: * -> *) a. Monad m => a -> m a
return (Request
r { requestHeaders :: [(HeaderName, Method)]
requestHeaders = [(HeaderName, Method)]
headers' }, ServerSupportsChunks
ssc)
where
convheader :: (Url, Url) -> (HeaderName, Method)
convheader (Url
k, Url
v) = (forall s. FoldCase s => s -> CI s
CI.mk (Url -> Method
E.encodeUtf8 Url
k), Url -> Method
E.encodeUtf8 Url
v)
allowedheader :: (a, b) -> Bool
allowedheader (a
k, b
_) = a
k forall a. Eq a => a -> a -> Bool
/= a
"Transfer-Encoding"
Bool -> Bool -> Bool
&& a
k forall a. Eq a => a -> a -> Bool
/= a
"Content-Length"
type Url = T.Text
type NumSeconds = Integer
type = T.Text
type = T.Text
nonNullOptions :: Options
nonNullOptions :: Options
nonNullOptions = Options
defaultOptions { omitNothingFields :: Bool
omitNothingFields = Bool
True }
stripFieldPrefix :: Options -> Options
stripFieldPrefix :: Options -> Options
stripFieldPrefix Options
o =
Options
o { fieldLabelModifier :: ShowS
fieldLabelModifier = forall a. Int -> [a] -> [a]
drop Int
1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> [a]
dropWhile (forall a. Eq a => a -> a -> Bool
/= Char
'_') }