- Add full examples for presignedGetObjectUrl and presignedPutObjectUrl - Lower-case `*URL` API functions to `*Url` to adopt a Haskell naming convention Finishes and fixes #35, #36 and #37.
190 lines
5.4 KiB
Haskell
190 lines
5.4 KiB
Haskell
--
|
|
-- Minio Haskell SDK, (C) 2017 Minio, Inc.
|
|
--
|
|
-- Licensed under the Apache License, Version 2.0 (the "License");
|
|
-- you may not use this file except in compliance with the License.
|
|
-- You may obtain a copy of the License at
|
|
--
|
|
-- http://www.apache.org/licenses/LICENSE-2.0
|
|
--
|
|
-- Unless required by applicable law or agreed to in writing, software
|
|
-- distributed under the License is distributed on an "AS IS" BASIS,
|
|
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
-- See the License for the specific language governing permissions and
|
|
-- limitations under the License.
|
|
--
|
|
|
|
|
|
|
|
module Network.Minio
|
|
(
|
|
|
|
ConnectInfo(..)
|
|
, awsCI
|
|
|
|
|
|
, awsWithRegionCI
|
|
, minioPlayCI
|
|
, minioCI
|
|
|
|
, Minio
|
|
, runMinio
|
|
, def
|
|
|
|
-- * Error handling
|
|
-----------------------
|
|
-- | Data types representing various errors that may occur while working
|
|
-- with an object storage service.
|
|
, MinioErr(..)
|
|
, MErrV(..)
|
|
, ServiceErr(..)
|
|
|
|
-- * Data Types
|
|
----------------
|
|
-- | Data types representing various object store concepts.
|
|
, Bucket
|
|
, Object
|
|
, BucketInfo(..)
|
|
, ObjectInfo(..)
|
|
, UploadInfo(..)
|
|
, ObjectPartInfo(..)
|
|
, UploadId
|
|
, ObjectData(..)
|
|
, CopyPartSource(..)
|
|
|
|
-- * Bucket Operations
|
|
----------------------
|
|
, listBuckets
|
|
, getLocation
|
|
, bucketExists
|
|
, makeBucket
|
|
, removeBucket
|
|
|
|
, listObjects
|
|
, listObjectsV1
|
|
, listIncompleteUploads
|
|
|
|
-- * Object Operations
|
|
----------------------
|
|
, fGetObject
|
|
, fPutObject
|
|
, putObject
|
|
, copyObject
|
|
, removeObject
|
|
|
|
, getObject
|
|
, statObject
|
|
, removeIncompleteUpload
|
|
|
|
-- * Presigned Operations
|
|
-------------------------
|
|
, UrlExpiry
|
|
, presignedPutObjectUrl
|
|
, presignedGetObjectUrl
|
|
, presignedHeadObjectUrl
|
|
|
|
, PostPolicyCondition
|
|
, ppCondBucket
|
|
, ppCondContentLengthRange
|
|
, ppCondContentType
|
|
, ppCondKey
|
|
, ppCondKeyStartsWith
|
|
, ppCondSuccessActionStatus
|
|
|
|
, PostPolicy
|
|
, PostPolicyError(..)
|
|
, newPostPolicy
|
|
, presignedPostPolicy
|
|
, showPostPolicy
|
|
) where
|
|
|
|
{-
|
|
This module exports the high-level Minio API for object storage.
|
|
-}
|
|
|
|
import qualified Data.Conduit as C
|
|
import qualified Data.Conduit.Binary as CB
|
|
import qualified Data.Conduit.Combinators as CC
|
|
import Data.Default (def)
|
|
import qualified Data.Map as Map
|
|
|
|
import Lib.Prelude
|
|
|
|
import Network.Minio.Data
|
|
import Network.Minio.Errors
|
|
import Network.Minio.ListOps
|
|
import Network.Minio.PutObject
|
|
import Network.Minio.S3API
|
|
|
|
-- | Lists buckets.
|
|
listBuckets :: Minio [BucketInfo]
|
|
listBuckets = getService
|
|
|
|
-- | Fetch the object and write it to the given file safely. The
|
|
-- object is first written to a temporary file in the same directory
|
|
-- and then moved to the given path.
|
|
fGetObject :: Bucket -> Object -> FilePath -> Minio ()
|
|
fGetObject bucket object fp = do
|
|
src <- getObject bucket object
|
|
src C.$$+- CB.sinkFileCautious fp
|
|
|
|
-- | Upload the given file to the given object.
|
|
fPutObject :: Bucket -> Object -> FilePath -> Minio ()
|
|
fPutObject bucket object f = void $ putObjectInternal bucket object $
|
|
ODFile f Nothing
|
|
|
|
-- | Put an object from a conduit source. The size can be provided if
|
|
-- known; this helps the library select optimal part sizes to perform
|
|
-- a multipart upload. If not specified, it is assumed that the object
|
|
-- can be potentially 5TiB and selects multipart sizes appropriately.
|
|
putObject :: Bucket -> Object -> C.Producer Minio ByteString
|
|
-> Maybe Int64 -> Minio ()
|
|
putObject bucket object src sizeMay =
|
|
void $ putObjectInternal bucket object $ ODStream src sizeMay
|
|
|
|
-- | Perform a server-side copy operation to create an object with the
|
|
-- given bucket and object name from the source specification in
|
|
-- CopyPartSource. This function performs a multipart copy operation
|
|
-- if the new object is to be greater than 5GiB in size.
|
|
copyObject :: Bucket -> Object -> CopyPartSource -> Minio ()
|
|
copyObject bucket object cps = void $ copyObjectInternal bucket object cps
|
|
|
|
-- | Remove an object from the object store.
|
|
removeObject :: Bucket -> Object -> Minio ()
|
|
removeObject = deleteObject
|
|
|
|
-- | Get an object from the object store as a resumable source (conduit).
|
|
getObject :: Bucket -> Object -> Minio (C.ResumableSource Minio ByteString)
|
|
getObject bucket object = snd <$> getObject' bucket object [] []
|
|
|
|
-- | Get an object's metadata from the object store.
|
|
statObject :: Bucket -> Object -> Minio ObjectInfo
|
|
statObject = headObject
|
|
|
|
-- | Creates a new bucket in the object store. The Region can be
|
|
-- optionally specified. If not specified, it will use the region
|
|
-- configured in ConnectInfo, which is by default, the US Standard
|
|
-- Region.
|
|
makeBucket :: Bucket -> Maybe Region -> Minio ()
|
|
makeBucket bucket regionMay = do
|
|
region <- maybe (asks $ connectRegion . mcConnInfo) return regionMay
|
|
putBucket bucket region
|
|
modify (Map.insert bucket region)
|
|
|
|
-- | Removes a bucket from the object store.
|
|
removeBucket :: Bucket -> Minio ()
|
|
removeBucket bucket = do
|
|
deleteBucket bucket
|
|
modify (Map.delete bucket)
|
|
|
|
-- | Query the object store if a given bucket is present.
|
|
bucketExists :: Bucket -> Minio Bool
|
|
bucketExists = headBucket
|
|
|
|
|
|
-- | Removes an ongoing multipart upload of an object.
|
|
removeIncompleteUpload :: Bucket -> Object -> Minio ()
|
|
removeIncompleteUpload bucket object = do
|
|
uploads <- listIncompleteUploads bucket (Just object) False C.$$ CC.sinkList
|
|
mapM_ (abortMultipartUpload bucket object) (uiUploadId <$> uploads)
|