Skip to content

Commit 20477ae

Browse files
committed
Fix superfluous response.WriteHeader bug when ErrorFunc was being called
1 parent 7bbf77e commit 20477ae

File tree

1 file changed

+21
-6
lines changed

1 file changed

+21
-6
lines changed

session.go

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -162,26 +162,31 @@ func (s *SessionManager) LoadAndSave(next http.Handler) http.Handler {
162162
next.ServeHTTP(sw, sr)
163163

164164
if !sw.written {
165-
s.commitAndAddSessionCookie(w, sr)
165+
err := s.commitAndAddSessionCookie(sw.ResponseWriter, sw.request)
166+
if err != nil {
167+
s.ErrorFunc(sw.ResponseWriter, sw.request, err)
168+
return
169+
}
166170
}
167171
})
168172
}
169173

170-
func (s *SessionManager) commitAndAddSessionCookie(w http.ResponseWriter, r *http.Request) {
174+
func (s *SessionManager) commitAndAddSessionCookie(w http.ResponseWriter, r *http.Request) error {
171175
ctx := r.Context()
172176

173177
switch s.Status(ctx) {
174178
case Modified:
175179
token, expiry, err := s.Commit(ctx)
176180
if err != nil {
177-
s.ErrorFunc(w, r, err)
178-
return
181+
return err
179182
}
180183

181184
s.AddSessionCookie(ctx, w, token, expiry)
182185
case Destroyed:
183186
s.AddSessionCookie(ctx, w, "", time.Time{})
184187
}
188+
189+
return nil
185190
}
186191

187192
// Deprecated: WriteSessionCookie is a backwards-compatible alias for
@@ -238,17 +243,27 @@ type sessionResponseWriter struct {
238243

239244
func (sw *sessionResponseWriter) Write(b []byte) (int, error) {
240245
if !sw.written {
241-
sw.sessionManager.commitAndAddSessionCookie(sw.ResponseWriter, sw.request)
242246
sw.written = true
247+
248+
err := sw.sessionManager.commitAndAddSessionCookie(sw.ResponseWriter, sw.request)
249+
if err != nil {
250+
sw.sessionManager.ErrorFunc(sw.ResponseWriter, sw.request, err)
251+
return 0, nil
252+
}
243253
}
244254

245255
return sw.ResponseWriter.Write(b)
246256
}
247257

248258
func (sw *sessionResponseWriter) WriteHeader(code int) {
249259
if !sw.written {
250-
sw.sessionManager.commitAndAddSessionCookie(sw.ResponseWriter, sw.request)
251260
sw.written = true
261+
262+
err := sw.sessionManager.commitAndAddSessionCookie(sw.ResponseWriter, sw.request)
263+
if err != nil {
264+
sw.sessionManager.ErrorFunc(sw.ResponseWriter, sw.request, err)
265+
return
266+
}
252267
}
253268

254269
sw.ResponseWriter.WriteHeader(code)

0 commit comments

Comments
 (0)