getSession retrieves a session based on the context. Parameters: - c: The Fiber context. Returns: - *Session: The session object. - error: An error if the session retrieval fails. Usage: sess, err := store.getSession(c) if err != nil { // handle error }
(c fiber.Ctx)
| 123 | // // handle error |
| 124 | // } |
| 125 | func (s *Store) getSession(c fiber.Ctx) (*Session, error) { |
| 126 | var rawData []byte |
| 127 | var err error |
| 128 | |
| 129 | id, ok := c.Locals(sessionIDContextKey).(string) |
| 130 | if !ok { |
| 131 | id = s.getSessionID(c) |
| 132 | } |
| 133 | |
| 134 | selectedExtractor, hasExtractor := c.Locals(sessionExtractorContextKey).(extractors.Extractor) |
| 135 | if !hasExtractor { |
| 136 | selectedExtractor = extractors.Extractor{} |
| 137 | } |
| 138 | |
| 139 | isFresh := false // Session is not fresh initially; only set to true if we generate a new ID |
| 140 | |
| 141 | // Attempt to fetch session data if an ID is provided |
| 142 | if id != "" { |
| 143 | rawData, err = s.Storage.GetWithContext(c, id) |
| 144 | if err != nil { |
| 145 | return nil, err |
| 146 | } |
| 147 | if rawData == nil { |
| 148 | // Data not found, prepare to generate a new session |
| 149 | id = "" |
| 150 | } |
| 151 | } |
| 152 | |
| 153 | // Generate a new ID if needed |
| 154 | if id == "" { |
| 155 | isFresh = true // The session is fresh if a new ID is generated |
| 156 | id = s.KeyGenerator() |
| 157 | c.Locals(sessionIDContextKey, id) |
| 158 | } |
| 159 | |
| 160 | // Create session object |
| 161 | sess := acquireSession() |
| 162 | |
| 163 | sess.mu.Lock() |
| 164 | |
| 165 | sess.ctx = c |
| 166 | sess.config = s |
| 167 | sess.id = id |
| 168 | sess.isFresh = isFresh |
| 169 | sess.extractor = selectedExtractor |
| 170 | |
| 171 | // Decode session data if found |
| 172 | if rawData != nil { |
| 173 | sess.data.Lock() |
| 174 | err := sess.decodeSessionData(rawData) |
| 175 | sess.data.Unlock() |
| 176 | if err != nil { |
| 177 | sess.mu.Unlock() |
| 178 | sess.Release() |
| 179 | return nil, fmt.Errorf("failed to decode session data: %w", err) |
| 180 | } |
| 181 | } |
| 182 |