main.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "io"
  6. "log"
  7. "net/http"
  8. "os"
  9. "strconv"
  10. "strings"
  11. "golang-fave/engine/wrapper"
  12. )
  13. const C_Debug = false
  14. var FParamHost string
  15. var FParamPort int
  16. var FParamWwwDir string
  17. var FVhostHomeDir string
  18. func init() {
  19. flag.StringVar(&FParamHost, "host", "0.0.0.0", "server host")
  20. flag.IntVar(&FParamPort, "port", 8080, "server port")
  21. flag.StringVar(&FParamWwwDir, "dir", "", "virtual hosts directory")
  22. flag.Parse()
  23. }
  24. func main() {
  25. if _, err := os.Stat(FParamWwwDir); os.IsNotExist(err) {
  26. fmt.Println("Virtual hosts directory is not exists")
  27. fmt.Println("Example: ./fave -host 127.0.0.1 -port 80 -dir ./hosts")
  28. return
  29. }
  30. if FParamWwwDir[len(FParamWwwDir)-1] != '/' {
  31. FParamWwwDir = FParamWwwDir + "/"
  32. }
  33. http.HandleFunc("/", handler)
  34. fmt.Println("Starting server at " + FParamHost + ":" + strconv.Itoa(FParamPort))
  35. log.Fatal(http.ListenAndServe(FParamHost+":"+strconv.Itoa(FParamPort), nil))
  36. }
  37. func vhExists(vhosthome string) bool {
  38. if fi, err := os.Stat(vhosthome); !os.IsNotExist(err) {
  39. if err == nil {
  40. fmode := fi.Mode()
  41. if fmode.IsDir() {
  42. return true
  43. }
  44. }
  45. }
  46. return false
  47. }
  48. func handler(w http.ResponseWriter, r *http.Request) {
  49. // Build vhost home dir
  50. host := r.Host
  51. port := strconv.Itoa(FParamPort)
  52. index := strings.Index(host, ":")
  53. if index > -1 {
  54. port = host[index+1:]
  55. host = host[0:index]
  56. }
  57. // Cut "www" if exists
  58. if strings.HasPrefix(host, "www.") {
  59. host = host[4:]
  60. }
  61. FVhostHomeDir = FParamWwwDir + host
  62. // Check if virtual host exists
  63. if !vhExists(FVhostHomeDir) {
  64. host = "localhost"
  65. FVhostHomeDir = FParamWwwDir + host
  66. }
  67. // Set protocol
  68. r.URL.Scheme = "http"
  69. // Set server name
  70. w.Header().Set("Server", "fave.pro")
  71. // Create and start engine
  72. wrapper.New(&w, r, host, port, FParamWwwDir, FVhostHomeDir, C_Debug).
  73. Run(func(e *wrapper.Wrapper) bool {
  74. if e.R.URL.Path == "/" {
  75. if !e.Session.IsSetInt("CounterTest") {
  76. e.Session.SetInt("CounterTest", 1)
  77. }
  78. cc, err := e.Session.GetInt("CounterTest")
  79. if err != nil {
  80. cc = 1
  81. }
  82. (*e.W).Header().Set("Content-Type", "text/html")
  83. io.WriteString(*e.W, "Home<br />")
  84. io.WriteString(*e.W, "<a href=\"/static.html\">Static Page</a><br />")
  85. io.WriteString(*e.W, "<a href=\"/robots.txt\">robots.txt</a><br />")
  86. io.WriteString(*e.W, "<a href=\"/static404\">Page 404</a><br />")
  87. io.WriteString(*e.W, "Counter: "+strconv.Itoa(cc))
  88. e.Session.SetInt("CounterTest", cc+1)
  89. return true
  90. }
  91. return false
  92. })
  93. }