{"record":{"id":"4484f007876b2f63","repo":"gofiber/fiber","slug":"failed-to-encode-session-data-w","errorCode":null,"errorMessage":"failed to encode session data: %w","messagePattern":"failed to encode session data: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"middleware/session/session.go","lineNumber":610,"sourceCode":"\n// encodeSessionData encodes session data to raw bytes\n//\n// Parameters:\n//   - rawData: The raw byte data to encode.\n//\n// Returns:\n//   - error: An error if the encoding fails.\n//\n// Usage:\n//\n//\terr := s.encodeSessionData(rawData)\nfunc (s *Session) encodeSessionData() ([]byte, error) {\n\tbyteBuffer := byteBufferPool.Get().(*bytes.Buffer) //nolint:forcetypeassert,errcheck // We store nothing else in the pool\n\tdefer byteBufferPool.Put(byteBuffer)\n\tdefer byteBuffer.Reset()\n\tencCache := gob.NewEncoder(byteBuffer)\n\tif err := encCache.Encode(&s.data.Data); err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to encode session data: %w\", err)\n\t}\n\t// Copy the bytes\n\t// Copy the data in buffer\n\tencodedBytes := make([]byte, byteBuffer.Len())\n\tcopy(encodedBytes, byteBuffer.Bytes())\n\n\treturn encodedBytes, nil\n}\n\n// absExpiration returns the session absolute expiration time or a zero time if not set.\n//\n// Returns:\n//   - time.Time: The session absolute expiration time. Zero time if not set.\n//\n// Usage:\n//\n//\texpiration := s.absExpiration()\nfunc (s *Session) absExpiration() time.Time {","sourceCodeStart":592,"sourceCodeEnd":628,"githubUrl":"https://github.com/gofiber/fiber/blob/a105acad6c1e4576a77f01e02973f67e962bb58d/middleware/session/session.go#L592-L628","documentation":"Thrown by the low-level encodeSessionData when gob.Encoder.Encode rejects &s.data.Data. This is the inner error that error 200 wraps; seeing it directly means encodeSessionData was called outside the save path or the wrapping was stripped. The %w is the raw gob encoder error naming the offending type or value.","triggerScenarios":"Same as 200: s.data.Data contains a value gob cannot encode — channels, funcs, complex numbers, unregistered interface concrete types, structs holding any of these, or cyclic structures.","commonSituations":"Storing custom struct types without gob.Register; storing closures; dynamic map[string]any values whose concrete types gob does not know about.","solutions":["Inspect the wrapped gob error for the offending type name.","gob.Register every custom type stored in the session, in an init().","Only store gob-encodable values (primitives, slices, maps, structs of encodable fields)."],"exampleFix":"// before\nsess.Set(\"payload\", MyStruct{Cb: func(){}})\n// encodeSessionData -> failed to encode session data: gob: unsupported type\n\n// after\nfunc init() { gob.Register(MyStruct{}) }\n// and remove non-encodable fields (func/chan) from the stored type","handlingStrategy":"validation","validationCode":"func registerSessionTypes() {\n    gob.Register(MyStruct{})\n    gob.Register(&MyStruct{})\n}\nfunc encodableKindTest(v any) error {\n    if v == nil { return nil }\n    if k := reflect.TypeOf(v).Kind(); k == reflect.Chan || k == reflect.Func ||\n        k == reflect.Complex64 || k == reflect.Complex128 {\n        return fmt.Errorf(\"unsupported kind %s\", k)\n    }\n    return nil\n}","typeGuard":"func isGobSafe(v any) bool {\n    if v == nil { return true }\n    switch reflect.TypeOf(v).Kind() {\n    case reflect.Chan, reflect.Func, reflect.Complex64, reflect.Complex128:\n        return false\n    }\n    return true\n}","tryCatchPattern":"if _, err := sess.encodeSessionDataProbe(); err != nil {\n    log.Printf(\"encode failed, dropping offending keys: %v\", err)\n}","preventionTips":["gob.Register all custom stored types at init.","Screen every Set() value through a gob-safe type guard in a wrapper.","Write a round-trip test (encode then decode) for every type stored in sessions.","Avoid map[string]any with unregistered concrete types."],"tags":["session","serialization","gob","encoding"],"backgroundTag":null,"analyzedSha":"a105acad6c1e4576a77f01e02973f67e962bb58d","analyzedAt":"2026-08-11T17:33:26.942Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}