gddo-server: forward the X-AppEngine-Country header for play links

Also return better errors when play.golang.org returns an non-OK error.

Fixes golang/go#16617.

Change-Id: Ie027482ef924d687db8662d0cb96dd30ba41e22e
Reviewed-on: https://go-review.googlesource.com/25540
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
diff --git a/gddo-server/main.go b/gddo-server/main.go
index 4f69574..17b6205 100644
--- a/gddo-server/main.go
+++ b/gddo-server/main.go
@@ -390,7 +390,7 @@
 			"hide":          hide,
 		})
 	case isView(req, "play"):
-		u, err := playURL(pdoc, req.Form.Get("play"))
+		u, err := playURL(pdoc, req.Form.Get("play"), r.Header.Get("X-AppEngine-Country"))
 		if err != nil {
 			return err
 		}
diff --git a/gddo-server/play.go b/gddo-server/play.go
index a957ae1..90268a2 100644
--- a/gddo-server/play.go
+++ b/gddo-server/play.go
@@ -57,10 +57,18 @@
 
 var exampleIDPat = regexp.MustCompile(`([^-]+)(?:-([^-]*)(?:-(.*))?)?`)
 
-func playURL(pdoc *doc.Package, id string) (string, error) {
+func playURL(pdoc *doc.Package, id, countryHeader string) (string, error) {
 	if m := exampleIDPat.FindStringSubmatch(id); m != nil {
 		if e := findExample(pdoc, m[1], m[2], m[3]); e != nil && e.Play != "" {
-			resp, err := httpClient.Post("http://play.golang.org/share", "text/plain", strings.NewReader(e.Play))
+			req, err := http.NewRequest("POST", "https://play.golang.org/share", "text/plain", strings.NewReader(e.Play))
+			if err != nil {
+				return "", err
+			}
+			if countryHeader != "" {
+				// Forward the App Engine country header.
+				req.Header.Set("X-AppEngine-Country", countryHeader)
+			}
+			resp, err := httpClient.Do(req)
 			if err != nil {
 				return "", err
 			}
@@ -69,6 +77,12 @@
 			if err != nil {
 				return "", err
 			}
+			if resp.StatusCode > 399 {
+				return "", &httpError{
+					status: resp.StatusCode,
+					err:    fmt.Errorf("Error from play.golang.org: %s", p),
+				}
+			}
 			return fmt.Sprintf("http://play.golang.org/p/%s", p), nil
 		}
 	}