소스 검색

http2/h2demo: add HTTP/2 with Server Push

Server Push of tiles are not always the fastest. But, it
might be good to have the sample available to demonstrate
how Push is handled by the browser.

Change-Id: I967db9693e0889a889a36ad82248acef2c6db8d4
Reviewed-on: https://go-review.googlesource.com/38349
Reviewed-by: Tom Bergan <tombergan@google.com>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Tom Bergan <tombergan@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Jaana Burcu Dogan 8 년 전
부모
커밋
3e967e1d28
1개의 변경된 파일24개의 추가작업 그리고 2개의 파일을 삭제
  1. 24 2
      http2/h2demo/h2demo.go

+ 24 - 2
http2/h2demo/h2demo.go

@@ -313,6 +313,13 @@ func newGopherTilesHandler() http.Handler {
 	}
 	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 		ms, _ := strconv.Atoi(r.FormValue("latency"))
+		push, _ := strconv.ParseBool(r.FormValue("push"))
+
+		cacheBust := time.Now().UnixNano()
+		if push {
+			pushTiles(w, cacheBust, ms, xt, yt)
+		}
+
 		const nanosPerMilli = 1e6
 		if r.FormValue("x") != "" {
 			x, _ := strconv.Atoi(r.FormValue("x"))
@@ -329,13 +336,13 @@ func newGopherTilesHandler() http.Handler {
 		fmt.Fprintf(w, "A grid of %d tiled images is below. Compare:<p>", xt*yt)
 		for _, ms := range []int{0, 30, 200, 1000} {
 			d := time.Duration(ms) * nanosPerMilli
-			fmt.Fprintf(w, "[<a href='https://%s/gophertiles?latency=%d'>HTTP/2, %v latency</a>] [<a href='http://%s/gophertiles?latency=%d'>HTTP/1, %v latency</a>]<br>\n",
+			fmt.Fprintf(w, "[<a href='https://%s/gophertiles?latency=%d'>HTTP/2, %v latency</a>] [<a href='https://%s/gophertiles?latency=%d&push=true'>HTTP/2, %v latency with Server Push</a>] [<a href='http://%s/gophertiles?latency=%d'>HTTP/1, %v latency</a>]<br>\n",
+				httpsHost(), ms, d,
 				httpsHost(), ms, d,
 				httpHost(), ms, d,
 			)
 		}
 		io.WriteString(w, "<p>\n")
-		cacheBust := time.Now().UnixNano()
 		for y := 0; y < yt; y++ {
 			for x := 0; x < xt; x++ {
 				fmt.Fprintf(w, "<img width=%d height=%d src='/gophertiles?x=%d&y=%d&cachebust=%d&latency=%d'>",
@@ -356,6 +363,21 @@ function showtimes() {
 	})
 }
 
+func pushTiles(w http.ResponseWriter, cacheBust int64, latency int, xt, yt int) {
+	pusher, ok := w.(http.Pusher)
+	if !ok {
+		return
+	}
+	for y := 0; y < yt; y++ {
+		for x := 0; x < xt; x++ {
+			img := fmt.Sprintf("/gophertiles?x=%d&y=%d&cachebust=%d&latency=%d", x, y, cacheBust, latency)
+			if err := pusher.Push(img, nil); err != nil {
+				log.Printf("Failed to push %v: %v", img, err)
+			}
+		}
+	}
+}
+
 func httpsHost() string {
 	if *hostHTTPS != "" {
 		return *hostHTTPS