func main() { flag.Usage = PrintHelp config := parseCommandLine() log := libwebsocketd.RootLogScope(config.LogLevel, log) http.Handle(config.BasePath, libwebsocketd.HttpWsMuxHandler{ Config: config.Config, Log: log}) log.Info("server", "Starting WebSocket server : ws://%s%s", config.Addr, config.BasePath) if config.DevConsole { log.Info("server", "Developer console enabled : http://%s/", config.Addr) } if config.UsingScriptDir { log.Info("server", "Serving from directory : %s", config.ScriptDir) } else { log.Info("server", "Serving using application : %s %s", config.CommandName, strings.Join(config.CommandArgs, " ")) } err := http.ListenAndServe(config.Addr, nil) if err != nil { log.Fatal("server", "Could start server: %s", err) os.Exit(3) } }
func main() { config := parseCommandLine() log := libwebsocketd.RootLogScope(config.LogLevel, log) if config.DevConsole { if config.StaticDir != "" { log.Fatal("server", "Invalid parameters: --devconsole cannot be used with --staticdir. Pick one.") os.Exit(4) } if config.CgiDir != "" { log.Fatal("server", "Invalid parameters: --devconsole cannot be used with --cgidir. Pick one.") os.Exit(4) } } os.Clearenv() // it's ok to wipe it clean, we already read env variables from passenv into config http.Handle(config.BasePath, libwebsocketd.NewHandler(config.Config, log, config.MaxForks)) if config.UsingScriptDir { log.Info("server", "Serving from directory : %s", config.ScriptDir) } else if config.CommandName != "" { log.Info("server", "Serving using application : %s %s", config.CommandName, strings.Join(config.CommandArgs, " ")) } if config.StaticDir != "" { log.Info("server", "Serving static content from : %s", config.StaticDir) } if config.CgiDir != "" { log.Info("server", "Serving CGI scripts from : %s", config.CgiDir) } rejects := make(chan error, 1) wsschema, httpschema := "ws", "http" if config.Ssl { wsschema, httpschema = "wss", "https" } for _, addrSingle := range config.Addr { log.Info("server", "Starting WebSocket server : %s://%s%s", wsschema, addrSingle, config.BasePath) if config.DevConsole { log.Info("server", "Developer console enabled : %s://%s/", httpschema, addrSingle) } // ListenAndServe is blocking function. Let's run it in // go routine, reporting result to control channel. // Since it's blocking it'll never return non-error. go func(addr string) { if config.Ssl { rejects <- http.ListenAndServeTLS(addr, config.CertFile, config.KeyFile, nil) } else { rejects <- http.ListenAndServe(addr, nil) } }(addrSingle) } select { case err := <-rejects: log.Fatal("server", "Can't start server: %s", err) os.Exit(3) } }
func main() { flag.Usage = PrintHelp config := parseCommandLine() log := libwebsocketd.RootLogScope(config.LogLevel, log) if config.DevConsole { if config.StaticDir != "" { log.Fatal("server", "Invalid parameters: --devconsole cannot be used with --staticdir. Pick one.") os.Exit(4) } if config.CgiDir != "" { log.Fatal("server", "Invalid parameters: --devconsole cannot be used with --cgidir. Pick one.") os.Exit(4) } } http.Handle(config.BasePath, libwebsocketd.HttpWsMuxHandler{ Config: config.Config, Log: log}) if config.UsingScriptDir { log.Info("server", "Serving from directory : %s", config.ScriptDir) } else if config.CommandName != "" { log.Info("server", "Serving using application : %s %s", config.CommandName, strings.Join(config.CommandArgs, " ")) } if config.StaticDir != "" { log.Info("server", "Serving static content from : %s", config.StaticDir) } if config.CgiDir != "" { log.Info("server", "Serving CGI scripts from : %s", config.CgiDir) } rejects := make(chan error, 1) for _, addrSingle := range config.Addr { log.Info("server", "Starting WebSocket server : ws://%s%s", addrSingle, config.BasePath) if config.DevConsole { log.Info("server", "Developer console enabled : http://%s/", addrSingle) } // ListenAndServe is blocking function. Let's run it in // go routine, reporting result to control channel. // Since it's blocking it'll never return non-error. go func(addr string) { rejects <- http.ListenAndServe(addr, nil) }(addrSingle) } select { case err := <-rejects: log.Fatal("server", "Can't start server: %s", err) os.Exit(3) } }
func main() { flag.Usage = PrintHelp config := parseCommandLine() log := libwebsocketd.RootLogScope(config.LogLevel, log) if config.DevConsole { if config.StaticDir != "" { log.Fatal("server", "Invalid parameters: --devconsole cannot be used with --staticdir. Pick one.") os.Exit(4) } if config.CgiDir != "" { log.Fatal("server", "Invalid parameters: --devconsole cannot be used with --cgidir. Pick one.") os.Exit(4) } } http.Handle(config.BasePath, libwebsocketd.HttpWsMuxHandler{ Config: config.Config, Log: log}) for _, addrSingle := range config.Addr { log.Info("server", "Starting WebSocket server : ws://%s%s", addrSingle, config.BasePath) if config.DevConsole { log.Info("server", "Developer console enabled : http://%s/", addrSingle) } } if config.UsingScriptDir { log.Info("server", "Serving from directory : %s", config.ScriptDir) } else if config.CommandName != "" { log.Info("server", "Serving using application : %s %s", config.CommandName, strings.Join(config.CommandArgs, " ")) } if config.StaticDir != "" { log.Info("server", "Serving static content from : %s", config.StaticDir) } if config.CgiDir != "" { log.Info("server", "Serving CGI scripts from : %s", config.CgiDir) } for _, addrSingle := range config.Addr { err := http.ListenAndServe(addrSingle, nil) if err != nil { log.Fatal("server", "Can't start server: %s", err) os.Exit(3) } } }
func main() { config := parseCommandLine() log := libwebsocketd.RootLogScope(config.LogLevel, log) if config.DevConsole { if config.StaticDir != "" { log.Fatal("server", "Invalid parameters: --devconsole cannot be used with --staticdir. Pick one.") os.Exit(4) } if config.CgiDir != "" { log.Fatal("server", "Invalid parameters: --devconsole cannot be used with --cgidir. Pick one.") os.Exit(4) } } os.Clearenv() // it's ok to wipe it clean, we already read env variables from passenv into config handler := libwebsocketd.NewWebsocketdServer(config.Config, log, config.MaxForks) http.Handle("/", handler) if config.UsingScriptDir { log.Info("server", "Serving from directory : %s", config.ScriptDir) } else if config.CommandName != "" { log.Info("server", "Serving using application : %s %s", config.CommandName, strings.Join(config.CommandArgs, " ")) } if config.StaticDir != "" { log.Info("server", "Serving static content from : %s", config.StaticDir) } if config.CgiDir != "" { log.Info("server", "Serving CGI scripts from : %s", config.CgiDir) } rejects := make(chan error, 1) for _, addrSingle := range config.Addr { log.Info("server", "Starting WebSocket server : %s", handler.TellURL("ws", addrSingle, "/")) if config.DevConsole { log.Info("server", "Developer console enabled : %s", handler.TellURL("http", addrSingle, "/")) } else if config.StaticDir != "" || config.CgiDir != "" { log.Info("server", "Serving CGI or static files : %s", handler.TellURL("http", addrSingle, "/")) } // ListenAndServe is blocking function. Let's run it in // go routine, reporting result to control channel. // Since it's blocking it'll never return non-error. go func(addr string) { if config.Ssl { rejects <- http.ListenAndServeTLS(addr, config.CertFile, config.KeyFile, nil) } else { rejects <- http.ListenAndServe(addr, nil) } }(addrSingle) if config.RedirPort != 0 { go func(addr string) { pos := strings.IndexByte(addr, ':') rediraddr := addr[:pos] + ":" + strconv.Itoa(config.RedirPort) // it would be silly to optimize this one redir := &http.Server{Addr: rediraddr, Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // redirect to same hostname as in request but different port and probably schema uri := "https://" if !config.Ssl { uri = "http://" } uri += r.Host[:strings.IndexByte(r.Host, ':')] + addr[pos:] + "/" http.Redirect(w, r, uri, http.StatusMovedPermanently) })} log.Info("server", "Starting redirect server : http://%s/", rediraddr) rejects <- redir.ListenAndServe() }(addrSingle) } } select { case err := <-rejects: log.Fatal("server", "Can't start server: %s", err) os.Exit(3) } }