proxy.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package proxy // import "miniflux.app/v2/internal/proxy"
  4. import (
  5. "crypto/hmac"
  6. "crypto/sha256"
  7. "encoding/base64"
  8. "log/slog"
  9. "net/url"
  10. "path"
  11. "miniflux.app/v2/internal/http/route"
  12. "github.com/gorilla/mux"
  13. "miniflux.app/v2/internal/config"
  14. )
  15. // ProxifyURL generates a relative URL for a proxified resource.
  16. func ProxifyURL(router *mux.Router, mediaURL string) string {
  17. if mediaURL == "" {
  18. return ""
  19. }
  20. if customProxyURL := config.Opts.ProxyUrl(); customProxyURL != "" {
  21. return ProxifyURLWithCustomProxy(mediaURL, customProxyURL)
  22. }
  23. mac := hmac.New(sha256.New, config.Opts.ProxyPrivateKey())
  24. mac.Write([]byte(mediaURL))
  25. digest := mac.Sum(nil)
  26. return route.Path(router, "proxy", "encodedDigest", base64.URLEncoding.EncodeToString(digest), "encodedURL", base64.URLEncoding.EncodeToString([]byte(mediaURL)))
  27. }
  28. // AbsoluteProxifyURL generates an absolute URL for a proxified resource.
  29. func AbsoluteProxifyURL(router *mux.Router, host, mediaURL string) string {
  30. if mediaURL == "" {
  31. return ""
  32. }
  33. if customProxyURL := config.Opts.ProxyUrl(); customProxyURL != "" {
  34. return ProxifyURLWithCustomProxy(mediaURL, customProxyURL)
  35. }
  36. proxifiedUrl := ProxifyURL(router, mediaURL)
  37. scheme := "http"
  38. if config.Opts.HTTPS {
  39. scheme = "https"
  40. }
  41. return scheme + "://" + host + proxifiedUrl
  42. }
  43. func ProxifyURLWithCustomProxy(mediaURL, customProxyURL string) string {
  44. if customProxyURL == "" {
  45. return mediaURL
  46. }
  47. proxyUrl, err := url.Parse(customProxyURL)
  48. if err != nil {
  49. slog.Error("Incorrect custom media proxy URL",
  50. slog.String("custom_proxy_url", customProxyURL),
  51. slog.Any("error", err),
  52. )
  53. return mediaURL
  54. }
  55. proxyUrl.Path = path.Join(proxyUrl.Path, base64.URLEncoding.EncodeToString([]byte(mediaURL)))
  56. return proxyUrl.String()
  57. }