Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 1 addition & 5 deletions ctx_interface_gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

24 changes: 19 additions & 5 deletions middleware/cache/cache.go
Original file line number Diff line number Diff line change
Expand Up @@ -160,8 +160,10 @@ func New(config ...Config) fiber.Handler {
mux.Unlock()
return fmt.Errorf("cache: failed to delete expired key %q: %w", key, err)
}
idx := e.heapidx
manager.release(e)
if cfg.MaxBytes > 0 {
_, size := heap.remove(e.heapidx)
_, size := heap.remove(idx)
storedBytes -= size
}
} else if e.exp != 0 && !hasRequestDirective(c, noCache) {
Expand Down Expand Up @@ -302,27 +304,39 @@ func New(config ...Config) fiber.Handler {
e.ttl = uint64(expiration.Seconds())

// Store entry in heap
var heapIdx int
if cfg.MaxBytes > 0 {
e.heapidx = heap.put(key, e.exp, bodySize)
heapIdx = heap.put(key, e.exp, bodySize)
e.heapidx = heapIdx
storedBytes += bodySize
}

cleanupOnStoreError := func(release bool) {
if cfg.MaxBytes > 0 {
_, size := heap.remove(heapIdx)
storedBytes -= size
}
if release {
manager.release(e)
}
}

// For external Storage we store raw body separated
if cfg.Storage != nil {
if err := manager.setRaw(c, key+"_body", e.body, expiration); err != nil {
manager.release(e)
cleanupOnStoreError(true)
return err
}
// avoid body msgp encoding
e.body = nil
if err := manager.set(c, key, e, expiration); err != nil {
manager.release(e)
cleanupOnStoreError(false)
return err
}
manager.release(e)
} else {
Comment thread
gaby marked this conversation as resolved.
Comment thread
coderabbitai[bot] marked this conversation as resolved.
// Store entry in memory
if err := manager.set(c, key, e, expiration); err != nil {
cleanupOnStoreError(true)
return err
}
Comment thread
gaby marked this conversation as resolved.
}
Expand Down
13 changes: 8 additions & 5 deletions middleware/csrf/storage_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,10 @@ import (
//go:generate msgp -o=storage_manager_msgp.go -tests=true -unexported
type item struct{}

const redactedKey = "[redacted]"

//msgp:ignore manager
//msgp:ignore storageManager
type storageManager struct {
pool sync.Pool `msg:"-"` //nolint:revive // Ignore unexported type
memory *memory.Storage `msg:"-"` //nolint:revive // Ignore unexported type
Expand Down Expand Up @@ -47,15 +50,15 @@ func (m *storageManager) getRaw(ctx context.Context, key string) ([]byte, error)
if m.storage != nil {
raw, err := m.storage.GetWithContext(ctx, key)
if err != nil {
return nil, fmt.Errorf("csrf: failed to get key %q from storage: %w", key, err)
return nil, fmt.Errorf("csrf: failed to get value from storage: %w", err)
}
return raw, nil
}

if value := m.memory.Get(key); value != nil {
raw, ok := value.([]byte)
if !ok {
return nil, fmt.Errorf("csrf: unexpected value type %T for key %q", value, key)
return nil, fmt.Errorf("csrf: unexpected value type %T in storage", value)
}
return raw, nil
}
Expand All @@ -67,21 +70,21 @@ func (m *storageManager) getRaw(ctx context.Context, key string) ([]byte, error)
func (m *storageManager) setRaw(ctx context.Context, key string, raw []byte, exp time.Duration) error {
if m.storage != nil {
if err := m.storage.SetWithContext(ctx, key, raw, exp); err != nil {
return fmt.Errorf("csrf: failed to store key %q: %w", key, err)
return fmt.Errorf("csrf: failed to store key %s: %w", redactedKey, err)
}
return nil
}

// the key is crucial in crsf and sometimes a reference to another value which can be reused later(pool/unsafe values concept), so a copy is made here
Comment thread
gaby marked this conversation as resolved.
Outdated
m.memory.Set(utils.CopyString(key), raw, exp)
m.memory.Set(utils.CopyString(key), utils.CopyBytes(raw), exp)
Comment thread
gaby marked this conversation as resolved.
return nil
}

// delete data from storage or memory
func (m *storageManager) delRaw(ctx context.Context, key string) error {
if m.storage != nil {
if err := m.storage.DeleteWithContext(ctx, key); err != nil {
return fmt.Errorf("csrf: failed to delete key %q: %w", key, err)
return fmt.Errorf("csrf: failed to delete key %s: %w", redactedKey, err)
}
return nil
}
Expand Down
85 changes: 0 additions & 85 deletions middleware/csrf/storage_manager_msgp.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

113 changes: 0 additions & 113 deletions middleware/csrf/storage_manager_msgp_test.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions middleware/session/data.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
// msgp -file="data.go" -o="data_msgp.go" -tests=true -unexported
//
//go:generate msgp -o=data_msgp.go -tests=true -unexported
//msgp:ignore data
type data struct {
Data map[any]any
sync.RWMutex `msg:"-"`
Expand Down
Loading
Loading