Browse Source

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 năm trước cách đây
mục cha
commit
3e967e1d28
1 tập tin đã thay đổi với 24 bổ sung2 xóa
  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