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.

91 lines
1.9 KiB

  1. package pages
  2. import (
  3. "bytes"
  4. "fmt"
  5. "html/template"
  6. "net/http"
  7. "net"
  8. "qurl/qurl"
  9. "qurl/static"
  10. "qurl/storage"
  11. "time"
  12. )
  13. type SubmitHandler struct {
  14. Storage storage.Storage
  15. template *template.Template
  16. }
  17. type submitPage struct {
  18. Message string
  19. URL string
  20. }
  21. func (ctx *SubmitHandler) Init() error {
  22. ctx.template = template.New("submit.html")
  23. _, err := ctx.template.Parse(string(static.Assets["submit.html"]))
  24. if err != nil {
  25. return err
  26. }
  27. return nil
  28. }
  29. func (ctx *SubmitHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  30. var pg submitPage
  31. u := r.FormValue("url")
  32. if u == "" {
  33. pg.Message = "Not a valid URL."
  34. } else {
  35. q, err := ctx.Storage.GetQURLByURL(u)
  36. if err != nil {
  37. http.Error(w, fmt.Sprintf("Database error: %s", err.Error()),
  38. http.StatusInternalServerError)
  39. return
  40. }
  41. if q != nil {
  42. pg.Message = "URL already exists."
  43. pg.URL = fmt.Sprintf("https://qurl.org/%s", qurl.ToString(q.ID))
  44. } else {
  45. q = &qurl.QURL{
  46. URL: u,
  47. Created: time.Now(),
  48. }
  49. if h, _, err := net.SplitHostPort(r.RemoteAddr); err == nil && h != "" {
  50. q.IP = net.ParseIP(h)
  51. }
  52. if b := r.Header.Get("User-Agent"); b != "" {
  53. q.Browser = b
  54. }
  55. err := q.CheckValid()
  56. if err != nil {
  57. pg.Message = err.Error()
  58. } else {
  59. err := ctx.Storage.AddQURL(q)
  60. if err != nil {
  61. http.Error(w, fmt.Sprintf("Database error: %s", err.Error()),
  62. http.StatusInternalServerError)
  63. return
  64. }
  65. pg.Message = "URL Added."
  66. pg.URL = fmt.Sprintf("https://qurl.org/%s", qurl.ToString(q.ID))
  67. }
  68. }
  69. }
  70. var buf bytes.Buffer
  71. err := ctx.template.Execute(&buf, pg)
  72. if err != nil {
  73. http.Error(w, fmt.Sprintf("Template execute error: %s", err.Error()),
  74. http.StatusInternalServerError)
  75. return
  76. }
  77. w.Header().Set("Content-Length", fmt.Sprintf("%d", buf.Len()))
  78. w.Header().Set("Content-Type", "text/html")
  79. w.Write(buf.Bytes())
  80. }