package main import ( "flag" "fmt" "net/http" "golang-fave/assets" "golang-fave/consts" "golang-fave/utils" "github.com/vladimirok5959/golang-server-bootstrap/bootstrap" "github.com/vladimirok5959/golang-server-resources/resource" /* "context" "errors" "flag" "fmt" "log" "net/http" "os" "os/signal" "strconv" "strings" "time" "golang-fave/constants" "golang-fave/engine/actions" "golang-fave/engine/wrapper" */) var ParamHost string var ParamPort int var ParamWwwDir string //var VhostHomeDir string func init() { flag.StringVar(&ParamHost, "host", "0.0.0.0", "server host") flag.IntVar(&ParamPort, "port", 8080, "server port") flag.StringVar(&ParamWwwDir, "dir", "", "virtual hosts directory") flag.Parse() } func main() { ParamWwwDir = utils.FixPath(ParamWwwDir) if !(utils.IsFileExists(ParamWwwDir) && utils.IsDir(ParamWwwDir)) { fmt.Println("Virtual hosts directory is not exists") fmt.Println("Example: ./fave -host 127.0.0.1 -port 80 -dir ./hosts") return } res := resource.New() res.Add("assets/cp/scripts.js", "application/javascript; charset=utf-8", assets.CpScriptsJs) res.Add("assets/cp/styles.css", "text/css", assets.CpStylesCss) res.Add("assets/sys/bg.png", "image/png", assets.SysBgPng) res.Add("assets/sys/fave.ico", "image/x-icon", assets.SysFaveIco) res.Add("assets/sys/logo.png", "image/png", assets.SysLogoPng) res.Add("assets/sys/logo.svg", "image/svg+xml", assets.SysLogoSvg) res.Add("assets/sys/styles.css", "text/css", assets.SysStylesCss) bootstrap.Start("127.0.0.1:8080", 30, "assets", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Server", "fave.pro/"+consts.ServerVersion) }, func(w http.ResponseWriter, r *http.Request) { // Mounted assets if res.Response(w, r, func(w http.ResponseWriter, r *http.Request, i *resource.Resource) { w.Header().Set("Cache-Control", "public, max-age=31536000") }, nil) { return } /* // After callback w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") w.Header().Set("Content-Type", "text/html") w.Write([]byte(`
Hello World!
/assets/bootstrap.css
/assets/bootstrap.js
/assets/jquery.js
/assets/popper.js
`)) */ }) /* if _, err := os.Stat(ParamWwwDir); os.IsNotExist(err) { fmt.Println("Virtual hosts directory is not exists") fmt.Println("Example: ./fave -host 127.0.0.1 -port 80 -dir ./hosts") return } if ParamWwwDir[len(ParamWwwDir)-1] != '/' { ParamWwwDir = ParamWwwDir + "/" } // Handle mux := http.NewServeMux() mux.HandleFunc("/", handler) srv := &http.Server{ Addr: fmt.Sprintf("%s:%d", ParamHost, ParamPort), Handler: mux, } stop := make(chan os.Signal) signal.Notify(stop, os.Interrupt) go func() { log.Printf("Starting server at %s:%d", ParamHost, ParamPort) if err := srv.ListenAndServe(); err != nil { if err != http.ErrServerClosed { log.Fatal(err) } } }() // Wait for signal <-stop log.Printf("Shutting down server...\n") ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() if err := srv.Shutdown(ctx); err != nil { log.Fatal(err) } else { log.Printf("Server is off!") } */ } /* func vhExists(vhosthome string) bool { if st, err := os.Stat(vhosthome); !os.IsNotExist(err) { if err == nil { fmode := st.Mode() if fmode.IsDir() { return true } } } return false } func handler(w http.ResponseWriter, r *http.Request) { // Build vhost home dir host := r.Host port := strconv.Itoa(ParamPort) index := strings.Index(host, ":") if index > -1 { port = host[index+1:] host = host[0:index] } // Cut "www" if exists if strings.HasPrefix(host, "www.") { host = host[4:] } VhostHomeDir = ParamWwwDir + host // Check if virtual host exists if !vhExists(VhostHomeDir) { host = "localhost" VhostHomeDir = ParamWwwDir + host } // Set protocol r.URL.Scheme = "http" // Set server name w.Header().Set("Server", "fave.pro/"+constants.ServerVersion) wrap := wrapper.New(&w, r, host, port, ParamWwwDir, VhostHomeDir) // Check if localhost exists if !vhExists(VhostHomeDir) && !strings.HasPrefix(r.URL.Path, "/assets/") { wrap.PrintEnginePageError(errors.New("Folder " + VhostHomeDir + " is not found")) return } // Create and start engine wrap.Run(func(wrapper *wrapper.Wrapper) bool { // Actions action := actions.New(wrapper) if action.Run() { wrapper.Session.Save() return true } // Pages return handlerPage(wrapper) }) } */