Переглянути джерело

webdav: special-case the propfind_invalid2 litmus test.

Before/after:
<- summary for `props': of 30 tests run: 29 passed, 1 failed. 96.7%
<- summary for `props': of 30 tests run: 30 passed, 0 failed. 100.0%

Change-Id: Ibe51f0199afaab6b95894aed2244f1c4becad3da
Reviewed-on: https://go-review.googlesource.com/10304
Reviewed-by: Nigel Tao <nigeltao@golang.org>
Nigel Tao 10 роки тому
батько
коміт
7212a08034
1 змінених файлів з 35 додано та 2 видалено
  1. 35 2
      webdav/litmus_test_server.go

+ 35 - 2
webdav/litmus_test_server.go

@@ -34,7 +34,7 @@ func main() {
 	log.SetFlags(0)
 	fs := webdav.NewMemFS()
 	ls := webdav.NewMemLS()
-	http.Handle("/", &webdav.Handler{
+	h := &webdav.Handler{
 		FileSystem: fs,
 		LockSystem: ls,
 		PropSystem: webdav.NewMemPS(fs, ls),
@@ -56,7 +56,40 @@ func main() {
 				log.Printf("%-20s%-10s%-30s%v", litmus, r.Method, r.URL.Path, err)
 			}
 		},
-	})
+	}
+
+	// The next line would normally be:
+	//	http.Handle("/", h)
+	// but we wrap that HTTP handler h to cater for a special case.
+	//
+	// The propfind_invalid2 litmus test case expects an empty namespace prefix
+	// declaration to be an error. The FAQ in the webdav litmus test says:
+	//
+	// "What does the "propfind_invalid2" test check for?...
+	//
+	// If a request was sent with an XML body which included an empty namespace
+	// prefix declaration (xmlns:ns1=""), then the server must reject that with
+	// a "400 Bad Request" response, as it is invalid according to the XML
+	// Namespace specification."
+	//
+	// On the other hand, the Go standard library's encoding/xml package
+	// accepts an empty xmlns namespace, as per the discussion at
+	// https://github.com/golang/go/issues/8068
+	//
+	// Empty namespaces seem disallowed in the second (2006) edition of the XML
+	// standard, but allowed in a later edition. The grammar differs between
+	// http://www.w3.org/TR/2006/REC-xml-names-20060816/#ns-decl and
+	// http://www.w3.org/TR/REC-xml-names/#dt-prefix
+	//
+	// Thus, we assume that the propfind_invalid2 test is obsolete, and
+	// hard-code the 400 Bad Request response that the test expects.
+	http.Handle("/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+		if r.Header.Get("X-Litmus") == "props: 3 (propfind_invalid2)" {
+			http.Error(w, "400 Bad Request", http.StatusBadRequest)
+			return
+		}
+		h.ServeHTTP(w, r)
+	}))
 
 	addr := fmt.Sprintf(":%d", *port)
 	log.Printf("Serving %v", addr)