mirror of
https://github.com/TeaOSLab/EdgeNode.git
synced 2025-11-09 20:10:27 +08:00
当使用Range: bytes=0-访问分区文件缓存时,只有已缓存完整才会允许访问
防止有些客户端软件无法根据返回的Content-Range分段读取内容
This commit is contained in:
@@ -188,6 +188,11 @@ func (this *PartialRanges) Reset() {
|
|||||||
this.Ranges = [][2]int64{}
|
this.Ranges = [][2]int64{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsCompleted 是否已下载完整
|
||||||
|
func (this *PartialRanges) IsCompleted() bool {
|
||||||
|
return len(this.Ranges) == 1 && this.Ranges[0][0] == 0 && this.Ranges[0][1] == this.BodySize-1
|
||||||
|
}
|
||||||
|
|
||||||
func (this *PartialRanges) merge(index int) {
|
func (this *PartialRanges) merge(index int) {
|
||||||
// forward
|
// forward
|
||||||
var lastIndex = index
|
var lastIndex = index
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ func (this *PartialFileReader) InitAutoDiscard(autoDiscard bool) error {
|
|||||||
this.header = this.openFile.header
|
this.header = this.openFile.header
|
||||||
}
|
}
|
||||||
|
|
||||||
isOk := false
|
var isOk = false
|
||||||
|
|
||||||
if autoDiscard {
|
if autoDiscard {
|
||||||
defer func() {
|
defer func() {
|
||||||
@@ -54,9 +54,9 @@ func (this *PartialFileReader) InitAutoDiscard(autoDiscard bool) error {
|
|||||||
var buf = this.meta
|
var buf = this.meta
|
||||||
if len(buf) == 0 {
|
if len(buf) == 0 {
|
||||||
buf = make([]byte, SizeMeta)
|
buf = make([]byte, SizeMeta)
|
||||||
ok, err := this.readToBuff(this.fp, buf)
|
ok, readErr := this.readToBuff(this.fp, buf)
|
||||||
if err != nil {
|
if readErr != nil {
|
||||||
return err
|
return readErr
|
||||||
}
|
}
|
||||||
if !ok {
|
if !ok {
|
||||||
return ErrNotFound
|
return ErrNotFound
|
||||||
@@ -73,10 +73,10 @@ func (this *PartialFileReader) InitAutoDiscard(autoDiscard bool) error {
|
|||||||
this.status = status
|
this.status = status
|
||||||
|
|
||||||
// URL
|
// URL
|
||||||
urlLength := binary.BigEndian.Uint32(buf[SizeExpiresAt+SizeStatus : SizeExpiresAt+SizeStatus+SizeURLLength])
|
var urlLength = binary.BigEndian.Uint32(buf[SizeExpiresAt+SizeStatus : SizeExpiresAt+SizeStatus+SizeURLLength])
|
||||||
|
|
||||||
// header
|
// header
|
||||||
headerSize := int(binary.BigEndian.Uint32(buf[SizeExpiresAt+SizeStatus+SizeURLLength : SizeExpiresAt+SizeStatus+SizeURLLength+SizeHeaderLength]))
|
var headerSize = int(binary.BigEndian.Uint32(buf[SizeExpiresAt+SizeStatus+SizeURLLength : SizeExpiresAt+SizeStatus+SizeURLLength+SizeHeaderLength]))
|
||||||
if headerSize == 0 {
|
if headerSize == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -96,7 +96,7 @@ func (this *PartialFileReader) InitAutoDiscard(autoDiscard bool) error {
|
|||||||
if this.openFileCache != nil && len(this.header) == 0 {
|
if this.openFileCache != nil && len(this.header) == 0 {
|
||||||
if headerSize > 0 && headerSize <= 512 {
|
if headerSize > 0 && headerSize <= 512 {
|
||||||
this.header = make([]byte, headerSize)
|
this.header = make([]byte, headerSize)
|
||||||
_, err := this.fp.Seek(this.headerOffset, io.SeekStart)
|
_, err = this.fp.Seek(this.headerOffset, io.SeekStart)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -140,6 +140,10 @@ func (this *PartialFileReader) Ranges() *PartialRanges {
|
|||||||
return this.ranges
|
return this.ranges
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (this *PartialFileReader) IsCompleted() bool {
|
||||||
|
return this.ranges != nil && this.ranges.IsCompleted()
|
||||||
|
}
|
||||||
|
|
||||||
func (this *PartialFileReader) discard() error {
|
func (this *PartialFileReader) discard() error {
|
||||||
_ = os.Remove(this.rangePath)
|
_ = os.Remove(this.rangePath)
|
||||||
return this.FileReader.discard()
|
return this.FileReader.discard()
|
||||||
|
|||||||
@@ -279,7 +279,7 @@ func (this *HTTPRequest) doCacheRead(useStale bool) (shouldStop bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if len(rangeHeader) > 0 {
|
if len(rangeHeader) > 0 {
|
||||||
pReader, ranges := this.tryPartialReader(storage, key, useStale, rangeHeader)
|
pReader, ranges := this.tryPartialReader(storage, key, useStale, rangeHeader, this.cacheRef.ForcePartialContent)
|
||||||
if pReader != nil {
|
if pReader != nil {
|
||||||
isPartialCache = true
|
isPartialCache = true
|
||||||
reader = pReader
|
reader = pReader
|
||||||
@@ -650,7 +650,7 @@ func (this *HTTPRequest) addExpiresHeader(expiresAt int64) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 尝试读取区间缓存
|
// 尝试读取区间缓存
|
||||||
func (this *HTTPRequest) tryPartialReader(storage caches.StorageInterface, key string, useStale bool, rangeHeader string) (caches.Reader, []rangeutils.Range) {
|
func (this *HTTPRequest) tryPartialReader(storage caches.StorageInterface, key string, useStale bool, rangeHeader string, forcePartialContent bool) (caches.Reader, []rangeutils.Range) {
|
||||||
// 尝试读取Partial cache
|
// 尝试读取Partial cache
|
||||||
if len(rangeHeader) == 0 {
|
if len(rangeHeader) == 0 {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
@@ -678,15 +678,18 @@ func (this *HTTPRequest) tryPartialReader(storage caches.StorageInterface, key s
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// 检查范围
|
// 检查是否已下载完整
|
||||||
//const maxFirstSpan = 16 << 20 // TODO 可以在缓存策略中设置此值
|
if !forcePartialContent &&
|
||||||
for index, r := range ranges {
|
len(ranges) > 0 &&
|
||||||
// 没有指定结束位置时,自动指定一个
|
ranges[0][0] == 0 &&
|
||||||
/**if r.Start() >= 0 && r.End() == -1 {
|
ranges[0][1] < 0 &&
|
||||||
if partialReader.MaxLength() > r.Start()+maxFirstSpan {
|
!partialReader.IsCompleted() {
|
||||||
r[1] = r.Start() + maxFirstSpan
|
return nil, nil
|
||||||
}
|
}
|
||||||
}**/
|
|
||||||
|
// 检查范围
|
||||||
|
// 这里 **切记不要** 为末尾位置指定一个中间值,因为部分软件客户端不支持
|
||||||
|
for index, r := range ranges {
|
||||||
r1, ok := r.Convert(partialReader.MaxLength())
|
r1, ok := r.Convert(partialReader.MaxLength())
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
|
|||||||
Reference in New Issue
Block a user