diff options
author | Nigel Tao <nigeltao@golang.org> | 2015-02-03 17:29:08 +1100 |
---|---|---|
committer | Nigel Tao <nigeltao@golang.org> | 2015-02-04 00:53:16 +0000 |
commit | 5feaa29a7b94c0462cfd22c1aa7f3907c7eeec00 (patch) | |
tree | 3baaf587697eff848e2af9b0ebc604dca2e5b5d6 | |
parent | a41a0cff45de4f1113fc8ea8bf5b8992ff9dc8ce (diff) | |
download | net-5feaa29a7b94c0462cfd22c1aa7f3907c7eeec00.tar.gz |
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>
-rw-r--r-- | webdav/webdav.go | 10 | ||||
-rw-r--r-- | webdav/xml.go | 2 |
2 files changed, 9 insertions, 3 deletions
diff --git a/webdav/webdav.go b/webdav/webdav.go index 8e0216a..f34988c 100644 --- a/webdav/webdav.go +++ b/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 } diff --git a/webdav/xml.go b/webdav/xml.go index 91c8e7e..71a42b6 100644 --- a/webdav/xml.go +++ b/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 { |