@@ -14,15 +14,28 @@ import (
1414 "github.com/gorilla/websocket"
1515)
1616
17- func FlushWriter (c * gin.Context ) error {
18- if c .Writer == nil {
17+ func FlushWriter (c * gin.Context ) (err error ) {
18+ defer func () {
19+ if r := recover (); r != nil {
20+ err = fmt .Errorf ("flush panic recovered: %v" , r )
21+ }
22+ }()
23+
24+ if c == nil || c .Writer == nil {
1925 return nil
2026 }
21- if flusher , ok := c . Writer .(http. Flusher ); ok {
22- flusher . Flush ()
23- return nil
27+
28+ if c . Request != nil && c . Request . Context (). Err () != nil {
29+ return fmt . Errorf ( "request context done: %w" , c . Request . Context (). Err ())
2430 }
25- return errors .New ("streaming error: flusher not found" )
31+
32+ flusher , ok := c .Writer .(http.Flusher )
33+ if ! ok {
34+ return errors .New ("streaming error: flusher not found" )
35+ }
36+
37+ flusher .Flush ()
38+ return nil
2639}
2740
2841func SetEventStreamHeaders (c * gin.Context ) {
@@ -66,17 +79,31 @@ func ResponseChunkData(c *gin.Context, resp dto.ResponsesStreamResponse, data st
6679}
6780
6881func StringData (c * gin.Context , str string ) error {
69- //str = strings.TrimPrefix(str, "data: ")
70- //str = strings.TrimSuffix(str, "\r")
82+ if c == nil || c .Writer == nil {
83+ return errors .New ("context or writer is nil" )
84+ }
85+
86+ if c .Request != nil && c .Request .Context ().Err () != nil {
87+ return fmt .Errorf ("request context done: %w" , c .Request .Context ().Err ())
88+ }
89+
7190 c .Render (- 1 , common.CustomEvent {Data : "data: " + str })
72- _ = FlushWriter (c )
73- return nil
91+ return FlushWriter (c )
7492}
7593
7694func PingData (c * gin.Context ) error {
77- c .Writer .Write ([]byte (": PING\n \n " ))
78- _ = FlushWriter (c )
79- return nil
95+ if c == nil || c .Writer == nil {
96+ return errors .New ("context or writer is nil" )
97+ }
98+
99+ if c .Request != nil && c .Request .Context ().Err () != nil {
100+ return fmt .Errorf ("request context done: %w" , c .Request .Context ().Err ())
101+ }
102+
103+ if _ , err := c .Writer .Write ([]byte (": PING\n \n " )); err != nil {
104+ return fmt .Errorf ("write ping data failed: %w" , err )
105+ }
106+ return FlushWriter (c )
80107}
81108
82109func ObjectData (c * gin.Context , object interface {}) error {
0 commit comments