url.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package mediaproxy // import "miniflux.app/v2/internal/mediaproxy"
  4. import (
  5. "crypto/hmac"
  6. "crypto/sha256"
  7. "encoding/base64"
  8. "net/url"
  9. "github.com/gorilla/mux"
  10. "miniflux.app/v2/internal/config"
  11. "miniflux.app/v2/internal/http/route"
  12. )
  13. func ProxifyRelativeURL(router *mux.Router, mediaURL string) string {
  14. if mediaURL == "" {
  15. return ""
  16. }
  17. if customProxyURL := config.Opts.MediaCustomProxyURL(); customProxyURL != nil {
  18. return proxifyURLWithCustomProxy(mediaURL, customProxyURL)
  19. }
  20. mac := hmac.New(sha256.New, config.Opts.MediaProxyPrivateKey())
  21. mac.Write([]byte(mediaURL))
  22. digest := mac.Sum(nil)
  23. return route.Path(router, "proxy", "encodedDigest", base64.URLEncoding.EncodeToString(digest), "encodedURL", base64.URLEncoding.EncodeToString([]byte(mediaURL)))
  24. }
  25. func ProxifyAbsoluteURL(router *mux.Router, mediaURL string) string {
  26. if mediaURL == "" {
  27. return ""
  28. }
  29. if customProxyURL := config.Opts.MediaCustomProxyURL(); customProxyURL != nil {
  30. return proxifyURLWithCustomProxy(mediaURL, customProxyURL)
  31. }
  32. // Note that the proxyified URL is relative to the root URL.
  33. proxifiedUrl := ProxifyRelativeURL(router, mediaURL)
  34. absoluteURL, err := url.JoinPath(config.Opts.RootURL(), proxifiedUrl)
  35. if err != nil {
  36. return mediaURL
  37. }
  38. return absoluteURL
  39. }
  40. func proxifyURLWithCustomProxy(mediaURL string, customProxyURL *url.URL) string {
  41. if customProxyURL == nil {
  42. return mediaURL
  43. }
  44. absoluteURL := customProxyURL.JoinPath(base64.URLEncoding.EncodeToString([]byte(mediaURL)))
  45. return absoluteURL.String()
  46. }