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
}
}