http_getter.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package server
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "net/http"
  6. "net/url"
  7. "github.com/labstack/echo/v4"
  8. getter "github.com/usememos/memos/plugin/http_getter"
  9. metric "github.com/usememos/memos/plugin/metrics"
  10. )
  11. func (s *Server) registerGetterPublicRoutes(g *echo.Group) {
  12. g.GET("/get/httpmeta", func(c echo.Context) error {
  13. ctx := c.Request().Context()
  14. urlStr := c.QueryParam("url")
  15. if urlStr == "" {
  16. return echo.NewHTTPError(http.StatusBadRequest, "Missing website url")
  17. }
  18. if _, err := url.Parse(urlStr); err != nil {
  19. return echo.NewHTTPError(http.StatusBadRequest, "Wrong url").SetInternal(err)
  20. }
  21. htmlMeta, err := getter.GetHTMLMeta(urlStr)
  22. if err != nil {
  23. return echo.NewHTTPError(http.StatusNotAcceptable, fmt.Sprintf("Failed to get website meta with url: %s", urlStr)).SetInternal(err)
  24. }
  25. s.Collector.Collect(ctx, &metric.Metric{
  26. Name: "getter used",
  27. Labels: map[string]string{
  28. "type": "httpmeta",
  29. },
  30. })
  31. c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSONCharsetUTF8)
  32. if err := json.NewEncoder(c.Response().Writer).Encode(composeResponse(htmlMeta)); err != nil {
  33. return echo.NewHTTPError(http.StatusInternalServerError, "Failed to encode website HTML meta").SetInternal(err)
  34. }
  35. return nil
  36. })
  37. g.GET("/get/image", func(c echo.Context) error {
  38. ctx := c.Request().Context()
  39. urlStr := c.QueryParam("url")
  40. if urlStr == "" {
  41. return echo.NewHTTPError(http.StatusBadRequest, "Missing image url")
  42. }
  43. if _, err := url.Parse(urlStr); err != nil {
  44. return echo.NewHTTPError(http.StatusBadRequest, "Wrong url").SetInternal(err)
  45. }
  46. image, err := getter.GetImage(urlStr)
  47. if err != nil {
  48. return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Failed to get image url: %s", urlStr)).SetInternal(err)
  49. }
  50. s.Collector.Collect(ctx, &metric.Metric{
  51. Name: "getter used",
  52. Labels: map[string]string{
  53. "type": "image",
  54. },
  55. })
  56. c.Response().Writer.WriteHeader(http.StatusOK)
  57. c.Response().Writer.Header().Set("Content-Type", image.Mediatype)
  58. c.Response().Writer.Header().Set(echo.HeaderCacheControl, "max-age=31536000, immutable")
  59. if _, err := c.Response().Writer.Write(image.Blob); err != nil {
  60. return echo.NewHTTPError(http.StatusInternalServerError, "Failed to write image blob").SetInternal(err)
  61. }
  62. return nil
  63. })
  64. }