浏览代码

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) {
 	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 		ms, _ := strconv.Atoi(r.FormValue("latency"))
 		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
 		const nanosPerMilli = 1e6
 		if r.FormValue("x") != "" {
 		if r.FormValue("x") != "" {
 			x, _ := strconv.Atoi(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)
 		fmt.Fprintf(w, "A grid of %d tiled images is below. Compare:<p>", xt*yt)
 		for _, ms := range []int{0, 30, 200, 1000} {
 		for _, ms := range []int{0, 30, 200, 1000} {
 			d := time.Duration(ms) * nanosPerMilli
 			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,
 				httpsHost(), ms, d,
 				httpHost(), ms, d,
 				httpHost(), ms, d,
 			)
 			)
 		}
 		}
 		io.WriteString(w, "<p>\n")
 		io.WriteString(w, "<p>\n")
-		cacheBust := time.Now().UnixNano()
 		for y := 0; y < yt; y++ {
 		for y := 0; y < yt; y++ {
 			for x := 0; x < xt; x++ {
 			for x := 0; x < xt; x++ {
 				fmt.Fprintf(w, "<img width=%d height=%d src='/gophertiles?x=%d&y=%d&cachebust=%d&latency=%d'>",
 				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 {
 func httpsHost() string {
 	if *hostHTTPS != "" {
 	if *hostHTTPS != "" {
 		return *hostHTTPS
 		return *hostHTTPS