私は012olの中でhttptest
パッケージを使用しようとしていました。私は理解できないことを見つけました。ここでcode次のとおりです。このコード例で http.ResponseWriter.WriteHeader()がデッドロックを引き起こしました
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
"net/http/httptest"
)
func main() {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello1"))
}))
ts.Close()
ts = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello2"))
}))
ts.Close()
ts = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(100)
w.Write([]byte("Hello3"))
}))
res, err := http.Get(ts.URL)
if err != nil {
log.Fatal(err)
}
greeting, err := ioutil.ReadAll(res.Body)
res.Body.Close()
if err != nil {
log.Fatal(err)
}
ts.Close()
fmt.Printf("%s", greeting)
}
は、私は数回を開こうと緊密
httptest
のサーバーました。どうにかしてThe Go Playgroundでデッドロックが発生しました。自分の環境(Goバージョン:go1.7.4 darwin/amd64)で試してみましたが、応答せずにハングアップしました。
私の質問は:なぜw.WriteHeader(100)
がデッドロックを引き起こしたのですか?w.WriteHeader(200)
はなぜですか?それはGolangのコアライブラリからのバグですか、ちょうど私はいくつかの使い方を誤解していますか? Tks!
をおそらく '100 Continue'応答コードはそうライブラリ、さらにいくつかのアクションを想定し、次のステップのために待っています。 –
なぜあなたは '100'を送っていますか?何が起こると思いますか? – Flimzy
Goは、100(StatusContinue)応答をクライアントに送信していないようです。あなたがHello3を最初に書くようにそれを並べ替えるならば、それは最終的には成功したレスポンスを送ります(https://play.golang.org/p/gX1ra-xFSA8をチェックしてください - 遊び場では動作しませんが、あなたのシステム)、それを使って遊んでみてください。そして、はい、あなたは何をしたいですか? – Ravi