From 570141eae75e75cb0446708ea1c3ba3a2a910845 Mon Sep 17 00:00:00 2001 From: "Martin W. Kirst" Date: Tue, 3 Oct 2023 12:28:20 +0200 Subject: [PATCH] Use correct mime type when no content is sent (#2515) closes #2514 The fix is simple, just providing a file name, so `http.ServeContent(...)` can set the correct mimeype in case the content is zero bytes. The test was just extended. PS: I would appreciate a `hacktoberfest-accepted` label ;) --------- Co-authored-by: qwerty287 <80460567+qwerty287@users.noreply.github.com> --- server/web/web.go | 8 ++++---- server/web/web_test.go | 26 ++++++++++++++++++-------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/server/web/web.go b/server/web/web.go index df7b95c77..fbd4d3578 100644 --- a/server/web/web.go +++ b/server/web/web.go @@ -72,19 +72,19 @@ func New() (*gin.Engine, error) { } func handleCustomFilesAndAssets(fs *prefixFS) func(ctx *gin.Context) { - serveFileOrEmptyContent := func(w http.ResponseWriter, r *http.Request, localFileName string) { + serveFileOrEmptyContent := func(w http.ResponseWriter, r *http.Request, localFileName, fileName string) { if len(localFileName) > 0 { http.ServeFile(w, r, localFileName) } else { // prefer zero content over sending a 404 Not Found - http.ServeContent(w, r, localFileName, time.Now(), bytes.NewReader([]byte{})) + http.ServeContent(w, r, fileName, time.Now(), bytes.NewReader([]byte{})) } } return func(ctx *gin.Context) { if strings.HasSuffix(ctx.Request.RequestURI, "/assets/custom.js") { - serveFileOrEmptyContent(ctx.Writer, ctx.Request, server.Config.Server.CustomJsFile) + serveFileOrEmptyContent(ctx.Writer, ctx.Request, server.Config.Server.CustomJsFile, "file.js") } else if strings.HasSuffix(ctx.Request.RequestURI, "/assets/custom.css") { - serveFileOrEmptyContent(ctx.Writer, ctx.Request, server.Config.Server.CustomCSSFile) + serveFileOrEmptyContent(ctx.Writer, ctx.Request, server.Config.Server.CustomCSSFile, "file.css") } else { serveFile(fs)(ctx) } diff --git a/server/web/web_test.go b/server/web/web_test.go index 035e55e95..b0bbe5f83 100644 --- a/server/web/web_test.go +++ b/server/web/web_test.go @@ -25,18 +25,27 @@ import ( "github.com/woodpecker-ci/woodpecker/server" ) -func Test_custom_file_returns_OK_and_empty_content(t *testing.T) { +func Test_custom_file_returns_OK_and_empty_content_and_fitting_mimetype(t *testing.T) { gin.SetMode(gin.TestMode) - customFiles := []string{ - "/assets/custom.js", - "/assets/custom.css", + filesToTest := []struct { + fileURL string + shortMimetype string + }{ + { + fileURL: "/assets/custom.js", + shortMimetype: "javascript", // using just the short version, since it depends on the go runtime/version + }, + { + fileURL: "/assets/custom.css", + shortMimetype: "css", // using just the short version, since it depends on the go runtime/version + }, } - for _, f := range customFiles { - t.Run(f, func(t *testing.T) { - request, err := http.NewRequest(http.MethodGet, f, nil) - request.RequestURI = f // additional required for mocking + for _, f := range filesToTest { + t.Run(f.fileURL, func(t *testing.T) { + request, err := http.NewRequest(http.MethodGet, f.fileURL, nil) + request.RequestURI = f.fileURL // additional required for mocking assert.NoError(t, err) rr := httptest.NewRecorder() @@ -45,6 +54,7 @@ func Test_custom_file_returns_OK_and_empty_content(t *testing.T) { assert.Equal(t, 200, rr.Code) assert.Equal(t, []byte(nil), rr.Body.Bytes()) + assert.Contains(t, rr.Header().Get("Content-Type"), f.shortMimetype) }) } }