aboutsummaryrefslogtreecommitdiff
path: root/internal/ui/proxy.go
diff options
context:
space:
mode:
authorGravatar Frédéric Guillot <f@miniflux.net> 2024-10-30 20:11:11 -0700
committerGravatar Frédéric Guillot <f@miniflux.net> 2024-10-30 20:44:19 -0700
commit7c5d6cf35f46be7c295788a7a10cbccada15a8dc (patch)
treee7b74f41811bc37e32f27ae98b7c43e0c95d1f07 /internal/ui/proxy.go
parent39cc1887eae04f65c1cc3c95edae9bd478a6ce36 (diff)
downloadv2-7c5d6cf35f46be7c295788a7a10cbccada15a8dc.tar.gz
v2-7c5d6cf35f46be7c295788a7a10cbccada15a8dc.tar.zst
v2-7c5d6cf35f46be7c295788a7a10cbccada15a8dc.zip
feat(mediaproxy): pass original filename in Content-Disposition header
When you download/save proxified media, the original filename is lost. That information could be retained by passing a header `Content-Disposition: inline; filename="ORIGNAL_FILENAME.EXT"` when serving the media file. The requested URL would still be obfuscated, but if the client downloads the file it'll use that original filename.
Diffstat (limited to 'internal/ui/proxy.go')
-rw-r--r--internal/ui/proxy.go14
1 files changed, 10 insertions, 4 deletions
diff --git a/internal/ui/proxy.go b/internal/ui/proxy.go
index a1984375..8c0f0f61 100644
--- a/internal/ui/proxy.go
+++ b/internal/ui/proxy.go
@@ -12,6 +12,7 @@ import (
"log/slog"
"net/http"
"net/url"
+ "path"
"time"
"miniflux.app/v2/internal/config"
@@ -57,23 +58,23 @@ func (h *handler) mediaProxy(w http.ResponseWriter, r *http.Request) {
return
}
- u, err := url.Parse(string(decodedURL))
+ parsedMediaURL, err := url.Parse(string(decodedURL))
if err != nil {
html.BadRequest(w, r, errors.New("invalid URL provided"))
return
}
- if u.Scheme != "http" && u.Scheme != "https" {
+ if parsedMediaURL.Scheme != "http" && parsedMediaURL.Scheme != "https" {
html.BadRequest(w, r, errors.New("invalid URL provided"))
return
}
- if u.Host == "" {
+ if parsedMediaURL.Host == "" {
html.BadRequest(w, r, errors.New("invalid URL provided"))
return
}
- if !u.IsAbs() {
+ if !parsedMediaURL.IsAbs() {
html.BadRequest(w, r, errors.New("invalid URL provided"))
return
}
@@ -145,6 +146,11 @@ func (h *handler) mediaProxy(w http.ResponseWriter, r *http.Request) {
b.WithStatus(resp.StatusCode)
b.WithHeader("Content-Security-Policy", `default-src 'self'`)
b.WithHeader("Content-Type", resp.Header.Get("Content-Type"))
+
+ if filename := path.Base(parsedMediaURL.Path); filename != "" {
+ b.WithHeader("Content-Disposition", fmt.Sprintf(`inline; filename="%s"`, filename))
+ }
+
forwardedResponseHeader := []string{"Content-Encoding", "Content-Type", "Content-Length", "Accept-Ranges", "Content-Range"}
for _, responseHeaderName := range forwardedResponseHeader {
if resp.Header.Get(responseHeaderName) != "" {