Skip to content

Commit

Permalink
playground: use stdlib instead of appengine packages
Browse files Browse the repository at this point in the history
With modern versions of App Engine, it's no longer needed to use the
google.golang.org/appengine/... packages.

Package log from standard library can be used instead of the
google.golang.org/appengine/log package. Packages net/http and
context from standard library can be used instead of
google.golang.org/appengine/urlfetch.

This simplifies the code and reduces the number of dependences.

Start using the golangorgenv package from previous commit to
make the decision of whether to enforce sharing restrictions,
rather than relying on the appengine build tag. The appengine
build tag is no longer set in App Engine Standard with Go 1.11+
runtime. An alternative solution would be detect App Engine by
doing something like:

	// GAE_ENV environment variable is set to "standard" in App Engine environment, Go 1.11 runtime.
	// See https://cloud.google.com/appengine/docs/standard/go111/runtime#environment_variables.
	var onAppengine = os.Getenv("GAE_ENV") == "standard"

But we choose to upgrade to explicit app-scoped environment variable
configuration as part of this change. It provides better security
properties, and the value of adding an intermediate transitional step
is not high enough to justify doing it.

When getting the value of "X-AppEngine-Country" header, use its
canonical format "X-Appengine-Country" to avoid an allocation.
This does not change behavior.

Run go mod tidy (using Go 1.12).

Updates golang/go#29981
Updates golang/go#30486

Change-Id: I82a59e0f28623e06762b7ebdf3930b5ee243acda
Reviewed-on: https://go-review.googlesource.com/c/tools/+/160837
Reviewed-by: Michael Matloob <matloob@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
  • Loading branch information
dmitshur committed Mar 7, 2019
1 parent bd17c08 commit 6a08e31
Show file tree
Hide file tree
Showing 6 changed files with 91 additions and 146 deletions.
6 changes: 1 addition & 5 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
module golang.org/x/tools

require (
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f // indirect
google.golang.org/appengine v1.4.0
)
require golang.org/x/net v0.0.0-20190213061140-3a22650c66bd
8 changes: 0 additions & 8 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,10 +1,2 @@
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd h1:HuTn7WObtcDo9uEEU7rEqL0jYthdXAmZ6PP+meazmaU=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f h1:Bl/8QSvNqXvPGPGXa2z5xUTmV7VDcZyvRZ+QQXkXTZQ=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
34 changes: 0 additions & 34 deletions playground/appengine.go

This file was deleted.

67 changes: 0 additions & 67 deletions playground/common.go

This file was deleted.

32 changes: 0 additions & 32 deletions playground/local.go

This file was deleted.

90 changes: 90 additions & 0 deletions playground/playground.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
// Copyright 2013 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Package playground registers HTTP handlers at "/compile" and "/share" that
// proxy requests to the golang.org playground service.
// This package may be used unaltered on App Engine Standard with Go 1.11+ runtime.
package playground // import "golang.org/x/tools/playground"

import (
"bytes"
"context"
"fmt"
"io"
"log"
"net/http"
"os"
"strings"
"time"

"golang.org/x/tools/godoc/golangorgenv"
)

const baseURL = "https://play.golang.org"

func init() {
http.HandleFunc("/compile", bounce)
http.HandleFunc("/share", bounce)
}

func bounce(w http.ResponseWriter, r *http.Request) {
b := new(bytes.Buffer)
if err := passThru(b, r); os.IsPermission(err) {
http.Error(w, "403 Forbidden", http.StatusForbidden)
log.Println(err)
return
} else if err != nil {
http.Error(w, "500 Internal Server Error", http.StatusInternalServerError)
log.Println(err)
return
}
io.Copy(w, b)
}

func passThru(w io.Writer, req *http.Request) error {
if req.URL.Path == "/share" && googleCN(req) {
return os.ErrPermission
}
defer req.Body.Close()
url := baseURL + req.URL.Path
ctx, cancel := context.WithTimeout(req.Context(), 60*time.Second)
defer cancel()
r, err := post(ctx, url, req.Header.Get("Content-Type"), req.Body)
if err != nil {
return fmt.Errorf("making POST request: %v", err)
}
defer r.Body.Close()
if _, err := io.Copy(w, r.Body); err != nil {
return fmt.Errorf("copying response Body: %v", err)
}
return nil
}

func post(ctx context.Context, url, contentType string, body io.Reader) (*http.Response, error) {
req, err := http.NewRequest(http.MethodPost, url, body)
if err != nil {
return nil, fmt.Errorf("http.NewRequest: %v", err)
}
req.Header.Set("Content-Type", contentType)
return http.DefaultClient.Do(req.WithContext(ctx))
}

// googleCN reports whether request r is considered
// to be served from golang.google.cn.
func googleCN(r *http.Request) bool {
if r.FormValue("googlecn") != "" {
return true
}
if strings.HasSuffix(r.Host, ".cn") {
return true
}
if !golangorgenv.CheckCountry() {
return false
}
switch r.Header.Get("X-Appengine-Country") {
case "", "ZZ", "CN":
return true
}
return false
}

0 comments on commit 6a08e31

Please sign in to comment.