forked from TrueCloudLab/frostfs-http-gw
Fixes after review
- Maybe it could be rephrased to "attribute name prefixed with X-Attribute-" - Maybe it worth renaming to userAttributeHeaderPrefix - Requirement for having only one file uploaded at a time has to be reflected in documentation. - Maybe this should be reflected in doc - I'm not sure if missing timestamp attribute should be forced on gateway level. Normally it should be set by app and there should be a way not to set it. Signed-off-by: Evgeniy Kulikov <kim@nspcc.ru>
This commit is contained in:
parent
ace31ceefd
commit
3cbd4dbd09
5 changed files with 30 additions and 9 deletions
17
README.md
17
README.md
|
@ -1,7 +1,9 @@
|
||||||
# NeoFS HTTP Gate
|
# NeoFS HTTP Gate
|
||||||
|
|
||||||
NeoFS HTTP Gate is example of tool that provides basic interactions with NeoFS.
|
NeoFS HTTP Gate is example of tool that provides basic interactions with NeoFS.
|
||||||
You can download files from NeoFS Network using NeoFS Gate.
|
|
||||||
|
- you can download one file per request from NeoFS Network using NeoFS Gate
|
||||||
|
- you can upload one file per request into NeoFS Network using NeoFS Gate
|
||||||
|
|
||||||
## Notable make targets
|
## Notable make targets
|
||||||
|
|
||||||
|
@ -24,6 +26,11 @@ You can download files from NeoFS Network using NeoFS Gate.
|
||||||
|
|
||||||
```go get -u github.com/nspcc-dev/neofs-http-gate```
|
```go get -u github.com/nspcc-dev/neofs-http-gate```
|
||||||
|
|
||||||
|
## File uploading behaviors
|
||||||
|
|
||||||
|
- you can upload on file per request
|
||||||
|
- if `FileName` not provided by Header attributes, multipart/form filename will be used instead
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
```
|
```
|
||||||
|
@ -64,6 +71,8 @@ of Timeout and if no activity is seen even after that the connection is closed
|
||||||
HTTP_GW_KEEPALIVE_PERMIT_WITHOUT_STREAM=Bool - if true, client sends keepalive pings even with no active RPCs.
|
HTTP_GW_KEEPALIVE_PERMIT_WITHOUT_STREAM=Bool - if true, client sends keepalive pings even with no active RPCs.
|
||||||
If false, when there are no active RPCs, Time and Timeout will be ignored and no keepalive pings will be sent.
|
If false, when there are no active RPCs, Time and Timeout will be ignored and no keepalive pings will be sent.
|
||||||
|
|
||||||
|
HTTP_GW_UPLOAD_HEADER_USE_DEFAULT_TIMESTAMP=bool - enable/disable adding current timestamp attribute when object uploads
|
||||||
|
|
||||||
Peers preset:
|
Peers preset:
|
||||||
|
|
||||||
HTTP_GW_PEERS_[N]_ADDRESS = string
|
HTTP_GW_PEERS_[N]_ADDRESS = string
|
||||||
|
@ -71,6 +80,10 @@ HTTP_GW_PEERS_[N]_WEIGHT = 0..1 (float)
|
||||||
|
|
||||||
Upload Header Table:
|
Upload Header Table:
|
||||||
|
|
||||||
HTTP_GW_UPLOADER_HEADER_[N]_KEY = string - HTTP Header attribute name (except `X-Attribute-`)
|
HTTP_GW_UPLOADER_HEADER_[N]_KEY = string - HTTP Header attribute name prefixed with `X-Attribute-`
|
||||||
HTTP_GW_UPLOADER_HEADER_[N]_VAL = string - NeoFS Object attribute mapping
|
HTTP_GW_UPLOADER_HEADER_[N]_VAL = string - NeoFS Object attribute mapping
|
||||||
|
|
||||||
|
# By default we had next headers:
|
||||||
|
- FileName - to set object filename attribute
|
||||||
|
- Timestamp - to set object timestamp attribute
|
||||||
```
|
```
|
4
app.go
4
app.go
|
@ -33,6 +33,8 @@ type (
|
||||||
|
|
||||||
jobDone chan struct{}
|
jobDone chan struct{}
|
||||||
webDone chan struct{}
|
webDone chan struct{}
|
||||||
|
|
||||||
|
enableDefaultTimestamp bool
|
||||||
}
|
}
|
||||||
|
|
||||||
App interface {
|
App interface {
|
||||||
|
@ -78,6 +80,8 @@ func newApp(ctx context.Context, opt ...Option) App {
|
||||||
|
|
||||||
a.hdr = newHeaderFilter(a.log, a.cfg)
|
a.hdr = newHeaderFilter(a.log, a.cfg)
|
||||||
|
|
||||||
|
a.enableDefaultTimestamp = a.cfg.GetBool(cfgUploaderHeaderEnableDefaultTimestamp)
|
||||||
|
|
||||||
a.wlog = logger.GRPC(a.log)
|
a.wlog = logger.GRPC(a.log)
|
||||||
|
|
||||||
if a.cfg.GetBool(cmdVerbose) {
|
if a.cfg.GetBool(cmdVerbose) {
|
||||||
|
|
|
@ -22,7 +22,7 @@ type (
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
const userAttributeHeader = "X-Attribute-"
|
const userAttributeHeaderPrefix = "X-Attribute-"
|
||||||
|
|
||||||
func newHeaderFilter(l *zap.Logger, v *viper.Viper) HeaderFilter {
|
func newHeaderFilter(l *zap.Logger, v *viper.Viper) HeaderFilter {
|
||||||
filter := &headerFilter{
|
filter := &headerFilter{
|
||||||
|
@ -58,7 +58,7 @@ func newHeaderFilter(l *zap.Logger, v *viper.Viper) HeaderFilter {
|
||||||
|
|
||||||
func (h *headerFilter) Filter(header *fasthttp.RequestHeader) map[string]string {
|
func (h *headerFilter) Filter(header *fasthttp.RequestHeader) map[string]string {
|
||||||
result := make(map[string]string)
|
result := make(map[string]string)
|
||||||
prefix := []byte(userAttributeHeader)
|
prefix := []byte(userAttributeHeaderPrefix)
|
||||||
|
|
||||||
header.VisitAll(func(key, val []byte) {
|
header.VisitAll(func(key, val []byte) {
|
||||||
if len(key) == 0 || len(val) == 0 {
|
if len(key) == 0 || len(val) == 0 {
|
||||||
|
|
10
settings.go
10
settings.go
|
@ -54,9 +54,10 @@ const (
|
||||||
cfgLoggerSamplingThereafter = "logger.sampling.thereafter"
|
cfgLoggerSamplingThereafter = "logger.sampling.thereafter"
|
||||||
|
|
||||||
// Uploader Header
|
// Uploader Header
|
||||||
cfgUploaderHeader = "uploader_header"
|
cfgUploaderHeader = "uploader_header"
|
||||||
cfgUploaderHeaderKey = "key"
|
cfgUploaderHeaderKey = "key"
|
||||||
cfgUploaderHeaderVal = "val"
|
cfgUploaderHeaderVal = "val"
|
||||||
|
cfgUploaderHeaderEnableDefaultTimestamp = "upload_header.use_default_timestamp"
|
||||||
|
|
||||||
// Peers
|
// Peers
|
||||||
cfgPeers = "peers"
|
cfgPeers = "peers"
|
||||||
|
@ -144,6 +145,9 @@ func settings() *viper.Viper {
|
||||||
v.SetDefault(cfgWebWriteTimeout, time.Minute)
|
v.SetDefault(cfgWebWriteTimeout, time.Minute)
|
||||||
v.SetDefault(cfgWebConnectionPerHost, 10)
|
v.SetDefault(cfgWebConnectionPerHost, 10)
|
||||||
|
|
||||||
|
// upload header
|
||||||
|
v.SetDefault(cfgUploaderHeaderEnableDefaultTimestamp, false)
|
||||||
|
|
||||||
if err := v.BindPFlags(flags); err != nil {
|
if err := v.BindPFlags(flags); err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -124,8 +124,8 @@ func (a *app) upload(c *fasthttp.RequestCtx) {
|
||||||
attributes = append(attributes, filename)
|
attributes = append(attributes, filename)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Attribute Timestamp wasn't set from header
|
// Attribute Timestamp wasn't set from header and enabled by settings
|
||||||
if _, ok := filtered[object.AttributeTimestamp]; ok {
|
if _, ok := filtered[object.AttributeTimestamp]; ok && a.enableDefaultTimestamp {
|
||||||
timestamp := object.NewAttribute()
|
timestamp := object.NewAttribute()
|
||||||
timestamp.SetKey(object.AttributeTimestamp)
|
timestamp.SetKey(object.AttributeTimestamp)
|
||||||
timestamp.SetValue(strconv.FormatInt(time.Now().Unix(), 10))
|
timestamp.SetValue(strconv.FormatInt(time.Now().Unix(), 10))
|
||||||
|
|
Loading…
Reference in a new issue