main.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package main
  2. import (
  3. "context"
  4. "flag"
  5. "fmt"
  6. "log"
  7. "net/http"
  8. "os"
  9. "os/signal"
  10. "strconv"
  11. "strings"
  12. "time"
  13. "golang-fave/engine/wrapper"
  14. )
  15. const C_Debug = !false
  16. var FParamHost string
  17. var FParamPort int
  18. var FParamWwwDir string
  19. var FVhostHomeDir string
  20. func init() {
  21. flag.StringVar(&FParamHost, "host", "0.0.0.0", "server host")
  22. flag.IntVar(&FParamPort, "port", 8080, "server port")
  23. flag.StringVar(&FParamWwwDir, "dir", "", "virtual hosts directory")
  24. flag.Parse()
  25. }
  26. func main() {
  27. if _, err := os.Stat(FParamWwwDir); os.IsNotExist(err) {
  28. fmt.Println("Virtual hosts directory is not exists")
  29. fmt.Println("Example: ./fave -host 127.0.0.1 -port 80 -dir ./hosts")
  30. return
  31. }
  32. if FParamWwwDir[len(FParamWwwDir)-1] != '/' {
  33. FParamWwwDir = FParamWwwDir + "/"
  34. }
  35. // Handle
  36. mux := http.NewServeMux()
  37. mux.HandleFunc("/", handler)
  38. srv := &http.Server{
  39. Addr: fmt.Sprintf("%s:%d", FParamHost, FParamPort),
  40. Handler: mux,
  41. }
  42. stop := make(chan os.Signal)
  43. signal.Notify(stop, os.Interrupt)
  44. go func() {
  45. log.Printf("Starting server at %s:%d", FParamHost, FParamPort)
  46. if err := srv.ListenAndServe(); err != nil {
  47. if err != http.ErrServerClosed {
  48. log.Fatal(err)
  49. }
  50. }
  51. }()
  52. // Wait for signal
  53. <-stop
  54. log.Printf("Shutting down server...\n")
  55. ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
  56. defer cancel()
  57. if err := srv.Shutdown(ctx); err != nil {
  58. log.Fatal(err)
  59. } else {
  60. log.Printf("Server is off!")
  61. }
  62. }
  63. func vhExists(vhosthome string) bool {
  64. if st, err := os.Stat(vhosthome); !os.IsNotExist(err) {
  65. if err == nil {
  66. fmode := st.Mode()
  67. if fmode.IsDir() {
  68. return true
  69. }
  70. }
  71. }
  72. return false
  73. }
  74. func handler(w http.ResponseWriter, r *http.Request) {
  75. // Build vhost home dir
  76. host := r.Host
  77. port := strconv.Itoa(FParamPort)
  78. index := strings.Index(host, ":")
  79. if index > -1 {
  80. port = host[index+1:]
  81. host = host[0:index]
  82. }
  83. // Cut "www" if exists
  84. if strings.HasPrefix(host, "www.") {
  85. host = host[4:]
  86. }
  87. FVhostHomeDir = FParamWwwDir + host
  88. // Check if virtual host exists
  89. if !vhExists(FVhostHomeDir) {
  90. host = "localhost"
  91. FVhostHomeDir = FParamWwwDir + host
  92. }
  93. // Set protocol
  94. r.URL.Scheme = "http"
  95. // Set server name
  96. w.Header().Set("Server", "fave.pro")
  97. // Create and start engine
  98. wrapper.New(&w, r, host, port, FParamWwwDir, FVhostHomeDir, C_Debug).
  99. Run(func(e *wrapper.Wrapper) bool {
  100. if e.R.URL.Path == "/cp" || strings.HasPrefix(e.R.URL.Path, "/cp/") {
  101. return handleBackEnd(e)
  102. } else {
  103. return handleFrontEnd(e)
  104. }
  105. })
  106. }