瀏覽代碼

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