mirror of
https://github.com/miniflux/v2.git
synced 2025-09-15 18:57:04 +00:00
refactor(model): add test coverage and simplify ProxifyEnclosureURL
This commit is contained in:
parent
7107ff985f
commit
63891501e5
7 changed files with 746 additions and 46 deletions
|
@ -589,3 +589,145 @@ func TestProxyFilterVideoPosterOnce(t *testing.T) {
|
|||
t.Errorf(`Not expected output: got %s`, output)
|
||||
}
|
||||
}
|
||||
|
||||
func TestShouldProxifyURLWithMimeType(t *testing.T) {
|
||||
testCases := []struct {
|
||||
name string
|
||||
mediaURL string
|
||||
mediaMimeType string
|
||||
mediaProxyOption string
|
||||
mediaProxyResourceTypes []string
|
||||
expected bool
|
||||
}{
|
||||
{
|
||||
name: "Empty URL should not be proxified",
|
||||
mediaURL: "",
|
||||
mediaMimeType: "image/jpeg",
|
||||
mediaProxyOption: "all",
|
||||
mediaProxyResourceTypes: []string{"image"},
|
||||
expected: false,
|
||||
},
|
||||
{
|
||||
name: "Data URL should not be proxified",
|
||||
mediaURL: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==",
|
||||
mediaMimeType: "image/png",
|
||||
mediaProxyOption: "all",
|
||||
mediaProxyResourceTypes: []string{"image"},
|
||||
expected: false,
|
||||
},
|
||||
{
|
||||
name: "HTTP URL with all mode and matching MIME type should be proxified",
|
||||
mediaURL: "http://example.com/image.jpg",
|
||||
mediaMimeType: "image/jpeg",
|
||||
mediaProxyOption: "all",
|
||||
mediaProxyResourceTypes: []string{"image"},
|
||||
expected: true,
|
||||
},
|
||||
{
|
||||
name: "HTTPS URL with all mode and matching MIME type should be proxified",
|
||||
mediaURL: "https://example.com/image.jpg",
|
||||
mediaMimeType: "image/jpeg",
|
||||
mediaProxyOption: "all",
|
||||
mediaProxyResourceTypes: []string{"image"},
|
||||
expected: true,
|
||||
},
|
||||
{
|
||||
name: "HTTP URL with http-only mode and matching MIME type should be proxified",
|
||||
mediaURL: "http://example.com/image.jpg",
|
||||
mediaMimeType: "image/jpeg",
|
||||
mediaProxyOption: "http-only",
|
||||
mediaProxyResourceTypes: []string{"image"},
|
||||
expected: true,
|
||||
},
|
||||
{
|
||||
name: "HTTPS URL with http-only mode should not be proxified",
|
||||
mediaURL: "https://example.com/image.jpg",
|
||||
mediaMimeType: "image/jpeg",
|
||||
mediaProxyOption: "http-only",
|
||||
mediaProxyResourceTypes: []string{"image"},
|
||||
expected: false,
|
||||
},
|
||||
{
|
||||
name: "URL with none mode should not be proxified",
|
||||
mediaURL: "http://example.com/image.jpg",
|
||||
mediaMimeType: "image/jpeg",
|
||||
mediaProxyOption: "none",
|
||||
mediaProxyResourceTypes: []string{"image"},
|
||||
expected: false,
|
||||
},
|
||||
{
|
||||
name: "URL with matching MIME type should be proxified",
|
||||
mediaURL: "http://example.com/video.mp4",
|
||||
mediaMimeType: "video/mp4",
|
||||
mediaProxyOption: "all",
|
||||
mediaProxyResourceTypes: []string{"video"},
|
||||
expected: true,
|
||||
},
|
||||
{
|
||||
name: "URL with non-matching MIME type should not be proxified",
|
||||
mediaURL: "http://example.com/video.mp4",
|
||||
mediaMimeType: "video/mp4",
|
||||
mediaProxyOption: "all",
|
||||
mediaProxyResourceTypes: []string{"image"},
|
||||
expected: false,
|
||||
},
|
||||
{
|
||||
name: "URL with multiple resource types and matching MIME type should be proxified",
|
||||
mediaURL: "http://example.com/audio.mp3",
|
||||
mediaMimeType: "audio/mp3",
|
||||
mediaProxyOption: "all",
|
||||
mediaProxyResourceTypes: []string{"image", "audio", "video"},
|
||||
expected: true,
|
||||
},
|
||||
{
|
||||
name: "URL with multiple resource types but non-matching MIME type should not be proxified",
|
||||
mediaURL: "http://example.com/document.pdf",
|
||||
mediaMimeType: "application/pdf",
|
||||
mediaProxyOption: "all",
|
||||
mediaProxyResourceTypes: []string{"image", "audio", "video"},
|
||||
expected: false,
|
||||
},
|
||||
{
|
||||
name: "URL with empty resource types should not be proxified",
|
||||
mediaURL: "http://example.com/image.jpg",
|
||||
mediaMimeType: "image/jpeg",
|
||||
mediaProxyOption: "all",
|
||||
mediaProxyResourceTypes: []string{},
|
||||
expected: false,
|
||||
},
|
||||
{
|
||||
name: "URL with partial MIME type match should be proxified",
|
||||
mediaURL: "http://example.com/image.jpg",
|
||||
mediaMimeType: "image/jpeg",
|
||||
mediaProxyOption: "all",
|
||||
mediaProxyResourceTypes: []string{"image"},
|
||||
expected: true,
|
||||
},
|
||||
{
|
||||
name: "URL with audio MIME type and audio resource type should be proxified",
|
||||
mediaURL: "http://example.com/song.ogg",
|
||||
mediaMimeType: "audio/ogg",
|
||||
mediaProxyOption: "all",
|
||||
mediaProxyResourceTypes: []string{"audio"},
|
||||
expected: true,
|
||||
},
|
||||
{
|
||||
name: "URL with video MIME type and video resource type should be proxified",
|
||||
mediaURL: "http://example.com/movie.webm",
|
||||
mediaMimeType: "video/webm",
|
||||
mediaProxyOption: "all",
|
||||
mediaProxyResourceTypes: []string{"video"},
|
||||
expected: true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
result := ShouldProxifyURLWithMimeType(tc.mediaURL, tc.mediaMimeType, tc.mediaProxyOption, tc.mediaProxyResourceTypes)
|
||||
if result != tc.expected {
|
||||
t.Errorf("Expected %v, got %v for URL: %s, MIME type: %s, proxy option: %s, resource types: %v",
|
||||
tc.expected, result, tc.mediaURL, tc.mediaMimeType, tc.mediaProxyOption, tc.mediaProxyResourceTypes)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
@ -41,7 +41,7 @@ func genericProxyRewriter(router *mux.Router, proxifyFunction urlProxyRewriter,
|
|||
case "image":
|
||||
doc.Find("img, picture source").Each(func(i int, img *goquery.Selection) {
|
||||
if srcAttrValue, ok := img.Attr("src"); ok {
|
||||
if shouldProxy(srcAttrValue, proxyOption) {
|
||||
if shouldProxifyURL(srcAttrValue, proxyOption) {
|
||||
img.SetAttr("src", proxifyFunction(router, srcAttrValue))
|
||||
}
|
||||
}
|
||||
|
@ -54,7 +54,7 @@ func genericProxyRewriter(router *mux.Router, proxifyFunction urlProxyRewriter,
|
|||
if !slices.Contains(config.Opts.MediaProxyResourceTypes(), "video") {
|
||||
doc.Find("video").Each(func(i int, video *goquery.Selection) {
|
||||
if posterAttrValue, ok := video.Attr("poster"); ok {
|
||||
if shouldProxy(posterAttrValue, proxyOption) {
|
||||
if shouldProxifyURL(posterAttrValue, proxyOption) {
|
||||
video.SetAttr("poster", proxifyFunction(router, posterAttrValue))
|
||||
}
|
||||
}
|
||||
|
@ -64,7 +64,7 @@ func genericProxyRewriter(router *mux.Router, proxifyFunction urlProxyRewriter,
|
|||
case "audio":
|
||||
doc.Find("audio, audio source").Each(func(i int, audio *goquery.Selection) {
|
||||
if srcAttrValue, ok := audio.Attr("src"); ok {
|
||||
if shouldProxy(srcAttrValue, proxyOption) {
|
||||
if shouldProxifyURL(srcAttrValue, proxyOption) {
|
||||
audio.SetAttr("src", proxifyFunction(router, srcAttrValue))
|
||||
}
|
||||
}
|
||||
|
@ -73,13 +73,13 @@ func genericProxyRewriter(router *mux.Router, proxifyFunction urlProxyRewriter,
|
|||
case "video":
|
||||
doc.Find("video, video source").Each(func(i int, video *goquery.Selection) {
|
||||
if srcAttrValue, ok := video.Attr("src"); ok {
|
||||
if shouldProxy(srcAttrValue, proxyOption) {
|
||||
if shouldProxifyURL(srcAttrValue, proxyOption) {
|
||||
video.SetAttr("src", proxifyFunction(router, srcAttrValue))
|
||||
}
|
||||
}
|
||||
|
||||
if posterAttrValue, ok := video.Attr("poster"); ok {
|
||||
if shouldProxy(posterAttrValue, proxyOption) {
|
||||
if shouldProxifyURL(posterAttrValue, proxyOption) {
|
||||
video.SetAttr("poster", proxifyFunction(router, posterAttrValue))
|
||||
}
|
||||
}
|
||||
|
@ -99,7 +99,7 @@ func proxifySourceSet(element *goquery.Selection, router *mux.Router, proxifyFun
|
|||
imageCandidates := sanitizer.ParseSrcSetAttribute(srcsetAttrValue)
|
||||
|
||||
for _, imageCandidate := range imageCandidates {
|
||||
if shouldProxy(imageCandidate.ImageURL, proxyOption) {
|
||||
if shouldProxifyURL(imageCandidate.ImageURL, proxyOption) {
|
||||
imageCandidate.ImageURL = proxifyFunction(router, imageCandidate.ImageURL)
|
||||
}
|
||||
}
|
||||
|
@ -107,15 +107,33 @@ func proxifySourceSet(element *goquery.Selection, router *mux.Router, proxifyFun
|
|||
element.SetAttr("srcset", imageCandidates.String())
|
||||
}
|
||||
|
||||
func shouldProxy(attrValue, proxyOption string) bool {
|
||||
if strings.HasPrefix(attrValue, "data:") {
|
||||
// shouldProxifyURL checks if the media URL should be proxified based on the media proxy option and URL scheme.
|
||||
func shouldProxifyURL(mediaURL, mediaProxyOption string) bool {
|
||||
switch {
|
||||
case mediaURL == "":
|
||||
return false
|
||||
case strings.HasPrefix(mediaURL, "data:"):
|
||||
return false
|
||||
case mediaProxyOption == "all":
|
||||
return true
|
||||
case mediaProxyOption != "none" && !urllib.IsHTTPS(mediaURL):
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
}
|
||||
if proxyOption == "all" {
|
||||
return true
|
||||
}
|
||||
|
||||
// ShouldProxifyURLWithMimeType checks if the media URL should be proxified based on the media proxy option, URL scheme, and MIME type.
|
||||
func ShouldProxifyURLWithMimeType(mediaURL, mediaMimeType, mediaProxyOption string, mediaProxyResourceTypes []string) bool {
|
||||
if !shouldProxifyURL(mediaURL, mediaProxyOption) {
|
||||
return false
|
||||
}
|
||||
if !urllib.IsHTTPS(attrValue) {
|
||||
return true
|
||||
|
||||
for _, mediaType := range mediaProxyResourceTypes {
|
||||
if strings.HasPrefix(mediaMimeType, mediaType+"/") {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue