|  | @@ -0,0 +1,178 @@
 | 
	
		
			
				|  |  | +package main
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import (
 | 
	
		
			
				|  |  | +	"flag"
 | 
	
		
			
				|  |  | +	"fmt"
 | 
	
		
			
				|  |  | +	"net/http"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	"golang-fave/consts"
 | 
	
		
			
				|  |  | +	"golang-fave/utils"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	"github.com/vladimirok5959/golang-server-bootstrap/bootstrap"
 | 
	
		
			
				|  |  | +	/*
 | 
	
		
			
				|  |  | +		"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
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	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) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		/*
 | 
	
		
			
				|  |  | +			// After callback
 | 
	
		
			
				|  |  | +			w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
 | 
	
		
			
				|  |  | +			w.Header().Set("Content-Type", "text/html")
 | 
	
		
			
				|  |  | +			w.Write([]byte(`
 | 
	
		
			
				|  |  | +				<div>Hello World!</div>
 | 
	
		
			
				|  |  | +				<div><a href="/assets/bootstrap.css">/assets/bootstrap.css</a></div>
 | 
	
		
			
				|  |  | +				<div><a href="/assets/bootstrap.js">/assets/bootstrap.js</a></div>
 | 
	
		
			
				|  |  | +				<div><a href="/assets/jquery.js">/assets/jquery.js</a></div>
 | 
	
		
			
				|  |  | +				<div><a href="/assets/popper.js">/assets/popper.js</a></div>
 | 
	
		
			
				|  |  | +			`))
 | 
	
		
			
				|  |  | +		*/
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	})
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	/*
 | 
	
		
			
				|  |  | +		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)
 | 
	
		
			
				|  |  | +	})
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +*/
 |