@@ -137,6 +137,60 @@ func (f *FileStream) CacheFullAndWriter(up *model.UpdateProgress, writer io.Writ
137137 if writer != nil {
138138 reader = io .TeeReader (reader , writer )
139139 }
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+
140194 f .Reader = reader
141195 return f .cache (f .GetSize ())
142196}
@@ -162,7 +216,7 @@ func (f *FileStream) RangeRead(httpRange http_range.Range) (io.Reader, error) {
162216 }
163217
164218 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 ()) {
166220 return io .NewSectionReader (f .peekBuff , httpRange .Start , httpRange .Length ), nil
167221 }
168222
@@ -194,7 +248,7 @@ func (f *FileStream) cache(maxCacheSize int64) (model.File, error) {
194248 f .peekBuff = & buffer.Reader {}
195249 f .oriReader = f .Reader
196250 }
197- bufSize := maxCacheSize - int64 (f .peekBuff .Len ())
251+ bufSize := maxCacheSize - int64 (f .peekBuff .Size ())
198252 var buf []byte
199253 if conf .MmapThreshold > 0 && bufSize >= int64 (conf .MmapThreshold ) {
200254 m , err := mmap .Alloc (int (bufSize ))
@@ -213,7 +267,7 @@ func (f *FileStream) cache(maxCacheSize int64) (model.File, error) {
213267 return nil , fmt .Errorf ("failed to read all data: (expect =%d, actual =%d) %w" , bufSize , n , err )
214268 }
215269 f .peekBuff .Append (buf )
216- if int64 (f .peekBuff .Len ()) >= f .GetSize () {
270+ if int64 (f .peekBuff .Size ()) >= f .GetSize () {
217271 f .Reader = f .peekBuff
218272 f .oriReader = nil
219273 } else {
0 commit comments