forked from TrueCloudLab/frostfs-http-gw
[#233] get/head: Middleware refactor
Add: * search index.html * fallback by leading slash Signed-off-by: Denis Kirillov <d.kirillov@yadro.com>
This commit is contained in:
parent
ee628617a3
commit
9cb9d14146
11 changed files with 311 additions and 121 deletions
|
@ -35,6 +35,7 @@ type Config interface {
|
|||
BufferMaxSizeForPut() uint64
|
||||
NamespaceHeader() string
|
||||
EnableFilepathFallback() bool
|
||||
EnableFilepathSlashFallback() bool
|
||||
FormContainerZone(string) string
|
||||
CORS() *data.CORSRule
|
||||
}
|
||||
|
@ -216,11 +217,11 @@ func (h *Handler) byNativeAddress(ctx context.Context, req *fasthttp.RequestCtx,
|
|||
|
||||
// byS3Path is a wrapper for function (e.g. request.headObject, request.receiveFile) that
|
||||
// resolves object address from S3-like path <bucket name>/<object key>.
|
||||
func (h *Handler) byS3Path(ctx context.Context, req *fasthttp.RequestCtx, cnrID cid.ID, path string, handler func(context.Context, *fasthttp.RequestCtx, oid.Address)) {
|
||||
func (h *Handler) byS3Path(ctx context.Context, req *fasthttp.RequestCtx, bktInfo *data.BucketInfo, path string, handler func(context.Context, *fasthttp.RequestCtx, oid.Address)) {
|
||||
ctx, span := tracing.StartSpanFromContext(ctx, "handler.byS3Path")
|
||||
defer span.End()
|
||||
|
||||
foundOID, err := h.tree.GetLatestVersion(ctx, &cnrID, path)
|
||||
foundOID, err := h.tree.GetLatestVersion(ctx, &bktInfo.CID, path)
|
||||
if err != nil {
|
||||
h.logAndSendError(ctx, req, logs.FailedToGetLatestVersionOfObject, err, zap.String("path", path))
|
||||
return
|
||||
|
@ -230,7 +231,7 @@ func (h *Handler) byS3Path(ctx context.Context, req *fasthttp.RequestCtx, cnrID
|
|||
return
|
||||
}
|
||||
|
||||
addr := newAddress(cnrID, foundOID.OID)
|
||||
addr := newAddress(bktInfo.CID, foundOID.OID)
|
||||
handler(ctx, req, addr)
|
||||
}
|
||||
|
||||
|
@ -418,37 +419,31 @@ func (h *Handler) readContainer(ctx context.Context, cnrID cid.ID) (*data.Bucket
|
|||
return bktInfo, err
|
||||
}
|
||||
|
||||
func (h *Handler) browseIndex(ctx context.Context, req *fasthttp.RequestCtx, cidParam, oidParam string, isNativeList bool) {
|
||||
ctx, span := tracing.StartSpanFromContext(ctx, "handler.browseIndex")
|
||||
defer span.End()
|
||||
type ListFunc func(ctx context.Context, bucketInfo *data.BucketInfo, prefix string) (*GetObjectsResponse, error)
|
||||
|
||||
if !h.config.IndexPageEnabled() {
|
||||
req.SetStatusCode(fasthttp.StatusNotFound)
|
||||
return
|
||||
func (h *Handler) browseIndexMiddleware(fn ListFunc) MiddlewareFunc {
|
||||
return func(prm MiddlewareParam) bool {
|
||||
ctx, span := tracing.StartSpanFromContext(prm.Context, "handler.browseIndex")
|
||||
defer span.End()
|
||||
|
||||
ctx = utils.SetReqLog(ctx, h.reqLogger(ctx).With(
|
||||
zap.String("bucket", prm.BktInfo.Name),
|
||||
zap.String("container", prm.BktInfo.CID.EncodeToString()),
|
||||
zap.String("prefix", prm.Path),
|
||||
))
|
||||
|
||||
objects, err := fn(ctx, prm.BktInfo, prm.Path)
|
||||
if err != nil {
|
||||
h.logAndSendError(ctx, prm.Request, logs.FailedToListObjects, err)
|
||||
return false
|
||||
}
|
||||
|
||||
h.browseObjects(ctx, prm.Request, browseParams{
|
||||
bucketInfo: prm.BktInfo,
|
||||
prefix: prm.Path,
|
||||
objects: objects,
|
||||
})
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
unescapedKey, err := url.QueryUnescape(oidParam)
|
||||
if err != nil {
|
||||
h.logAndSendError(ctx, req, logs.FailedToUnescapeOIDParam, err)
|
||||
return
|
||||
}
|
||||
|
||||
bktInfo, err := h.getBucketInfo(ctx, cidParam)
|
||||
if err != nil {
|
||||
h.logAndSendError(ctx, req, logs.FailedToGetBucketInfo, err)
|
||||
return
|
||||
}
|
||||
|
||||
listFunc := h.getDirObjectsS3
|
||||
if isNativeList {
|
||||
// tree probe failed, trying to use native
|
||||
listFunc = h.getDirObjectsNative
|
||||
}
|
||||
|
||||
h.browseObjects(ctx, req, browseParams{
|
||||
bucketInfo: bktInfo,
|
||||
prefix: unescapedKey,
|
||||
listObjects: listFunc,
|
||||
isNative: isNativeList,
|
||||
})
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue