Skip to content

Commit ce286f9

Browse files
jpraet6543KN4CK3R
authored
Support custom mime type mapping for text files (#16304)
* Support custom mime type mapping for text files * Apply suggested change to routers/common/repo.go Co-authored-by: KN4CK3R <admin@oldschoolhack.me> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: KN4CK3R <admin@oldschoolhack.me>
1 parent 9979983 commit ce286f9

File tree

6 files changed

+43
-9
lines changed

6 files changed

+43
-9
lines changed

Diff for: integrations/download_test.go

+28
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"net/http"
99
"testing"
1010

11+
"code.gitea.io/gitea/modules/setting"
1112
"github.com/stretchr/testify/assert"
1213
)
1314

@@ -62,3 +63,30 @@ func TestDownloadByIDMediaForSVGUsesSecureHeaders(t *testing.T) {
6263
assert.Equal(t, "image/svg+xml", resp.HeaderMap.Get("Content-Type"))
6364
assert.Equal(t, "nosniff", resp.HeaderMap.Get("X-Content-Type-Options"))
6465
}
66+
67+
func TestDownloadRawTextFileWithoutMimeTypeMapping(t *testing.T) {
68+
defer prepareTestEnv(t)()
69+
70+
session := loginUser(t, "user2")
71+
72+
req := NewRequest(t, "GET", "/user2/repo2/raw/branch/master/test.xml")
73+
resp := session.MakeRequest(t, req, http.StatusOK)
74+
75+
assert.Equal(t, "text/plain; charset=utf-8", resp.HeaderMap.Get("Content-Type"))
76+
}
77+
78+
func TestDownloadRawTextFileWithMimeTypeMapping(t *testing.T) {
79+
defer prepareTestEnv(t)()
80+
setting.MimeTypeMap.Map[".xml"] = "text/xml"
81+
setting.MimeTypeMap.Enabled = true
82+
83+
session := loginUser(t, "user2")
84+
85+
req := NewRequest(t, "GET", "/user2/repo2/raw/branch/master/test.xml")
86+
resp := session.MakeRequest(t, req, http.StatusOK)
87+
88+
assert.Equal(t, "text/xml; charset=utf-8", resp.HeaderMap.Get("Content-Type"))
89+
90+
delete(setting.MimeTypeMap.Map, ".xml")
91+
setting.MimeTypeMap.Enabled = false
92+
}

Diff for: integrations/gitea-repositories-meta/user2/repo2.git/objects/10/32bbf17fbc0d9c95bb5418dabe8f8c99278700

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
x��K
2+
�0Eg� %��":u��􊕦J|������p˭�Q��~%�9ل����G6G� �ͦw(��E4}*���{�)`YƆ�l�e�MJO�ܚ>�����%��^��ݿ�L�!]�N[v#E�6�U~/���0 Z��U'�gpJ5
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
205ac761f3326a7ebe416e8673760016450b5cec
1+
1032bbf17fbc0d9c95bb5418dabe8f8c99278700

Diff for: routers/common/repo.go

+12-8
Original file line numberDiff line numberDiff line change
@@ -64,16 +64,26 @@ func ServeData(ctx *context.Context, name string, size int64, reader io.Reader)
6464

6565
st := typesniffer.DetectContentType(buf)
6666

67+
mappedMimeType := ""
68+
if setting.MimeTypeMap.Enabled {
69+
fileExtension := strings.ToLower(filepath.Ext(name))
70+
mappedMimeType = setting.MimeTypeMap.Map[fileExtension]
71+
}
6772
if st.IsText() || ctx.QueryBool("render") {
6873
cs, err := charset.DetectEncoding(buf)
6974
if err != nil {
7075
log.Error("Detect raw file %s charset failed: %v, using by default utf-8", name, err)
7176
cs = "utf-8"
7277
}
73-
ctx.Resp.Header().Set("Content-Type", "text/plain; charset="+strings.ToLower(cs))
78+
if mappedMimeType == "" {
79+
mappedMimeType = "text/plain"
80+
}
81+
ctx.Resp.Header().Set("Content-Type", mappedMimeType+"; charset="+strings.ToLower(cs))
7482
} else {
7583
ctx.Resp.Header().Set("Access-Control-Expose-Headers", "Content-Disposition")
76-
84+
if mappedMimeType != "" {
85+
ctx.Resp.Header().Set("Content-Type", mappedMimeType)
86+
}
7787
if (st.IsImage() || st.IsPDF()) && (setting.UI.SVG.Enabled || !st.IsSvgImage()) {
7888
ctx.Resp.Header().Set("Content-Disposition", fmt.Sprintf(`inline; filename="%s"`, name))
7989
if st.IsSvgImage() {
@@ -83,12 +93,6 @@ func ServeData(ctx *context.Context, name string, size int64, reader io.Reader)
8393
}
8494
} else {
8595
ctx.Resp.Header().Set("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, name))
86-
if setting.MimeTypeMap.Enabled {
87-
fileExtension := strings.ToLower(filepath.Ext(name))
88-
if mimetype, ok := setting.MimeTypeMap.Map[fileExtension]; ok {
89-
ctx.Resp.Header().Set("Content-Type", mimetype)
90-
}
91-
}
9296
}
9397
}
9498

0 commit comments

Comments
 (0)