package main import ( "context" "fmt" "log" "net/http" "os" "os/signal" "syscall" "time" ) const ( sslCert = "./certs/ssl.crt" sslKey = "./certs/ssl.key" ) func init() { fmt.Println("ZPROX started") } // type Matcher struct { // r *http.Request // w http.ResponseWriter // } // func (m *Matcher) MatchHost(str string, f ...func(w http.ResponseWriter, r *http.Request)) { // if m.r.Host == "test.gotest.com" || m.r.Host == "localhost" { // m.w.Write([]byte("test")) // } else { // m.w.Write([]byte("404 page not found")) // m.w.WriteHeader(http.StatusNotFound) // } // } type HandlerFunc func(http.ResponseWriter, *http.Request) // func (h *HandlerFunc) Handle(f func(w http.ResponseWriter, r *http.Request)) { // h = h.HandlerFunc() // // &h.f() // // if r.Host == "test.gotest.com" { // // w.Write([]byte("test")) // // } else { // // w.Write([]byte("404 page not found")) // // w.WriteHeader(http.StatusNotFound) // // } // } // func test(w http.ResponseWriter, r *http.Request) { // if r.Host == "test.gotest.com" { // w.Write([]byte("login")) // } else { // w.Write([]byte("404 page not found")) // w.WriteHeader(http.StatusNotFound) // } // } // func handle(f HandlerFunc) HandlerFunc { // HandlerFunc{}.f[0] // return func(w http.ResponseWriter, r *http.Request) { // f // } // } // type Mux struct { // *Handlers // *Router // } // type Handlers []struct{ http.Handler } // type Router struct{ *http.ServeMux } // func NewMux() *Mux { // r := new(Router) // h := new(Handlers) // return &Mux{Handlers:h,Router:r} // } // func (m *Handlers) Add() { // h := new(Handlers) // m = &Mux{h, r} // &Handlers{f} // } type Router struct{ http.ServeMux } func (r Router) Host(string) { // router.HandleFunc("") } func main() { // var h HandlerFunc // h:=func(a HandlerFunc)HandlerFunc{ router := http.NewServeMux() router.H // h := Handler.Add(func(w http.ResponseWriter, r *http.Request) {}) // http.Handler.ServeHTTP() router.HandleFunc("test.gotest.com/", h) // router.HandleFunc("login.gotest.com/", login) srv := &http.Server{ Addr: ":8443", Handler: router, } go func() { if err := srv.ListenAndServeTLS(sslCert, sslKey); err != nil && err != http.ErrServerClosed { log.Fatalf("Failed to initialize server: %v\n", err) } }() log.Printf("Listening on port %v\n", srv.Addr) // Wait for kill signal of channel quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) // This blocks until a signal is passed into the quit channel <-quit // The context is used to inform the server it has 5 seconds to finish // the request it is currently handling ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() // Shutdown server log.Println("\nShutting down server...") if err := srv.Shutdown(ctx); err != nil { log.Fatalf("Server forced to shutdown: %v\n", err) } }