mirror of
https://github.com/golang/go
synced 2024-11-18 11:14:39 -07:00
37fd46feae
Without changing the behavior of the present command for local usage (using the local socket for running examples, defaulting to the current directory for all content). Add flags and set them to the appropriate values if running on App Engine. Notably, since the Go files must be in the same directory as app.yaml, the content root must be ./content/ to avoid listing the present source files. It also defaults to running example snippets via the HTTPTransport (https://play.golang.org/compile) instead of locally when on App Engine. There are also some small cleanup code changes. Update golang/go#28080 Change-Id: I40bb7923107614f88d2bfdffd34a824d4bacb3a1 Reviewed-on: https://go-review.googlesource.com/c/140841 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Bryan C. Mills <bcmills@google.com>
90 lines
2.5 KiB
Go
90 lines
2.5 KiB
Go
// Copyright 2012 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 main
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"net/url"
|
|
"path/filepath"
|
|
"runtime"
|
|
"time"
|
|
|
|
"golang.org/x/tools/godoc/static"
|
|
"golang.org/x/tools/playground/socket"
|
|
"golang.org/x/tools/present"
|
|
|
|
// This will register handlers at /compile and /share that will proxy to the
|
|
// respective endpoints at play.golang.org. This allows the frontend to call
|
|
// these endpoints without needing cross-origin request sharing (CORS).
|
|
// Note that this is imported regardless of whether the endpoints are used or
|
|
// not (in the case of a local socket connection, they are not called).
|
|
_ "golang.org/x/tools/playground"
|
|
)
|
|
|
|
var scripts = []string{"jquery.js", "jquery-ui.js", "playground.js", "play.js"}
|
|
|
|
// playScript registers an HTTP handler at /play.js that serves all the
|
|
// scripts specified by the variable above, and appends a line that
|
|
// initializes the playground with the specified transport.
|
|
func playScript(root, transport string) {
|
|
modTime := time.Now()
|
|
var buf bytes.Buffer
|
|
for _, p := range scripts {
|
|
if s, ok := static.Files[p]; ok {
|
|
buf.WriteString(s)
|
|
continue
|
|
}
|
|
b, err := ioutil.ReadFile(filepath.Join(root, "static", p))
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
buf.Write(b)
|
|
}
|
|
fmt.Fprintf(&buf, "\ninitPlayground(new %v());\n", transport)
|
|
b := buf.Bytes()
|
|
http.HandleFunc("/play.js", func(w http.ResponseWriter, r *http.Request) {
|
|
w.Header().Set("Content-type", "application/javascript")
|
|
http.ServeContent(w, r, "", modTime, bytes.NewReader(b))
|
|
})
|
|
}
|
|
|
|
func initPlayground(basepath string, origin *url.URL) {
|
|
if !present.PlayEnabled {
|
|
return
|
|
}
|
|
if *usePlayground {
|
|
playScript(basepath, "HTTPTransport")
|
|
return
|
|
}
|
|
|
|
if *nativeClient {
|
|
// When specifying nativeClient, non-Go code cannot be executed
|
|
// because the NaCl setup doesn't support doing so.
|
|
socket.RunScripts = false
|
|
socket.Environ = func() []string {
|
|
if runtime.GOARCH == "amd64" {
|
|
return environ("GOOS=nacl", "GOARCH=amd64p32")
|
|
}
|
|
return environ("GOOS=nacl")
|
|
}
|
|
}
|
|
playScript(basepath, "SocketTransport")
|
|
http.Handle("/socket", socket.NewHandler(origin))
|
|
}
|
|
|
|
func playable(c present.Code) bool {
|
|
play := present.PlayEnabled && c.Play
|
|
|
|
// Restrict playable files to only Go source files when using play.golang.org,
|
|
// since there is no method to execute shell scripts there.
|
|
if *usePlayground {
|
|
return play && c.Ext == ".go"
|
|
}
|
|
return play
|
|
}
|