From 94e4307c1bd722ff10ba01c9c73e0f3a3f4c3f78 Mon Sep 17 00:00:00 2001 From: wangweifeng <952529160@qq.com> Date: Mon, 9 Sep 2024 14:45:12 +0800 Subject: [PATCH 1/3] fix: skip custom body for streaming content types --- net/ghttp/ghttp_middleware_handler_response.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/net/ghttp/ghttp_middleware_handler_response.go b/net/ghttp/ghttp_middleware_handler_response.go index d78b4c1945e..7084fe5d665 100644 --- a/net/ghttp/ghttp_middleware_handler_response.go +++ b/net/ghttp/ghttp_middleware_handler_response.go @@ -7,6 +7,8 @@ package ghttp import ( + "github.com/gogf/gf/v2/text/gstr" + "mime" "net/http" "github.com/gogf/gf/v2/errors/gcode" @@ -29,6 +31,18 @@ func MiddlewareHandlerResponse(r *Request) { return } + //The response will not return any additional custom content or body + mediaType, _, _ := mime.ParseMediaType(r.Response.Header().Get("Content-Type")) + for _, ct := range []string{ + "text/event-stream", + "application/octet-stream", + "multipart/x-mixed-replace", + } { + if gstr.Equal(mediaType, ct) { + return + } + } + var ( msg string err = r.GetError() From 825ea2b04c04b46da29098f3b47fb48f01bb5858 Mon Sep 17 00:00:00 2001 From: wangweifeng <952529160@qq.com> Date: Mon, 9 Sep 2024 15:29:39 +0800 Subject: [PATCH 2/3] chore: correct comment formatting --- net/ghttp/ghttp_middleware_handler_response.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/ghttp/ghttp_middleware_handler_response.go b/net/ghttp/ghttp_middleware_handler_response.go index 7084fe5d665..0dfc31627d8 100644 --- a/net/ghttp/ghttp_middleware_handler_response.go +++ b/net/ghttp/ghttp_middleware_handler_response.go @@ -31,7 +31,7 @@ func MiddlewareHandlerResponse(r *Request) { return } - //The response will not return any additional custom content or body + // The response will not return any additional custom content or body mediaType, _, _ := mime.ParseMediaType(r.Response.Header().Get("Content-Type")) for _, ct := range []string{ "text/event-stream", From 00b5d112dace46bee131c76f9862430a4de798e3 Mon Sep 17 00:00:00 2001 From: wangweifeng <952529160@qq.com> Date: Tue, 10 Sep 2024 18:50:05 +0800 Subject: [PATCH 3/3] 1.test: add test case 2.refactor: improve code readability --- .../ghttp_middleware_handler_response.go | 22 ++++++---- ...tp_z_unit_feature_middleware_basic_test.go | 43 +++++++++++++++++++ 2 files changed, 57 insertions(+), 8 deletions(-) diff --git a/net/ghttp/ghttp_middleware_handler_response.go b/net/ghttp/ghttp_middleware_handler_response.go index 0dfc31627d8..574db50813e 100644 --- a/net/ghttp/ghttp_middleware_handler_response.go +++ b/net/ghttp/ghttp_middleware_handler_response.go @@ -7,7 +7,6 @@ package ghttp import ( - "github.com/gogf/gf/v2/text/gstr" "mime" "net/http" @@ -22,6 +21,17 @@ type DefaultHandlerResponse struct { Data interface{} `json:"data" dc:"Result data for certain request according API definition"` } +const ( + contentTypeEventStream = "text/event-stream" + contentTypeOctetStream = "application/octet-stream" + contentTypeMixedReplace = "multipart/x-mixed-replace" +) + +var ( + // streamContentType is the content types for stream response. + streamContentType = []string{contentTypeEventStream, contentTypeOctetStream, contentTypeMixedReplace} +) + // MiddlewareHandlerResponse is the default middleware handling handler response object and its error. func MiddlewareHandlerResponse(r *Request) { r.Middleware.Next() @@ -31,14 +41,10 @@ func MiddlewareHandlerResponse(r *Request) { return } - // The response will not return any additional custom content or body + // It does not output common response content if it is stream response. mediaType, _, _ := mime.ParseMediaType(r.Response.Header().Get("Content-Type")) - for _, ct := range []string{ - "text/event-stream", - "application/octet-stream", - "multipart/x-mixed-replace", - } { - if gstr.Equal(mediaType, ct) { + for _, ct := range streamContentType { + if mediaType == ct { return } } diff --git a/net/ghttp/ghttp_z_unit_feature_middleware_basic_test.go b/net/ghttp/ghttp_z_unit_feature_middleware_basic_test.go index 4e58eab3d1a..691b426abc3 100644 --- a/net/ghttp/ghttp_z_unit_feature_middleware_basic_test.go +++ b/net/ghttp/ghttp_z_unit_feature_middleware_basic_test.go @@ -772,6 +772,49 @@ func Test_MiddlewareHandlerGzipResponse(t *testing.T) { }) } +func Test_MiddlewareHandlerStreamResponse(t *testing.T) { + s := g.Server(guid.S()) + s.Group("/", func(group *ghttp.RouterGroup) { + group.Middleware(ghttp.MiddlewareHandlerResponse) + + group.GET("/stream/event", func(r *ghttp.Request) { + r.Response.Header().Set("Content-Type", "text/event-stream") + }) + + group.GET("/stream/octet", func(r *ghttp.Request) { + r.Response.Header().Set("Content-Type", "application/octet-stream") + }) + + group.GET("/stream/mixed", func(r *ghttp.Request) { + r.Response.Header().Set("Content-Type", "multipart/x-mixed-replace") + }) + }) + s.SetDumpRouterMap(false) + s.Start() + defer s.Shutdown() + time.Sleep(100 * time.Millisecond) + + gtest.C(t, func(t *gtest.T) { + client := g.Client() + client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())) + + rsp, err := client.Get(ctx, "/stream/event") + t.AssertNil(err) + t.Assert(rsp.StatusCode, http.StatusOK) + t.Assert(rsp.ReadAllString(), "") + + rsp, err = client.Get(ctx, "/stream/octet") + t.AssertNil(err) + t.Assert(rsp.StatusCode, http.StatusOK) + t.Assert(rsp.ReadAllString(), "") + + rsp, err = client.Get(ctx, "/stream/mixed") + t.AssertNil(err) + t.Assert(rsp.StatusCode, http.StatusOK) + t.Assert(rsp.ReadAllString(), "") + }) +} + type testTracerProvider struct{} var _ trace.TracerProvider = &testTracerProvider{}