写缓存失败时,允许继续读取源站内容

This commit is contained in:
GoEdgeLab
2023-12-27 20:55:12 +08:00
parent 0f76de73ee
commit e7fb706d8a
3 changed files with 16 additions and 7 deletions

View File

@@ -125,7 +125,6 @@ func (this *MemoryWriter) Close() error {
// 需要在Locker之外 // 需要在Locker之外
defer this.once.Do(func() { defer this.once.Do(func() {
this.endFunc(this.item) this.endFunc(this.item)
this.item = nil // free memory
}) })
if this.item == nil { if this.item == nil {
@@ -164,7 +163,6 @@ func (this *MemoryWriter) Discard() error {
// 需要在Locker之外 // 需要在Locker之外
defer this.once.Do(func() { defer this.once.Do(func() {
this.endFunc(this.item) this.endFunc(this.item)
this.item = nil // free memory
}) })
this.storage.locker.Lock() this.storage.locker.Lock()

View File

@@ -494,7 +494,7 @@ func (this *HTTPWriter) PrepareCache(resp *http.Response, size int64) {
return return
} }
var cacheReader = readers.NewTeeReaderCloser(resp.Body, this.cacheWriter) var cacheReader = readers.NewTeeReaderCloser(resp.Body, this.cacheWriter, false)
resp.Body = cacheReader resp.Body = cacheReader
this.rawReader = cacheReader this.rawReader = cacheReader

View File

@@ -12,12 +12,17 @@ type TeeReaderCloser struct {
onFail func(err error) onFail func(err error)
onEOF func() onEOF func()
mustWrite bool
} }
func NewTeeReaderCloser(reader io.Reader, writer io.Writer) *TeeReaderCloser { // NewTeeReaderCloser
// mustWrite - ensure writing MUST be successfully
func NewTeeReaderCloser(reader io.Reader, writer io.Writer, mustWrite bool) *TeeReaderCloser {
return &TeeReaderCloser{ return &TeeReaderCloser{
r: reader, r: reader,
w: writer, w: writer,
mustWrite: mustWrite,
} }
} }
@@ -26,7 +31,13 @@ func (this *TeeReaderCloser) Read(p []byte) (n int, err error) {
if n > 0 { if n > 0 {
_, wErr := this.w.Write(p[:n]) _, wErr := this.w.Write(p[:n])
if (err == nil || err == io.EOF) && wErr != nil { if (err == nil || err == io.EOF) && wErr != nil {
err = wErr if this.mustWrite {
err = wErr
} else {
if this.onFail != nil {
this.onFail(wErr)
}
}
} }
} }
if err != nil { if err != nil {