{"record":{"id":"24abc2613af04f28","repo":"gofiber/fiber","slug":"cache-unexpected-raw-entry-type-t-for-key-q","errorCode":null,"errorMessage":"cache: unexpected raw entry type %T for key %q","messagePattern":"cache: unexpected raw entry type %T for key %q","errorType":"http","errorClass":null,"httpStatus":500,"severity":"error","filePath":"middleware/cache/manager.go","lineNumber":156,"sourceCode":"}\n\n// get raw data from storage or memory\nfunc (m *manager) getRaw(ctx context.Context, key string) ([]byte, error) {\n\tif m.storage != nil {\n\t\traw, err := m.storage.GetWithContext(ctx, key)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"cache: failed to get raw key %q from storage: %w\", m.logKey(key), err)\n\t\t}\n\t\tif raw == nil {\n\t\t\treturn nil, errCacheMiss\n\t\t}\n\t\treturn raw, nil\n\t}\n\n\tif value := m.memory.Get(key); value != nil {\n\t\traw, ok := value.([]byte)\n\t\tif !ok {\n\t\t\treturn nil, fmt.Errorf(\"cache: unexpected raw entry type %T for key %q\", value, m.logKey(key))\n\t\t}\n\t\treturn raw, nil\n\t}\n\n\treturn nil, errCacheMiss\n}\n\n// set data to storage or memory\nfunc (m *manager) set(ctx context.Context, key string, it *item, exp time.Duration) error {\n\tif m.storage != nil {\n\t\traw, err := it.MarshalMsg(nil)\n\t\tif err != nil {\n\t\t\tm.release(it)\n\t\t\treturn fmt.Errorf(\"cache: failed to marshal key %q: %w\", m.logKey(key), err)\n\t\t}\n\t\tif err := m.storage.SetWithContext(ctx, key, raw, exp); err != nil {\n\t\t\tm.release(it)\n\t\t\treturn fmt.Errorf(\"cache: failed to store key %q: %w\", m.logKey(key), err)","sourceCodeStart":138,"sourceCodeEnd":174,"githubUrl":"https://github.com/gofiber/fiber/blob/a105acad6c1e4576a77f01e02973f67e962bb58d/middleware/cache/manager.go#L138-L174","documentation":"Returned by the in-memory branch of manager.getRaw when memory.Get returns a value that is not []byte. Like 143, this is an invariant violation: setRaw only stores []byte into memory, so a non-[]byte value indicates shared memory, aliasing, or a bug.","triggerScenarios":"In-memory mode (cfg.Storage nil) where memory.Get(rawKey) returns a value whose type assertion to []byte fails. Requires external interference with the memory store or a bug in the cache.","commonSituations":"Not reachable in correct usage. Theoretically possible with a globally shared memory.Storage, manual seeding in tests, or memory corruption. Treat as a defect signal.","solutions":["Ensure the cache's memory.Storage is not shared with other writers of non-[]byte values.","Give each cache middleware instance its own memory store; do not share across apps.","Audit test fixtures that populate memory.Storage directly.","File a bug if reproduced in isolation."],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":null,"typeGuard":"func assertRawStored(s *memory.Storage, key string) error {\n    v := s.Get(key)\n    if v == nil {\n        return nil\n    }\n    if _, ok := v.([]byte); !ok {\n        return fmt.Errorf(\"unexpected type %T stored under raw cache key\", v)\n    }\n    return nil\n}","tryCatchPattern":"if value := m.memory.Get(key); value != nil {\n    raw, ok := value.([]byte)\n    if !ok {\n        log.Error(\"raw-body memory type violation:\", fmt.Sprintf(\"%T\", value))\n        m.memory.Delete(key)\n        return nil, errCacheMiss\n    }\n    return raw, nil\n}","preventionTips":["Do not share the cache's memory.Storage with other writers.","One cache middleware instance per app.","Keep test fixtures type-consistent with what setRaw writes."],"tags":["cache","type-assertion","memory","invariant","go","fiber"],"backgroundTag":null,"analyzedSha":"a105acad6c1e4576a77f01e02973f67e962bb58d","analyzedAt":"2026-08-11T17:33:26.942Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}