mirror of
https://github.com/golang/go
synced 2024-11-18 15:04:44 -07:00
go.tools/{cmd/present,playground/socket}: add orighost flag to handle the web origin more flexible
Also fixes the following nits; - literal IPv6 address handling - URL host component handling in the case of a wildcard listen - URL port component handling in the case of no port component in origin Fixes golang/go#8096. LGTM=dan.kortschak, adg R=adg, golang-codereviews, dan.kortschak CC=golang-codereviews https://golang.org/cl/102770046
This commit is contained in:
parent
707c7629cb
commit
96cece04e7
@ -24,16 +24,14 @@ import (
|
|||||||
|
|
||||||
const basePkg = "code.google.com/p/go.tools/cmd/present"
|
const basePkg = "code.google.com/p/go.tools/cmd/present"
|
||||||
|
|
||||||
var (
|
var basePath string
|
||||||
basePath string
|
|
||||||
nativeClient bool
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
httpListen := flag.String("http", "127.0.0.1:3999", "host:port to listen on")
|
httpAddr := flag.String("http", "127.0.0.1:3999", "HTTP service address (e.g., '127.0.0.1:3999')")
|
||||||
|
originHost := flag.String("orighost", "", "host component of web origin URL (e.g., 'localhost')")
|
||||||
flag.StringVar(&basePath, "base", "", "base path for slide template and static resources")
|
flag.StringVar(&basePath, "base", "", "base path for slide template and static resources")
|
||||||
flag.BoolVar(&present.PlayEnabled, "play", true, "enable playground (permit execution of arbitrary user code)")
|
flag.BoolVar(&present.PlayEnabled, "play", true, "enable playground (permit execution of arbitrary user code)")
|
||||||
flag.BoolVar(&nativeClient, "nacl", false, "use Native Client environment playground (prevents non-Go code execution)")
|
nativeClient := flag.Bool("nacl", false, "use Native Client environment playground (prevents non-Go code execution)")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
if basePath == "" {
|
if basePath == "" {
|
||||||
@ -46,8 +44,36 @@ func main() {
|
|||||||
basePath = p.Dir
|
basePath = p.Dir
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ln, err := net.Listen("tcp", *httpAddr)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
defer ln.Close()
|
||||||
|
|
||||||
|
_, port, err := net.SplitHostPort(ln.Addr().String())
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
origin := &url.URL{Scheme: "http"}
|
||||||
|
if *originHost != "" {
|
||||||
|
origin.Host = net.JoinHostPort(*originHost, port)
|
||||||
|
} else if ln.Addr().(*net.TCPAddr).IP.IsUnspecified() {
|
||||||
|
name, _ := os.Hostname()
|
||||||
|
origin.Host = net.JoinHostPort(name, port)
|
||||||
|
} else {
|
||||||
|
reqHost, reqPort, err := net.SplitHostPort(*httpAddr)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
if reqPort == "0" {
|
||||||
|
origin.Host = net.JoinHostPort(reqHost, port)
|
||||||
|
} else {
|
||||||
|
origin.Host = *httpAddr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if present.PlayEnabled {
|
if present.PlayEnabled {
|
||||||
if nativeClient {
|
if *nativeClient {
|
||||||
socket.RunScripts = false
|
socket.RunScripts = false
|
||||||
socket.Environ = func() []string {
|
socket.Environ = func() []string {
|
||||||
if runtime.GOARCH == "amd64" {
|
if runtime.GOARCH == "amd64" {
|
||||||
@ -57,24 +83,17 @@ func main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
playScript(basePath, "SocketTransport")
|
playScript(basePath, "SocketTransport")
|
||||||
|
|
||||||
host, port, err := net.SplitHostPort(*httpListen)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
origin := &url.URL{Scheme: "http", Host: host + ":" + port}
|
|
||||||
http.Handle("/socket", socket.NewHandler(origin))
|
http.Handle("/socket", socket.NewHandler(origin))
|
||||||
}
|
}
|
||||||
http.Handle("/static/", http.FileServer(http.Dir(basePath)))
|
http.Handle("/static/", http.FileServer(http.Dir(basePath)))
|
||||||
|
|
||||||
if !strings.HasPrefix(*httpListen, "127.0.0.1") &&
|
if !ln.Addr().(*net.TCPAddr).IP.IsLoopback() &&
|
||||||
!strings.HasPrefix(*httpListen, "localhost") &&
|
present.PlayEnabled && !*nativeClient {
|
||||||
present.PlayEnabled && !nativeClient {
|
|
||||||
log.Print(localhostWarning)
|
log.Print(localhostWarning)
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Printf("Open your web browser and visit http://%s/", *httpListen)
|
log.Printf("Open your web browser and visit %s", origin.String())
|
||||||
log.Fatal(http.ListenAndServe(*httpListen, nil))
|
log.Fatal(http.Serve(ln, nil))
|
||||||
}
|
}
|
||||||
|
|
||||||
func playable(c present.Code) bool {
|
func playable(c present.Code) bool {
|
||||||
|
@ -22,6 +22,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
@ -84,7 +85,12 @@ func handshake(c *websocket.Config, req *http.Request) error {
|
|||||||
log.Println("bad websocket origin:", err)
|
log.Println("bad websocket origin:", err)
|
||||||
return websocket.ErrBadWebSocketOrigin
|
return websocket.ErrBadWebSocketOrigin
|
||||||
}
|
}
|
||||||
ok := c.Origin.Scheme == o.Scheme && c.Origin.Host == o.Host
|
_, port, err := net.SplitHostPort(c.Origin.Host)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("bad websocket origin:", err)
|
||||||
|
return websocket.ErrBadWebSocketOrigin
|
||||||
|
}
|
||||||
|
ok := c.Origin.Scheme == o.Scheme && (c.Origin.Host == o.Host || c.Origin.Host == net.JoinHostPort(o.Host, port))
|
||||||
if !ok {
|
if !ok {
|
||||||
log.Println("bad websocket origin:", o)
|
log.Println("bad websocket origin:", o)
|
||||||
return websocket.ErrBadWebSocketOrigin
|
return websocket.ErrBadWebSocketOrigin
|
||||||
|
Loading…
Reference in New Issue
Block a user