fix: HTTP filename parsing for mixed encodings and GBK-encoded (#1189)

This commit is contained in:
Copilot authored and GitHub committed 2025-11-29 11:34:50 +08:00
1 parent 49b4d99b5e
commit 2f5fbfb17c
4 files changed
+253 -30

No files matched your search

+39 -3
View File
@@ -42,7 +42,7 @@ func TestFetcher_Resolve(t *testing.T) {
Range: false,
Files: []*base.FileInfo{
{
Name: "测试.zip",
Name: test.TestChineseFileName,
Size: test.BuildSize,
},
},
@@ -52,7 +52,7 @@ func TestFetcher_Resolve(t *testing.T) {
Range: false,
Files: []*base.FileInfo{
{
Name: "测试.zip",
Name: test.TestChineseFileName,
Size: test.BuildSize,
},
},
@@ -62,7 +62,7 @@ func TestFetcher_Resolve(t *testing.T) {
Range: false,
Files: []*base.FileInfo{
{
Name: "测试.zip",
Name: test.TestChineseFileName,
Size: 0,
},
},
@@ -77,6 +77,42 @@ func TestFetcher_Resolve(t *testing.T) {
},
},
}, t)
// Test mixed encoding Content-Disposition where mime.ParseMediaType fails
// due to invalid characters, but filename*= contains the correct UTF-8 encoded name
testResolve(test.StartTestCustomServer, "mixed-encoding", &base.Resource{
Size: test.BuildSize,
Range: false,
Files: []*base.FileInfo{
{
Name: test.TestChineseFileName,
Size: test.BuildSize,
},
},
}, t)
// Test filename*= only (RFC 5987 format)
testResolve(test.StartTestCustomServer, "filename-star", &base.Resource{
Size: test.BuildSize,
Range: false,
Files: []*base.FileInfo{
{
Name: test.TestChineseFileName,
Size: test.BuildSize,
},
},
}, t)
// Test GBK-encoded filename (common on Chinese Windows servers)
// Before fix: "测试.zip" sent as GBK bytes -> parsed as "²âÊÔ.zip" (garbled)
// After fix: correctly decoded back to "测试.zip"
testResolve(test.StartTestCustomServer, "gbk-encoded", &base.Resource{
Size: test.BuildSize,
Range: false,
Files: []*base.FileInfo{
{
Name: test.TestChineseFileName,
Size: test.BuildSize,
},
},
}, t)
fetcher := buildFetcher()
err := fetcher.Resolve(&base.Request{