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.

73 lines
1.6 KiB

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