Browse Source

webdav: set headers *before* calling w.WriteHeader.

http://golang.org/pkg/net/http/#ResponseWriter says that "Changing the
header after a call to WriteHeader (or Write) has no effect."

Change-Id: Ica749e1475a93d535adb1300bc599d5cfe49a94f
Reviewed-on: https://go-review.googlesource.com/3689
Reviewed-by: Nick Cooper <nmvc@google.com>
Reviewed-by: Nigel Tao <nigeltao@golang.org>
Nigel Tao 11 years ago
parent
commit
5feaa29a7b
2 changed files with 9 additions and 3 deletions
  1. 8 2
      webdav/webdav.go
  2. 1 1
      webdav/xml.go

+ 8 - 2
webdav/webdav.go

@@ -289,7 +289,7 @@ func (h *Handler) handleLock(w http.ResponseWriter, r *http.Request) (retStatus
 		return status, err
 	}
 
-	token, ld, now := "", LockDetails{}, time.Now()
+	token, ld, now, created := "", LockDetails{}, time.Now(), false
 	if li == (lockInfo{}) {
 		// An empty lockInfo means to refresh the lock.
 		ih, ok := parseIfHeader(r.Header.Get("If"))
@@ -349,7 +349,7 @@ func (h *Handler) handleLock(w http.ResponseWriter, r *http.Request) (retStatus
 				return http.StatusInternalServerError, err
 			}
 			f.Close()
-			w.WriteHeader(http.StatusCreated)
+			created = true
 		}
 
 		// http://www.webdav.org/specs/rfc4918.html#HEADER_Lock-Token says that the
@@ -358,6 +358,12 @@ func (h *Handler) handleLock(w http.ResponseWriter, r *http.Request) (retStatus
 	}
 
 	w.Header().Set("Content-Type", "application/xml; charset=utf-8")
+	if created {
+		// This is "w.WriteHeader(http.StatusCreated)" and not "return
+		// http.StatusCreated, nil" because we write our own (XML) response to w
+		// and Handler.ServeHTTP would otherwise write "Created".
+		w.WriteHeader(http.StatusCreated)
+	}
 	writeLockInfo(w, token, ld)
 	return 0, nil
 }

+ 1 - 1
webdav/xml.go

@@ -269,8 +269,8 @@ func (w *multistatusWriter) write(r *response) error {
 		}
 	}
 	if w.enc == nil {
-		w.w.WriteHeader(StatusMulti)
 		w.w.Header().Add("Content-Type", "text/xml; charset=utf-8")
+		w.w.WriteHeader(StatusMulti)
 		_, err := fmt.Fprintf(w.w, `<?xml version="1.0" encoding="UTF-8"?>`+
 			`<D:multistatus xmlns:D="DAV:">`)
 		if err != nil {