main.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "log"
  6. "net/http"
  7. "os"
  8. "strconv"
  9. "strings"
  10. "golang-fave/engine/wrapper"
  11. )
  12. const C_Debug = !false
  13. var FParamHost string
  14. var FParamPort int
  15. var FParamWwwDir string
  16. var FVhostHomeDir string
  17. func init() {
  18. flag.StringVar(&FParamHost, "host", "0.0.0.0", "server host")
  19. flag.IntVar(&FParamPort, "port", 8080, "server port")
  20. flag.StringVar(&FParamWwwDir, "dir", "", "virtual hosts directory")
  21. flag.Parse()
  22. }
  23. func main() {
  24. if _, err := os.Stat(FParamWwwDir); os.IsNotExist(err) {
  25. fmt.Println("Virtual hosts directory is not exists")
  26. fmt.Println("Example: ./fave -host 127.0.0.1 -port 80 -dir ./hosts")
  27. return
  28. }
  29. if FParamWwwDir[len(FParamWwwDir)-1] != '/' {
  30. FParamWwwDir = FParamWwwDir + "/"
  31. }
  32. http.HandleFunc("/", handler)
  33. fmt.Println("Starting server at " + FParamHost + ":" + strconv.Itoa(FParamPort))
  34. log.Fatal(http.ListenAndServe(FParamHost+":"+strconv.Itoa(FParamPort), nil))
  35. }
  36. func vhExists(vhosthome string) bool {
  37. if st, err := os.Stat(vhosthome); !os.IsNotExist(err) {
  38. if err == nil {
  39. fmode := st.Mode()
  40. if fmode.IsDir() {
  41. return true
  42. }
  43. }
  44. }
  45. return false
  46. }
  47. func handler(w http.ResponseWriter, r *http.Request) {
  48. // Build vhost home dir
  49. host := r.Host
  50. port := strconv.Itoa(FParamPort)
  51. index := strings.Index(host, ":")
  52. if index > -1 {
  53. port = host[index+1:]
  54. host = host[0:index]
  55. }
  56. // Cut "www" if exists
  57. if strings.HasPrefix(host, "www.") {
  58. host = host[4:]
  59. }
  60. FVhostHomeDir = FParamWwwDir + host
  61. // Check if virtual host exists
  62. if !vhExists(FVhostHomeDir) {
  63. host = "localhost"
  64. FVhostHomeDir = FParamWwwDir + host
  65. }
  66. // Set protocol
  67. r.URL.Scheme = "http"
  68. // Set server name
  69. w.Header().Set("Server", "fave.pro")
  70. // Create and start engine
  71. wrapper.New(&w, r, host, port, FParamWwwDir, FVhostHomeDir, C_Debug).
  72. Run(func(e *wrapper.Wrapper) bool {
  73. return false
  74. })
  75. }