wrapper.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. package wrapper
  2. import (
  3. "html/template"
  4. "log"
  5. "net"
  6. "net/http"
  7. "os"
  8. "strings"
  9. "golang-fave/engine/sessions"
  10. )
  11. type handleRun func(e *Wrapper) bool
  12. type tmplDataSystem struct {
  13. PathIcoFav string
  14. PathCssStyles string
  15. PathCssCpStyles string
  16. PathCssBootstrap string
  17. PathJsJquery string
  18. PathJsPopper string
  19. PathJsBootstrap string
  20. }
  21. type tmplDataAll struct {
  22. System tmplDataSystem
  23. Data interface{}
  24. }
  25. type Wrapper struct {
  26. W *http.ResponseWriter
  27. R *http.Request
  28. VHost string
  29. Port string
  30. DirWww string
  31. DirVhostHome string
  32. RemoteIp string
  33. LoggerAcc *log.Logger
  34. LoggerErr *log.Logger
  35. Session *sessions.Session
  36. Debug bool
  37. }
  38. func (e *Wrapper) tmplGetSystemData() tmplDataSystem {
  39. return tmplDataSystem{
  40. PathIcoFav: e.R.URL.Scheme + "://" + e.R.Host + "/assets/sys/fave.ico",
  41. PathCssStyles: e.R.URL.Scheme + "://" + e.R.Host + "/assets/sys/styles.css",
  42. PathCssCpStyles: e.R.URL.Scheme + "://" + e.R.Host + "/assets/cp/styles.css",
  43. PathCssBootstrap: e.R.URL.Scheme + "://" + e.R.Host + "/assets/sys/bootstrap.css",
  44. PathJsJquery: e.R.URL.Scheme + "://" + e.R.Host + "/assets/sys/jquery.js",
  45. PathJsPopper: e.R.URL.Scheme + "://" + e.R.Host + "/assets/sys/popper.js",
  46. PathJsBootstrap: e.R.URL.Scheme + "://" + e.R.Host + "/assets/sys/bootstrap.js",
  47. }
  48. }
  49. func New(w *http.ResponseWriter, r *http.Request, vhost string, port string, wwwdir string, vhosthome string, debug bool) *Wrapper {
  50. return &Wrapper{
  51. VHost: vhost,
  52. Port: port,
  53. DirWww: wwwdir,
  54. DirVhostHome: vhosthome,
  55. W: w,
  56. R: r,
  57. Debug: debug,
  58. }
  59. }
  60. func (e *Wrapper) Run(hRun handleRun) {
  61. // Populate some values
  62. e.RemoteIp = e.R.RemoteAddr
  63. // Create loggers
  64. e.LoggerAcc = log.New(os.Stdout, e.VHost+", ", log.LstdFlags)
  65. e.LoggerErr = log.New(os.Stdout, e.VHost+", ", log.LstdFlags)
  66. // Attach file for access log
  67. if !e.Debug {
  68. acclogfile, acclogfileerr := os.OpenFile(e.DirVhostHome+"/logs/access.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
  69. if acclogfileerr == nil {
  70. defer acclogfile.Close()
  71. e.LoggerAcc.SetOutput(acclogfile)
  72. }
  73. }
  74. // Attach file for access log
  75. if !e.Debug {
  76. errlogfile, errlogfileerr := os.OpenFile(e.DirVhostHome+"/logs/error.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
  77. if errlogfileerr == nil {
  78. defer errlogfile.Close()
  79. e.LoggerErr.SetOutput(errlogfile)
  80. }
  81. }
  82. // Fix remote IP
  83. if strings.ContainsRune(e.R.RemoteAddr, ':') {
  84. e.RemoteIp, _, _ = net.SplitHostPort(e.R.RemoteAddr)
  85. }
  86. // Redirect to main domain
  87. if e.redirectToMainDomain() {
  88. e.Log("301")
  89. return
  90. }
  91. // Static resource
  92. if e.staticResource() {
  93. e.Log("200")
  94. return
  95. }
  96. // Static file
  97. if e.staticFile() {
  98. e.Log("200")
  99. return
  100. }
  101. // Friendly search engine url
  102. if e.redirectSeoFix() {
  103. e.Log("301")
  104. return
  105. }
  106. // Create and load session
  107. e.Session = sessions.New(e.W, e.R, e.VHost, e.DirVhostHome, e.RemoteIp)
  108. e.Session.Load()
  109. // Set session vars
  110. if !e.Session.IsSetInt("UserId") {
  111. e.Session.SetInt("UserId", 0)
  112. }
  113. if !e.Session.IsSetBool("IsLogged") {
  114. e.Session.SetBool("IsLogged", false)
  115. }
  116. // Logic
  117. ret := false
  118. if hRun != nil {
  119. if hRun(e) {
  120. ret = true
  121. }
  122. }
  123. // Save session
  124. e.Session.Save()
  125. if ret {
  126. return
  127. }
  128. // Show default page
  129. if e.R.URL.Path == "/" {
  130. e.Log("200")
  131. e.printPageDefault()
  132. } else {
  133. e.LogError("404")
  134. e.printPage404()
  135. }
  136. }
  137. func (e *Wrapper) Log(value string) {
  138. e.LoggerAcc.Println("[ACC] [" + e.R.Method + "] [" + value + "] [" + e.RemoteIp +
  139. "] [" + e.R.URL.Scheme + "://" + e.R.Host + e.R.URL.RequestURI() +
  140. "] [" + e.R.Header.Get("User-Agent") + "]")
  141. }
  142. func (e *Wrapper) LogError(value string) {
  143. e.LoggerErr.Println("[ERR] [" + e.R.Method + "] [" + value + "] [" + e.RemoteIp +
  144. "] [" + e.R.URL.Scheme + "://" + e.R.Host + e.R.URL.RequestURI() +
  145. "] [" + e.R.Header.Get("User-Agent") + "]")
  146. }
  147. func (e *Wrapper) TmplFrontEnd(tname string, data interface{}) bool {
  148. tmpl, err := template.ParseFiles(
  149. e.DirVhostHome+"/template"+"/"+tname+".html",
  150. e.DirVhostHome+"/template"+"/header.html",
  151. e.DirVhostHome+"/template"+"/sidebar.html",
  152. e.DirVhostHome+"/template"+"/footer.html",
  153. )
  154. if err != nil {
  155. e.printTmplPageError(err)
  156. return true
  157. }
  158. tmpl.Execute(*e.W, tmplDataAll{
  159. System: e.tmplGetSystemData(),
  160. Data: data,
  161. })
  162. return true
  163. }
  164. func (e *Wrapper) TmplBackEnd(tcont []byte, data interface{}) bool {
  165. tmpl, err := template.New("template").Parse(string(tcont))
  166. if err != nil {
  167. e.printTmplPageError(err)
  168. return true
  169. }
  170. tmpl.Execute(*e.W, tmplDataAll{
  171. System: e.tmplGetSystemData(),
  172. Data: data,
  173. })
  174. return true
  175. }