]> source.dussan.org Git - gitea.git/commitdiff
Support custom mime type mapping for text files (#16304)
authorJimmy Praet <jimmy.praet@telenet.be>
Wed, 30 Jun 2021 21:31:54 +0000 (23:31 +0200)
committerGitHub <noreply@github.com>
Wed, 30 Jun 2021 21:31:54 +0000 (17:31 -0400)
* 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>
integrations/download_test.go
integrations/gitea-repositories-meta/user2/repo2.git/objects/10/32bbf17fbc0d9c95bb5418dabe8f8c99278700 [new file with mode: 0644]
integrations/gitea-repositories-meta/user2/repo2.git/objects/26/f842bcad37fa40a1bb34cbb5ee219ee35d863d [new file with mode: 0644]
integrations/gitea-repositories-meta/user2/repo2.git/objects/ba/1aed4e2ea2443d76cec241b96be4ec990852ec [new file with mode: 0644]
integrations/gitea-repositories-meta/user2/repo2.git/refs/heads/master
routers/common/repo.go

index 305155e9ace48c2739075732d418e1df3732e8de..38de75f476a963c70c13a945a29b0f525fc7ddbb 100644 (file)
@@ -8,6 +8,7 @@ import (
        "net/http"
        "testing"
 
+       "code.gitea.io/gitea/modules/setting"
        "github.com/stretchr/testify/assert"
 )
 
@@ -62,3 +63,30 @@ func TestDownloadByIDMediaForSVGUsesSecureHeaders(t *testing.T) {
        assert.Equal(t, "image/svg+xml", resp.HeaderMap.Get("Content-Type"))
        assert.Equal(t, "nosniff", resp.HeaderMap.Get("X-Content-Type-Options"))
 }
+
+func TestDownloadRawTextFileWithoutMimeTypeMapping(t *testing.T) {
+       defer prepareTestEnv(t)()
+
+       session := loginUser(t, "user2")
+
+       req := NewRequest(t, "GET", "/user2/repo2/raw/branch/master/test.xml")
+       resp := session.MakeRequest(t, req, http.StatusOK)
+
+       assert.Equal(t, "text/plain; charset=utf-8", resp.HeaderMap.Get("Content-Type"))
+}
+
+func TestDownloadRawTextFileWithMimeTypeMapping(t *testing.T) {
+       defer prepareTestEnv(t)()
+       setting.MimeTypeMap.Map[".xml"] = "text/xml"
+       setting.MimeTypeMap.Enabled = true
+
+       session := loginUser(t, "user2")
+
+       req := NewRequest(t, "GET", "/user2/repo2/raw/branch/master/test.xml")
+       resp := session.MakeRequest(t, req, http.StatusOK)
+
+       assert.Equal(t, "text/xml; charset=utf-8", resp.HeaderMap.Get("Content-Type"))
+
+       delete(setting.MimeTypeMap.Map, ".xml")
+       setting.MimeTypeMap.Enabled = false
+}
diff --git a/integrations/gitea-repositories-meta/user2/repo2.git/objects/10/32bbf17fbc0d9c95bb5418dabe8f8c99278700 b/integrations/gitea-repositories-meta/user2/repo2.git/objects/10/32bbf17fbc0d9c95bb5418dabe8f8c99278700
new file mode 100644 (file)
index 0000000..736e408
--- /dev/null
@@ -0,0 +1,2 @@
+x\ 1\9d\8eK
+Â0\14E\1dg\15\99\v%\9f×\17\ 3":uä\16\92ô\8a\95¦J|\82îÞê\12\1c\1e¸çpË­ÖQ´ó~%\rÐ9Ù\84\81à\90\1c\91\1f\ 2\17\14G6GΠ\94\18ͦw(ê\9e\1aæE4}*\81íÙ{Ç)`\19\86\83\ fl\8ceêMî\97\84JO¹Ü\9a>\8eµ¾õ©%\88Þ^¿ÐÝ¿°\17L\98!]ÆN[v\14#\13E½6Î\18U~/\ 5ÿúê0\f\90îU'õ\ 1gpJ5
\ No newline at end of file
diff --git a/integrations/gitea-repositories-meta/user2/repo2.git/objects/26/f842bcad37fa40a1bb34cbb5ee219ee35d863d b/integrations/gitea-repositories-meta/user2/repo2.git/objects/26/f842bcad37fa40a1bb34cbb5ee219ee35d863d
new file mode 100644 (file)
index 0000000..c3e7e77
Binary files /dev/null and b/integrations/gitea-repositories-meta/user2/repo2.git/objects/26/f842bcad37fa40a1bb34cbb5ee219ee35d863d differ
diff --git a/integrations/gitea-repositories-meta/user2/repo2.git/objects/ba/1aed4e2ea2443d76cec241b96be4ec990852ec b/integrations/gitea-repositories-meta/user2/repo2.git/objects/ba/1aed4e2ea2443d76cec241b96be4ec990852ec
new file mode 100644 (file)
index 0000000..add9a3a
Binary files /dev/null and b/integrations/gitea-repositories-meta/user2/repo2.git/objects/ba/1aed4e2ea2443d76cec241b96be4ec990852ec differ
index 10967a9b8a0b93d828906141271b2bb4989de931..334d09ca021555e46a3171e27ad07b771318c1ed 100644 (file)
@@ -1 +1 @@
-205ac761f3326a7ebe416e8673760016450b5cec
+1032bbf17fbc0d9c95bb5418dabe8f8c99278700
index 22403da09765ec5501fe3f7995f6d11d1bf80201..8d33fb07fbbd5f1252c2e7ed8833c1a36561e6ec 100644 (file)
@@ -64,16 +64,26 @@ func ServeData(ctx *context.Context, name string, size int64, reader io.Reader)
 
        st := typesniffer.DetectContentType(buf)
 
+       mappedMimeType := ""
+       if setting.MimeTypeMap.Enabled {
+               fileExtension := strings.ToLower(filepath.Ext(name))
+               mappedMimeType = setting.MimeTypeMap.Map[fileExtension]
+       }
        if st.IsText() || ctx.QueryBool("render") {
                cs, err := charset.DetectEncoding(buf)
                if err != nil {
                        log.Error("Detect raw file %s charset failed: %v, using by default utf-8", name, err)
                        cs = "utf-8"
                }
-               ctx.Resp.Header().Set("Content-Type", "text/plain; charset="+strings.ToLower(cs))
+               if mappedMimeType == "" {
+                       mappedMimeType = "text/plain"
+               }
+               ctx.Resp.Header().Set("Content-Type", mappedMimeType+"; charset="+strings.ToLower(cs))
        } else {
                ctx.Resp.Header().Set("Access-Control-Expose-Headers", "Content-Disposition")
-
+               if mappedMimeType != "" {
+                       ctx.Resp.Header().Set("Content-Type", mappedMimeType)
+               }
                if (st.IsImage() || st.IsPDF()) && (setting.UI.SVG.Enabled || !st.IsSvgImage()) {
                        ctx.Resp.Header().Set("Content-Disposition", fmt.Sprintf(`inline; filename="%s"`, name))
                        if st.IsSvgImage() {
@@ -83,12 +93,6 @@ func ServeData(ctx *context.Context, name string, size int64, reader io.Reader)
                        }
                } else {
                        ctx.Resp.Header().Set("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, name))
-                       if setting.MimeTypeMap.Enabled {
-                               fileExtension := strings.ToLower(filepath.Ext(name))
-                               if mimetype, ok := setting.MimeTypeMap.Map[fileExtension]; ok {
-                                       ctx.Resp.Header().Set("Content-Type", mimetype)
-                               }
-                       }
                }
        }