package main import ( "bytes" "github.com/valyala/fasthttp" "go.uber.org/zap" ) const ( userAttributeHeaderPrefix = "X-Attribute-" neofsAttributeHeaderPrefix = "NEOFS-" systemAttributePrefix = "__NEOFS__" ) func systemTranslator(key []byte) []byte { // replace `NEOFS-` with `__NEOFS__` key = bytes.Replace(key, []byte(neofsAttributeHeaderPrefix), []byte(systemAttributePrefix), 1) // replace `-` with `_` key = bytes.ReplaceAll(key, []byte("-"), []byte("_")) // replace with uppercase return bytes.ToUpper(key) } func filterHeaders(l *zap.Logger, header *fasthttp.RequestHeader) map[string]string { result := make(map[string]string) prefix := []byte(userAttributeHeaderPrefix) system := []byte(neofsAttributeHeaderPrefix) header.VisitAll(func(key, val []byte) { // checks that key and val not empty if len(key) == 0 || len(val) == 0 { return } // checks that key has attribute prefix if !bytes.HasPrefix(key, prefix) { return } // removing attribute prefix key = bytes.TrimPrefix(key, prefix) // checks that it's a system NeoFS header if bytes.HasPrefix(key, system) { key = systemTranslator(key) } // checks that attribute key not empty if len(key) == 0 { return } // make string representation of key / val k, v := string(key), string(val) result[k] = v l.Debug("add attribute to result object", zap.String("key", k), zap.String("val", v)) }) return result }