wrapper.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. package wrapper
  2. import (
  3. "log"
  4. "net"
  5. "net/http"
  6. "os"
  7. "strings"
  8. "golang-fave/engine/sessions"
  9. )
  10. type Wrapper struct {
  11. W *http.ResponseWriter
  12. R *http.Request
  13. VHost string
  14. Port string
  15. DirWww string
  16. DirVhostHome string
  17. RemoteIp string
  18. LoggerAcc *log.Logger
  19. LoggerErr *log.Logger
  20. Session *sessions.Session
  21. Debug bool
  22. }
  23. type handleRun func(e *Wrapper) bool
  24. func New(w *http.ResponseWriter, r *http.Request, vhost string, port string, wwwdir string, vhosthome string, debug bool) *Wrapper {
  25. return &Wrapper{
  26. VHost: vhost,
  27. Port: port,
  28. DirWww: wwwdir,
  29. DirVhostHome: vhosthome,
  30. W: w,
  31. R: r,
  32. Debug: debug,
  33. }
  34. }
  35. func (e *Wrapper) Run(hr handleRun) {
  36. // Populate some values
  37. e.RemoteIp = e.R.RemoteAddr
  38. // Create loggers
  39. e.LoggerAcc = log.New(os.Stdout, e.VHost+", ", log.LstdFlags)
  40. e.LoggerErr = log.New(os.Stdout, e.VHost+", ", log.LstdFlags)
  41. // Attach file for access log
  42. if !e.Debug {
  43. acclogfile, acclogfileerr := os.OpenFile(e.DirVhostHome+"/logs/access.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
  44. if acclogfileerr == nil {
  45. defer acclogfile.Close()
  46. e.LoggerAcc.SetOutput(acclogfile)
  47. }
  48. }
  49. // Attach file for access log
  50. if !e.Debug {
  51. errlogfile, errlogfileerr := os.OpenFile(e.DirVhostHome+"/logs/error.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
  52. if errlogfileerr == nil {
  53. defer errlogfile.Close()
  54. e.LoggerErr.SetOutput(errlogfile)
  55. }
  56. }
  57. // Fix remote IP
  58. if strings.ContainsRune(e.R.RemoteAddr, ':') {
  59. e.RemoteIp, _, _ = net.SplitHostPort(e.R.RemoteAddr)
  60. }
  61. // Redirect to main domain
  62. if e.redirectToMainDomain() {
  63. e.Log("301")
  64. return
  65. }
  66. // Static resource
  67. if e.staticResource() {
  68. e.Log("200")
  69. return
  70. }
  71. // Static file
  72. if e.staticFile() {
  73. e.Log("200")
  74. return
  75. }
  76. // Friendly search engine url
  77. if e.redirectSeoFix() {
  78. e.Log("301")
  79. return
  80. }
  81. // Create and load session
  82. e.Session = sessions.New(e.W, e.R, e.VHost, e.DirVhostHome, e.RemoteIp)
  83. e.Session.Load()
  84. // Set session vars
  85. if !e.Session.IsSetInt("UserId") {
  86. e.Session.SetInt("UserId", 0)
  87. }
  88. if !e.Session.IsSetBool("IsLogged") {
  89. e.Session.SetBool("IsLogged", false)
  90. }
  91. // Logic
  92. ret := false
  93. if hr != nil {
  94. if hr(e) {
  95. ret = true
  96. }
  97. }
  98. // Save session
  99. e.Session.Save()
  100. if ret {
  101. return
  102. }
  103. // Show default page
  104. if e.R.URL.Path == "/" {
  105. e.Log("200")
  106. e.printPageDefault()
  107. } else {
  108. e.LogError("404")
  109. e.printPage404()
  110. }
  111. }
  112. func (e *Wrapper) Log(value string) {
  113. e.LoggerAcc.Println("[ACC] [" + e.R.Method + "] [" + value + "] [" + e.RemoteIp +
  114. "] [" + e.R.URL.Scheme + "://" + e.R.Host + e.R.URL.RequestURI() +
  115. "] [" + e.R.Header.Get("User-Agent") + "]")
  116. }
  117. func (e *Wrapper) LogError(value string) {
  118. e.LoggerErr.Println("[ERR] [" + e.R.Method + "] [" + value + "] [" + e.RemoteIp +
  119. "] [" + e.R.URL.Scheme + "://" + e.R.Host + e.R.URL.RequestURI() +
  120. "] [" + e.R.Header.Get("User-Agent") + "]")
  121. }