创建测试文件./bower_components/index.html
并在go test
中运行./
。
为什么以下打印两行而不是第一行?
./bower_components/index.html
./bower_components/
输出:
=== RUN TestRootHandler
./bower_components/index.html
./bower_components/ ???
--- PASS: TestRootHandler (0.00s)
main_test.go:32: 200 - ./bower_components/Hello World.html
PASS
ok
代码:
// RootHandler for HTTP
func RootHandler(root string, h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
_, err := os.Open(root + r.URL.Path)
if err != nil {
fmt.Println(err.Error())
h.ServeHTTP(w, r)
return
}
fmt.Println(root + r.URL.Path)
r.URL.Path = root + r.URL.Path
h.ServeHTTP(w, r)
})
}
// TestRootHandler
func TestRootHandler(t *testing.T) {
ts := httptest.NewServer(RootHandler("./bower_components", http.FileServer(http.Dir("./"))))
defer ts.Close()
res, err := http.Get(ts.URL + "/index.html")
if err != nil {
t.Fatal(err)
}
body, err := ioutil.ReadAll(res.Body)
res.Body.Close()
if err != nil {
t.Fatal(err)
}
t.Logf("%d - %s", res.StatusCode, body)
}
如果您不理解这个问题,请告诉我,然后我将设置一个github存储库,以便您可以运行go test命令来查看我的意思。
答案 0 :(得分:7)
这就是编写http.FileServer()
的方式。引用其文档:
作为一种特殊情况,返回的文件服务器会将以“/index.html”结尾的任何请求重定向到相同的路径,而不是最终的“index.html”。
这就是您所遇到的:您正在请求/bower_components/index.html
,因此http.FileServer()
返回的处理程序会发送重定向:
HTTP/1.1 301 Moved Permanently
Location: ./
http.Get()
行为良好,遵循此重定向,执行另一个HTTP GET
,现在没有index.html
,http.FileServer()
处理程序将尝试为{ {1}}在这种情况下。