@@ -11,8 +11,12 @@ import (
11
11
)
12
12
13
13
var (
14
- headerData = []byte ("data: " )
15
- errorPrefix = []byte (`data: {"error":` )
14
+ dataField = []byte ("data" )
15
+ errorPrefix = []byte (`{"error":` )
16
+ )
17
+
18
+ const (
19
+ splitParts = 2
16
20
)
17
21
18
22
type streamable interface {
@@ -55,13 +59,14 @@ func (stream *streamReader[T]) RecvRaw() ([]byte, error) {
55
59
//nolint:gocognit
56
60
func (stream * streamReader [T ]) processLines () ([]byte , error ) {
57
61
var (
58
- emptyMessagesCount uint
59
- hasErrorPrefix bool
62
+ emptyMessagesCount uint
63
+ dataFieldNotFound bool
64
+ valueHasErrorPrefix bool
60
65
)
61
66
62
67
for {
63
68
rawLine , readErr := stream .reader .ReadBytes ('\n' )
64
- if readErr != nil || hasErrorPrefix {
69
+ if readErr != nil || valueHasErrorPrefix {
65
70
respErr := stream .unmarshalError ()
66
71
if respErr != nil {
67
72
return nil , fmt .Errorf ("error, %w" , respErr .Error )
@@ -70,12 +75,28 @@ func (stream *streamReader[T]) processLines() ([]byte, error) {
70
75
}
71
76
72
77
noSpaceLine := bytes .TrimSpace (rawLine )
73
- if bytes .HasPrefix (noSpaceLine , errorPrefix ) {
74
- hasErrorPrefix = true
78
+
79
+ var value []byte
80
+
81
+ split := bytes .SplitN (noSpaceLine , []byte (":" ), splitParts )
82
+
83
+ if len (split ) != splitParts || ! bytes .Equal (split [0 ], dataField ) {
84
+ dataFieldNotFound = true
85
+ } else {
86
+ value = split [1 ]
87
+
88
+ if bytes .HasPrefix (value , []byte (" " )) {
89
+ value = value [1 :]
90
+ }
91
+
92
+ if bytes .HasPrefix (value , errorPrefix ) {
93
+ valueHasErrorPrefix = true
94
+ }
75
95
}
76
- if ! bytes .HasPrefix (noSpaceLine , headerData ) || hasErrorPrefix {
77
- if hasErrorPrefix {
78
- noSpaceLine = bytes .TrimPrefix (noSpaceLine , headerData )
96
+
97
+ if dataFieldNotFound || valueHasErrorPrefix {
98
+ if valueHasErrorPrefix {
99
+ noSpaceLine = value
79
100
}
80
101
writeErr := stream .errAccumulator .Write (noSpaceLine )
81
102
if writeErr != nil {
@@ -85,11 +106,12 @@ func (stream *streamReader[T]) processLines() ([]byte, error) {
85
106
if emptyMessagesCount > stream .emptyMessagesLimit {
86
107
return nil , ErrTooManyEmptyStreamMessages
87
108
}
109
+ dataFieldNotFound = false
88
110
89
111
continue
90
112
}
91
113
92
- noPrefixLine := bytes . TrimPrefix ( noSpaceLine , headerData )
114
+ noPrefixLine := value
93
115
if string (noPrefixLine ) == "[DONE]" {
94
116
stream .isFinished = true
95
117
return nil , io .EOF
0 commit comments