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>
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 @@
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 @@
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 @@
}
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 @@
}
}
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 {