mirror of
https://github.com/gin-gonic/gin.git
synced 2026-06-10 06:28:24 +08:00
Merge 2591a34c1dd1b8139e3e7b36386f203ea60a8bbf into f5c267d2f84ba8192dd9c4c67b0490abfa3dfe7a
This commit is contained in:
commit
7f71da4ffe
@ -1320,10 +1320,9 @@ func (c *Context) SSEvent(name string, message any) {
|
|||||||
// indicates "Is client disconnected in middle of stream"
|
// indicates "Is client disconnected in middle of stream"
|
||||||
func (c *Context) Stream(step func(w io.Writer) bool) bool {
|
func (c *Context) Stream(step func(w io.Writer) bool) bool {
|
||||||
w := c.Writer
|
w := c.Writer
|
||||||
clientGone := w.CloseNotify()
|
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case <-clientGone:
|
case <-c.Request.Context().Done():
|
||||||
return true
|
return true
|
||||||
default:
|
default:
|
||||||
keepOpen := step(w)
|
keepOpen := step(w)
|
||||||
|
|||||||
@ -2992,10 +2992,6 @@ func (r *TestResponseRecorder) CloseNotify() <-chan bool {
|
|||||||
return r.closeChannel
|
return r.closeChannel
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *TestResponseRecorder) closeClient() {
|
|
||||||
r.closeChannel <- true
|
|
||||||
}
|
|
||||||
|
|
||||||
func CreateTestResponseRecorder() *TestResponseRecorder {
|
func CreateTestResponseRecorder() *TestResponseRecorder {
|
||||||
return &TestResponseRecorder{
|
return &TestResponseRecorder{
|
||||||
httptest.NewRecorder(),
|
httptest.NewRecorder(),
|
||||||
@ -3006,6 +3002,7 @@ func CreateTestResponseRecorder() *TestResponseRecorder {
|
|||||||
func TestContextStream(t *testing.T) {
|
func TestContextStream(t *testing.T) {
|
||||||
w := CreateTestResponseRecorder()
|
w := CreateTestResponseRecorder()
|
||||||
c, _ := CreateTestContext(w)
|
c, _ := CreateTestContext(w)
|
||||||
|
c.Request, _ = http.NewRequest(http.MethodGet, "", nil)
|
||||||
|
|
||||||
stopStream := true
|
stopStream := true
|
||||||
c.Stream(func(w io.Writer) bool {
|
c.Stream(func(w io.Writer) bool {
|
||||||
@ -3025,10 +3022,12 @@ func TestContextStream(t *testing.T) {
|
|||||||
func TestContextStreamWithClientGone(t *testing.T) {
|
func TestContextStreamWithClientGone(t *testing.T) {
|
||||||
w := CreateTestResponseRecorder()
|
w := CreateTestResponseRecorder()
|
||||||
c, _ := CreateTestContext(w)
|
c, _ := CreateTestContext(w)
|
||||||
|
done, cancel := context.WithCancel(context.Background())
|
||||||
|
c.Request, _ = http.NewRequestWithContext(done, http.MethodGet, "", nil)
|
||||||
|
|
||||||
c.Stream(func(writer io.Writer) bool {
|
c.Stream(func(writer io.Writer) bool {
|
||||||
defer func() {
|
defer func() {
|
||||||
w.closeClient()
|
cancel()
|
||||||
}()
|
}()
|
||||||
|
|
||||||
_, err := writer.Write([]byte("test"))
|
_, err := writer.Write([]byte("test"))
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user