a simple url shortener in Go (check it out at qurl.org)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

113 lines
2.3 KiB

4 years ago
4 years ago
  1. package pages
  2. import (
  3. "fmt"
  4. "git.binarythought.com/cdramey/qurl/obj"
  5. "git.binarythought.com/cdramey/qurl/storage"
  6. "git.binarythought.com/cdramey/qurl/assets"
  7. "html/template"
  8. "net/http"
  9. )
  10. type RootHandler struct {
  11. Storage storage.Storage
  12. index *StaticContent
  13. css *StaticContent
  14. favi *StaticContent
  15. usage *StaticContent
  16. submit *template.Template
  17. }
  18. func (ctx *RootHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  19. fname := r.URL.Path
  20. switch fname {
  21. case "/index.html":
  22. fallthrough
  23. case "/":
  24. ctx.index.ServeHTTP(w, r)
  25. case "/submit.html":
  26. ctx.ServeSubmit(w, r)
  27. case "/qurl.css":
  28. ctx.css.ServeHTTP(w, r)
  29. case "/favicon.ico":
  30. ctx.favi.ServeHTTP(w, r)
  31. case "/api/usage.html":
  32. ctx.usage.ServeHTTP(w, r)
  33. case "/api/url":
  34. ctx.ServeAPI(w, r)
  35. default:
  36. id, err := obj.FromString(fname[1:len(fname)])
  37. if err != nil {
  38. http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
  39. return
  40. }
  41. q, err := ctx.Storage.GetQURLByID(id)
  42. if err != nil {
  43. http.Error(w, fmt.Sprintf("Database error: %s", err.Error()),
  44. http.StatusInternalServerError)
  45. return
  46. }
  47. if q == nil {
  48. http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
  49. return
  50. }
  51. http.Redirect(w, r, q.URL, http.StatusPermanentRedirect)
  52. }
  53. }
  54. func (ctx *RootHandler) Init() error {
  55. // Initialize the static content object for the index page
  56. data, err := assets.ReadFile("index.html")
  57. if err != nil {
  58. return err
  59. }
  60. ctx.index = &StaticContent{Type: "text/html", Content: data }
  61. ctx.index.Init()
  62. // Initialize the static content object for the css
  63. data, err = assets.ReadFile("qurl.css")
  64. if err != nil {
  65. return err
  66. }
  67. ctx.css = &StaticContent{Type: "text/css", Content: data }
  68. ctx.css.Init()
  69. // Initialize the static content object favicon
  70. data, err = assets.ReadFile("favicon.ico")
  71. if err != nil {
  72. return err
  73. }
  74. ctx.favi = &StaticContent{Type: "image/x-icon", Content: data}
  75. ctx.favi.Init()
  76. // Initialize the api usage instructions
  77. data, err = assets.ReadFile("usage.html")
  78. if err != nil {
  79. return err
  80. }
  81. ctx.usage = &StaticContent{Type: "text/html", Content: data}
  82. ctx.usage.Init()
  83. // Initialize submit page template
  84. data, err = assets.ReadFile("submit.html")
  85. if err != nil {
  86. return err
  87. }
  88. ctx.submit = template.New("submit.html")
  89. _, err = ctx.submit.Parse(string(data))
  90. if err != nil {
  91. return err
  92. }
  93. return nil
  94. }