@@ -137,6 +137,60 @@ func (f *FileStream) CacheFullAndWriter(up *model.UpdateProgress, writer io.Writ
137
137
if writer != nil {
138
138
reader = io .TeeReader (reader , writer )
139
139
}
140
+
141
+ if f .GetSize () < 0 {
142
+ if f .peekBuff == nil {
143
+ f .peekBuff = & buffer.Reader {}
144
+ }
145
+ // 检查是否有数据
146
+ buf := []byte {0 }
147
+ n , err := io .ReadFull (reader , buf )
148
+ if n > 0 {
149
+ f .peekBuff .Append (buf [:n ])
150
+ }
151
+ if err == io .ErrUnexpectedEOF {
152
+ f .size = f .peekBuff .Size ()
153
+ f .Reader = f .peekBuff
154
+ return f .peekBuff , nil
155
+ } else if err != nil {
156
+ return nil , err
157
+ }
158
+ if conf .MaxBufferLimit - n > conf .MmapThreshold && conf .MmapThreshold > 0 {
159
+ m , err := mmap .Alloc (conf .MaxBufferLimit - n )
160
+ if err == nil {
161
+ f .Add (utils .CloseFunc (func () error {
162
+ return mmap .Free (m )
163
+ }))
164
+ n , err = io .ReadFull (reader , m )
165
+ if n > 0 {
166
+ f .peekBuff .Append (m [:n ])
167
+ }
168
+ if err == io .ErrUnexpectedEOF {
169
+ f .size = f .peekBuff .Size ()
170
+ f .Reader = f .peekBuff
171
+ return f .peekBuff , nil
172
+ } else if err != nil {
173
+ return nil , err
174
+ }
175
+ }
176
+ }
177
+
178
+ tmpF , err := utils .CreateTempFile (reader , 0 )
179
+ if err != nil {
180
+ return nil , err
181
+ }
182
+ f .Add (utils .CloseFunc (func () error {
183
+ return errors .Join (tmpF .Close (), os .RemoveAll (tmpF .Name ()))
184
+ }))
185
+ peekF , err := buffer .NewPeekFile (f .peekBuff , tmpF )
186
+ if err != nil {
187
+ return nil , err
188
+ }
189
+ f .size = peekF .Size ()
190
+ f .Reader = peekF
191
+ return peekF , nil
192
+ }
193
+
140
194
f .Reader = reader
141
195
return f .cache (f .GetSize ())
142
196
}
@@ -162,7 +216,7 @@ func (f *FileStream) RangeRead(httpRange http_range.Range) (io.Reader, error) {
162
216
}
163
217
164
218
size := httpRange .Start + httpRange .Length
165
- if f .peekBuff != nil && size <= int64 (f .peekBuff .Len ()) {
219
+ if f .peekBuff != nil && size <= int64 (f .peekBuff .Size ()) {
166
220
return io .NewSectionReader (f .peekBuff , httpRange .Start , httpRange .Length ), nil
167
221
}
168
222
@@ -194,7 +248,7 @@ func (f *FileStream) cache(maxCacheSize int64) (model.File, error) {
194
248
f .peekBuff = & buffer.Reader {}
195
249
f .oriReader = f .Reader
196
250
}
197
- bufSize := maxCacheSize - int64 (f .peekBuff .Len ())
251
+ bufSize := maxCacheSize - int64 (f .peekBuff .Size ())
198
252
var buf []byte
199
253
if conf .MmapThreshold > 0 && bufSize >= int64 (conf .MmapThreshold ) {
200
254
m , err := mmap .Alloc (int (bufSize ))
@@ -213,7 +267,7 @@ func (f *FileStream) cache(maxCacheSize int64) (model.File, error) {
213
267
return nil , fmt .Errorf ("failed to read all data: (expect =%d, actual =%d) %w" , bufSize , n , err )
214
268
}
215
269
f .peekBuff .Append (buf )
216
- if int64 (f .peekBuff .Len ()) >= f .GetSize () {
270
+ if int64 (f .peekBuff .Size ()) >= f .GetSize () {
217
271
f .Reader = f .peekBuff
218
272
f .oriReader = nil
219
273
} else {
0 commit comments