@@ -31,7 +31,9 @@ func NewDecoder(res *http.Response) Decoder {
31
31
if t , ok := decoderTypes [contentType ]; ok {
32
32
decoder = t (res .Body )
33
33
} else {
34
- decoder = & eventStreamDecoder {rc : res .Body , rdr : bufio .NewReader (res .Body )}
34
+ scn := bufio .NewScanner (res .Body )
35
+ scn .Buffer (nil , bufio .MaxScanTokenSize << 2 )
36
+ decoder = & eventStreamDecoder {rc : res .Body , scn : scn }
35
37
}
36
38
return decoder
37
39
}
@@ -51,48 +53,10 @@ type Event struct {
51
53
type eventStreamDecoder struct {
52
54
evt Event
53
55
rc io.ReadCloser
54
- rdr * bufio.Reader
56
+ scn * bufio.Scanner
55
57
err error
56
58
}
57
59
58
- func line (r * bufio.Reader ) ([]byte , error ) {
59
- var overflow bytes.Buffer
60
-
61
- // To prevent infinite loops, the failsafe stops when a line is
62
- // 100 times longer than the [io.Reader] default buffer size,
63
- // or after 20 failed attempts to find an end of line.
64
- for f := 0 ; f < 100 ; f ++ {
65
- part , isPrefix , err := r .ReadLine ()
66
- if err != nil {
67
- return nil , err
68
- }
69
-
70
- // Happy case, the line fits in the default buffer.
71
- if ! isPrefix && overflow .Len () == 0 {
72
- return part , nil
73
- }
74
-
75
- // Overflow case, append to the buffer.
76
- if isPrefix || overflow .Len () > 0 {
77
- n , err := overflow .Write (part )
78
- if err != nil {
79
- return nil , err
80
- }
81
-
82
- // Didn't find an end of line, heavily increment the failsafe.
83
- if n != r .Size () {
84
- f += 5
85
- }
86
- }
87
-
88
- if ! isPrefix {
89
- return overflow .Bytes (), nil
90
- }
91
- }
92
-
93
- return nil , fmt .Errorf ("ssestream: too many attempts to read a line" )
94
- }
95
-
96
60
func (s * eventStreamDecoder ) Next () bool {
97
61
if s .err != nil {
98
62
return false
@@ -101,16 +65,8 @@ func (s *eventStreamDecoder) Next() bool {
101
65
event := ""
102
66
data := bytes .NewBuffer (nil )
103
67
104
- for {
105
- txt , err := line (s .rdr )
106
- if err == io .EOF {
107
- return false
108
- }
109
-
110
- if err != nil {
111
- s .err = err
112
- break
113
- }
68
+ for s .scn .Scan () {
69
+ txt := s .scn .Bytes ()
114
70
115
71
// Dispatch event on an empty line
116
72
if len (txt ) == 0 {
@@ -147,6 +103,10 @@ func (s *eventStreamDecoder) Next() bool {
147
103
}
148
104
}
149
105
106
+ if s .scn .Err () != nil {
107
+ s .err = s .scn .Err ()
108
+ }
109
+
150
110
return false
151
111
}
152
112
0 commit comments