nuthatch/test/Nuthatch/Probe/ProductClient.hs

113 lines
2.8 KiB
Haskell
Raw Normal View History

module Nuthatch.Probe.ProductClient
( browse
, deleteObject
, download
, sha256Hex
, upload
) where
import Crypto.Hash (Digest, SHA256, hash)
import qualified Data.ByteArray as BA
import qualified Data.ByteString as BS
import qualified Data.ByteString.Base16 as B16
import qualified Data.ByteString.Char8 as B8
import qualified Data.Text as Text
import qualified Data.Text.Encoding as Text
import Network.HTTP.Types.URI (urlEncode)
import Nuthatch.Probe.Http
import Nuthatch.Probe.Oidc
browse
:: ProbeContext
-> Session
-> String
-> IO ProbeResponse
browse context session query =
getWith
(probeClient context)
defaultRequestOptions
{ optionCookies = Just (sessionCookies session)
, optionHeaders = [("Accept", "application/json")]
}
(probeBase context <> "/api/browse" <> query)
download
:: ProbeContext
-> Session
-> String
-> String
-> IO ProbeResponse
download context session root path =
getWith
(probeClient context)
defaultRequestOptions
{ optionCookies = Just (sessionCookies session) }
( probeBase context
<> "/api/download?root="
<> encode root
<> "&path="
<> encode path
)
upload
:: ProbeContext
-> Session
-> String
-> String
-> String
-> BS.ByteString
-> IO ProbeResponse
upload context session root path operationId body =
postWith
(probeClient context)
defaultRequestOptions
{ optionCookies = Just (sessionCookies session)
, optionHeaders =
[ ("Content-Type", "application/octet-stream")
, ("X-Declared-Size", B8.pack (show (BS.length body)))
, ("X-Content-SHA256", sha256Hex body)
, ("X-CSRF-Token", sessionCsrf session)
]
, optionBody = ByteBody body
}
( probeBase context
<> "/api/upload?root="
<> encode root
<> "&path="
<> encode path
<> "&operation_id="
<> encode operationId
)
deleteObject
:: ProbeContext
-> Session
-> String
-> String
-> String
-> IO ProbeResponse
deleteObject context session root path operationId =
postWith
(probeClient context)
defaultRequestOptions
{ optionCookies = Just (sessionCookies session)
, optionHeaders = [("Content-Type", "application/json")]
, optionBody = ByteBody . B8.pack $
"{\"root\":\""
<> root
<> "\",\"path\":\""
<> path
<> "\",\"operation_id\":\""
<> operationId
<> "\",\"csrf\":\""
<> B8.unpack (sessionCsrf session)
<> "\"}"
}
(probeBase context <> "/api/delete")
sha256Hex :: BS.ByteString -> BS.ByteString
sha256Hex input =
B16.encode (BA.convert (hash input :: Digest SHA256))
encode :: String -> String
encode = B8.unpack . urlEncode True . Text.encodeUtf8 . Text.pack