Skip to content

Commit 86324d2

Browse files
pnparadisezhiqiang.huangj2rong4cn
authored
fix(net): ensure accurate content-length in response (#749)
* fix(fs): ensure accurate content-length in http2 requests Chrome browsers were unable to preview thumbnails, reporting an 'ERR_HTTP_2_PROTOCOL_ERROR'. This was caused by an incorrect content-length header in the server's response for thumbnail images. This commit corrects the content-length calculation, allowing Chrome and other compliant clients to render thumbnails correctly. * fix(net): ensure accurate content-length in response * 补缺 * . --------- Co-authored-by: zhiqiang.huang <[email protected]> Co-authored-by: j2rong4cn <[email protected]>
1 parent 648079a commit 86324d2

File tree

15 files changed

+104
-50
lines changed

15 files changed

+104
-50
lines changed

drivers/alias/driver.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,11 @@ func (d *Alias) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (
122122
var resultLink *model.Link
123123
if link != nil {
124124
resultLink = &model.Link{
125-
URL: link.URL,
126-
Header: link.Header,
127-
RangeReader: link.RangeReader,
128-
SyncClosers: utils.NewSyncClosers(link),
125+
URL: link.URL,
126+
Header: link.Header,
127+
RangeReader: link.RangeReader,
128+
SyncClosers: utils.NewSyncClosers(link),
129+
ContentLength: link.ContentLength,
129130
}
130131
if link.MFile != nil {
131132
resultLink.RangeReader = &model.FileRangeReader{

drivers/crypt/driver.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,11 @@ func (d *Crypt) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (
256256
return nil, err
257257
}
258258

259-
rrf, err := stream.GetRangeReaderFromLink(remoteFile.GetSize(), remoteLink)
259+
remoteSize := remoteLink.ContentLength
260+
if remoteSize <= 0 {
261+
remoteSize = remoteFile.GetSize()
262+
}
263+
rrf, err := stream.GetRangeReaderFromLink(remoteSize, remoteLink)
260264
if err != nil {
261265
_ = remoteLink.Close()
262266
return nil, fmt.Errorf("the remote storage driver need to be enhanced to support encrytion")
@@ -313,7 +317,8 @@ func (d *Crypt) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (
313317
}
314318
return readSeeker, nil
315319
}),
316-
SyncClosers: utils.NewSyncClosers(remoteLink),
320+
SyncClosers: utils.NewSyncClosers(remoteLink),
321+
ContentLength: remoteSize,
317322
}, nil
318323
}
319324

drivers/local/driver.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,10 +228,17 @@ func (d *Local) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (
228228
if err != nil {
229229
return nil, err
230230
}
231+
// Get thumbnail file size for Content-Length
232+
stat, err := open.Stat()
233+
if err != nil {
234+
open.Close()
235+
return nil, err
236+
}
237+
link.ContentLength = int64(stat.Size())
231238
link.MFile = open
232239
} else {
233240
link.MFile = bytes.NewReader(buf.Bytes())
234-
//link.Header.Set("Content-Length", strconv.Itoa(buf.Len()))
241+
link.ContentLength = int64(buf.Len())
235242
}
236243
} else {
237244
open, err := os.Open(fullPath)

drivers/quark_uc/util.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,12 @@ func (d *QuarkOrUC) getTranscodingLink(file model.Obj) (*model.Link, error) {
149149
return nil, err
150150
}
151151

152-
return &model.Link{URL: resp.Data.VideoList[0].VideoInfo.URL}, nil
152+
return &model.Link{
153+
URL: resp.Data.VideoList[0].VideoInfo.URL,
154+
ContentLength: resp.Data.Size,
155+
Concurrency: 3,
156+
PartSize: 10 * utils.MB,
157+
}, nil
153158
}
154159

155160
func (d *QuarkOrUC) upPre(file model.FileStreamer, parentId string) (UpPreResp, error) {

drivers/quark_uc_tv/util.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@ import (
66
"crypto/sha256"
77
"encoding/hex"
88
"errors"
9-
"github.com/OpenListTeam/OpenList/v4/internal/model"
109
"net/http"
1110
"strconv"
1211
"time"
1312

13+
"github.com/OpenListTeam/OpenList/v4/internal/model"
14+
1415
"github.com/OpenListTeam/OpenList/v4/drivers/base"
1516
"github.com/OpenListTeam/OpenList/v4/internal/op"
1617
"github.com/OpenListTeam/OpenList/v4/pkg/utils"
@@ -228,9 +229,10 @@ func (d *QuarkUCTV) getTranscodingLink(ctx context.Context, file model.Obj) (*mo
228229
}
229230

230231
return &model.Link{
231-
URL: fileLink.Data.VideoInfo[0].URL,
232-
Concurrency: 3,
233-
PartSize: 10 * utils.MB,
232+
URL: fileLink.Data.VideoInfo[0].URL,
233+
Concurrency: 3,
234+
PartSize: 10 * utils.MB,
235+
ContentLength: fileLink.Data.VideoInfo[0].Size,
234236
}, nil
235237
}
236238

internal/fs/copy.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,6 @@ func copyFileBetween2Storages(tsk *CopyTask, srcStorage, dstStorage driver.Drive
161161
if err != nil {
162162
return errors.WithMessagef(err, "failed get src [%s] file", srcFilePath)
163163
}
164-
tsk.SetTotalBytes(srcFile.GetSize())
165164
link, _, err := op.Link(tsk.Ctx(), srcStorage, srcFilePath, model.LinkArgs{})
166165
if err != nil {
167166
return errors.WithMessagef(err, "failed get [%s] link", srcFilePath)
@@ -175,5 +174,6 @@ func copyFileBetween2Storages(tsk *CopyTask, srcStorage, dstStorage driver.Drive
175174
_ = link.Close()
176175
return errors.WithMessagef(err, "failed get [%s] stream", srcFilePath)
177176
}
177+
tsk.SetTotalBytes(ss.GetSize())
178178
return op.Put(tsk.Ctx(), dstStorage, dstDirPath, ss, tsk.SetProgress, true)
179179
}

internal/model/args.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,9 @@ type Link struct {
3333
Expiration *time.Duration // local cache expire Duration
3434

3535
//for accelerating request, use multi-thread downloading
36-
Concurrency int `json:"concurrency"`
37-
PartSize int `json:"part_size"`
36+
Concurrency int `json:"concurrency"`
37+
PartSize int `json:"part_size"`
38+
ContentLength int64 `json:"-"` // 转码视频、缩略图
3839

3940
utils.SyncClosers `json:"-"`
4041
}

internal/offline_download/tool/transfer.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ func transferObjFile(t *TransferTask) error {
291291
_ = link.Close()
292292
return errors.WithMessagef(err, "failed get [%s] stream", t.SrcObjPath)
293293
}
294-
t.SetTotalBytes(srcFile.GetSize())
294+
t.SetTotalBytes(ss.GetSize())
295295
return op.Put(t.Ctx(), t.DstStorage, t.DstDirPath, ss, t.SetProgress)
296296
}
297297

internal/op/fs.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,8 @@ func Link(ctx context.Context, storage driver.Driver, path string, args model.Li
258258
if file.IsDir() {
259259
return nil, nil, errors.WithStack(errs.NotFile)
260260
}
261-
key := Key(storage, path)
261+
262+
key := stdpath.Join(Key(storage, path), args.Type)
262263
if link, ok := linkCache.Get(key); ok {
263264
return link, file, nil
264265
}
@@ -278,6 +279,9 @@ func Link(ctx context.Context, storage driver.Driver, path string, args model.Li
278279

279280
if storage.Config().OnlyLinkMFile {
280281
link, err := fn()
282+
if err != nil {
283+
return nil, nil, err
284+
}
281285
return link, file, err
282286
}
283287

@@ -295,6 +299,10 @@ func Link(ctx context.Context, storage driver.Driver, path string, args model.Li
295299
link.AcquireReference()
296300
}
297301
}
302+
if err != nil {
303+
return nil, nil, err
304+
}
305+
298306
return link, file, err
299307
}
300308

internal/stream/stream.go

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ type SeekableStream struct {
161161
*FileStream
162162
// should have one of belows to support rangeRead
163163
rangeReadCloser model.RangeReadCloserIF
164+
size int64
164165
}
165166

166167
func NewSeekableStream(fs *FileStream, link *model.Link) (*SeekableStream, error) {
@@ -174,7 +175,11 @@ func NewSeekableStream(fs *FileStream, link *model.Link) (*SeekableStream, error
174175
}
175176

176177
if link != nil {
177-
rr, err := GetRangeReaderFromLink(fs.GetSize(), link)
178+
size := link.ContentLength
179+
if size <= 0 {
180+
size = fs.GetSize()
181+
}
182+
rr, err := GetRangeReaderFromLink(size, link)
178183
if err != nil {
179184
return nil, err
180185
}
@@ -184,18 +189,25 @@ func NewSeekableStream(fs *FileStream, link *model.Link) (*SeekableStream, error
184189
return nil, err
185190
}
186191
fs.Add(link)
187-
return &SeekableStream{FileStream: fs}, nil
192+
return &SeekableStream{FileStream: fs, size: size}, nil
188193
}
189194
rrc := &model.RangeReadCloser{
190195
RangeReader: rr,
191196
}
192197
fs.Add(link)
193198
fs.Add(rrc)
194-
return &SeekableStream{FileStream: fs, rangeReadCloser: rrc}, nil
199+
return &SeekableStream{FileStream: fs, rangeReadCloser: rrc, size: size}, nil
195200
}
196201
return nil, fmt.Errorf("illegal seekableStream")
197202
}
198203

204+
func (ss *SeekableStream) GetSize() int64 {
205+
if ss.size > 0 {
206+
return ss.size
207+
}
208+
return ss.FileStream.GetSize()
209+
}
210+
199211
//func (ss *SeekableStream) Peek(length int) {
200212
//
201213
//}

0 commit comments

Comments
 (0)