Skip to content

Commit 3d63ebf

Browse files
authored
fix(net/ghttp): skip common response body in common response handler for streaming content types (#3762)
1 parent 9b318bb commit 3d63ebf

File tree

2 files changed

+63
-0
lines changed

2 files changed

+63
-0
lines changed

net/ghttp/ghttp_middleware_handler_response.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
package ghttp
88

99
import (
10+
"mime"
1011
"net/http"
1112

1213
"github.com/gogf/gf/v2/errors/gcode"
@@ -20,6 +21,17 @@ type DefaultHandlerResponse struct {
2021
Data interface{} `json:"data" dc:"Result data for certain request according API definition"`
2122
}
2223

24+
const (
25+
contentTypeEventStream = "text/event-stream"
26+
contentTypeOctetStream = "application/octet-stream"
27+
contentTypeMixedReplace = "multipart/x-mixed-replace"
28+
)
29+
30+
var (
31+
// streamContentType is the content types for stream response.
32+
streamContentType = []string{contentTypeEventStream, contentTypeOctetStream, contentTypeMixedReplace}
33+
)
34+
2335
// MiddlewareHandlerResponse is the default middleware handling handler response object and its error.
2436
func MiddlewareHandlerResponse(r *Request) {
2537
r.Middleware.Next()
@@ -29,6 +41,14 @@ func MiddlewareHandlerResponse(r *Request) {
2941
return
3042
}
3143

44+
// It does not output common response content if it is stream response.
45+
mediaType, _, _ := mime.ParseMediaType(r.Response.Header().Get("Content-Type"))
46+
for _, ct := range streamContentType {
47+
if mediaType == ct {
48+
return
49+
}
50+
}
51+
3252
var (
3353
msg string
3454
err = r.GetError()

net/ghttp/ghttp_z_unit_feature_middleware_basic_test.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -772,6 +772,49 @@ func Test_MiddlewareHandlerGzipResponse(t *testing.T) {
772772
})
773773
}
774774

775+
func Test_MiddlewareHandlerStreamResponse(t *testing.T) {
776+
s := g.Server(guid.S())
777+
s.Group("/", func(group *ghttp.RouterGroup) {
778+
group.Middleware(ghttp.MiddlewareHandlerResponse)
779+
780+
group.GET("/stream/event", func(r *ghttp.Request) {
781+
r.Response.Header().Set("Content-Type", "text/event-stream")
782+
})
783+
784+
group.GET("/stream/octet", func(r *ghttp.Request) {
785+
r.Response.Header().Set("Content-Type", "application/octet-stream")
786+
})
787+
788+
group.GET("/stream/mixed", func(r *ghttp.Request) {
789+
r.Response.Header().Set("Content-Type", "multipart/x-mixed-replace")
790+
})
791+
})
792+
s.SetDumpRouterMap(false)
793+
s.Start()
794+
defer s.Shutdown()
795+
time.Sleep(100 * time.Millisecond)
796+
797+
gtest.C(t, func(t *gtest.T) {
798+
client := g.Client()
799+
client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
800+
801+
rsp, err := client.Get(ctx, "/stream/event")
802+
t.AssertNil(err)
803+
t.Assert(rsp.StatusCode, http.StatusOK)
804+
t.Assert(rsp.ReadAllString(), "")
805+
806+
rsp, err = client.Get(ctx, "/stream/octet")
807+
t.AssertNil(err)
808+
t.Assert(rsp.StatusCode, http.StatusOK)
809+
t.Assert(rsp.ReadAllString(), "")
810+
811+
rsp, err = client.Get(ctx, "/stream/mixed")
812+
t.AssertNil(err)
813+
t.Assert(rsp.StatusCode, http.StatusOK)
814+
t.Assert(rsp.ReadAllString(), "")
815+
})
816+
}
817+
775818
type testTracerProvider struct{}
776819

777820
var _ trace.TracerProvider = &testTracerProvider{}

0 commit comments

Comments
 (0)