github.com/april1989/origin-go-tools@v0.0.32/cmd/present/play.go (about) 1 // Copyright 2012 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package main 6 7 import ( 8 "bytes" 9 "fmt" 10 "io/ioutil" 11 "net/http" 12 "net/url" 13 "path/filepath" 14 "runtime" 15 "time" 16 17 "github.com/april1989/origin-go-tools/godoc/static" 18 "github.com/april1989/origin-go-tools/playground/socket" 19 "github.com/april1989/origin-go-tools/present" 20 21 // This will register handlers at /compile and /share that will proxy to the 22 // respective endpoints at play.golang.org. This allows the frontend to call 23 // these endpoints without needing cross-origin request sharing (CORS). 24 // Note that this is imported regardless of whether the endpoints are used or 25 // not (in the case of a local socket connection, they are not called). 26 _ "github.com/april1989/origin-go-tools/playground" 27 ) 28 29 var scripts = []string{"jquery.js", "jquery-ui.js", "playground.js", "play.js"} 30 31 // playScript registers an HTTP handler at /play.js that serves all the 32 // scripts specified by the variable above, and appends a line that 33 // initializes the playground with the specified transport. 34 func playScript(root, transport string) { 35 modTime := time.Now() 36 var buf bytes.Buffer 37 for _, p := range scripts { 38 if s, ok := static.Files[p]; ok { 39 buf.WriteString(s) 40 continue 41 } 42 b, err := ioutil.ReadFile(filepath.Join(root, "static", p)) 43 if err != nil { 44 panic(err) 45 } 46 buf.Write(b) 47 } 48 fmt.Fprintf(&buf, "\ninitPlayground(new %v());\n", transport) 49 b := buf.Bytes() 50 http.HandleFunc("/play.js", func(w http.ResponseWriter, r *http.Request) { 51 w.Header().Set("Content-type", "application/javascript") 52 http.ServeContent(w, r, "", modTime, bytes.NewReader(b)) 53 }) 54 } 55 56 func initPlayground(basepath string, origin *url.URL) { 57 if !present.PlayEnabled { 58 return 59 } 60 if *usePlayground { 61 playScript(basepath, "HTTPTransport") 62 return 63 } 64 65 if *nativeClient { 66 // When specifying nativeClient, non-Go code cannot be executed 67 // because the NaCl setup doesn't support doing so. 68 socket.RunScripts = false 69 socket.Environ = func() []string { 70 if runtime.GOARCH == "amd64" { 71 return environ("GOOS=nacl", "GOARCH=amd64p32") 72 } 73 return environ("GOOS=nacl") 74 } 75 } 76 playScript(basepath, "SocketTransport") 77 http.Handle("/socket", socket.NewHandler(origin)) 78 } 79 80 func playable(c present.Code) bool { 81 play := present.PlayEnabled && c.Play 82 83 // Restrict playable files to only Go source files when using play.golang.org, 84 // since there is no method to execute shell scripts there. 85 if *usePlayground { 86 return play && c.Ext == ".go" 87 } 88 return play 89 }