2016-09-18 7 views
1

テストファイル./bower_components/index.htmlを作成し、go test./に実行してください。なぜ、http.Getは1つではなく2つのリクエストを生成しますか?

なぜ次の行が最初の行ではなく2行を印刷するのですか?

./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のリポジトリがあなただけの外出を実行することができますので、私に教えてください私が何を意味するかを調べるためのテストコマンドです。

+0

しかし、http.Getによってfaviconを要求するのは正しいことではありませんか? –

+0

申し訳ありません。それは行方不明で実行された。 – Volker

+0

問題ありません、ps誰かがこれをオフトピックとしてマークしましたか? –

答えて

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()ハンドラはそのような場合にindex.htmlを試してサービスします。

+0

Aaaaありがとうございます:D今私は理解しています –

関連する問題