core: Fix wrong offset in upload progress notifications
Closes https://github.com/tus/tusd/issues/500
This commit is contained in:
parent
1b11885823
commit
0ad435b4c8
|
@ -497,14 +497,16 @@ func TestPatch(t *testing.T) {
|
||||||
defer ctrl.Finish()
|
defer ctrl.Finish()
|
||||||
upload := NewMockFullUpload(ctrl)
|
upload := NewMockFullUpload(ctrl)
|
||||||
|
|
||||||
|
// We simulate that the upload has already an offset of 10 bytes. Therefore, the progress notifications
|
||||||
|
// must be the sum of the exisiting offset and the newly read bytes.
|
||||||
gomock.InOrder(
|
gomock.InOrder(
|
||||||
store.EXPECT().GetUpload(context.Background(), "yes").Return(upload, nil),
|
store.EXPECT().GetUpload(context.Background(), "yes").Return(upload, nil),
|
||||||
upload.EXPECT().GetInfo(context.Background()).Return(FileInfo{
|
upload.EXPECT().GetInfo(context.Background()).Return(FileInfo{
|
||||||
ID: "yes",
|
ID: "yes",
|
||||||
Offset: 0,
|
Offset: 10,
|
||||||
Size: 100,
|
Size: 100,
|
||||||
}, nil),
|
}, nil),
|
||||||
upload.EXPECT().WriteChunk(context.Background(), int64(0), NewReaderMatcher("first second third")).Return(int64(18), nil),
|
upload.EXPECT().WriteChunk(context.Background(), int64(10), NewReaderMatcher("first second third")).Return(int64(18), nil),
|
||||||
)
|
)
|
||||||
|
|
||||||
handler, _ := NewHandler(Config{
|
handler, _ := NewHandler(Config{
|
||||||
|
@ -525,7 +527,7 @@ func TestPatch(t *testing.T) {
|
||||||
info := event.Upload
|
info := event.Upload
|
||||||
a.Equal("yes", info.ID)
|
a.Equal("yes", info.ID)
|
||||||
a.Equal(int64(100), info.Size)
|
a.Equal(int64(100), info.Size)
|
||||||
a.Equal(int64(6), info.Offset)
|
a.Equal(int64(16), info.Offset)
|
||||||
|
|
||||||
writer.Write([]byte("second "))
|
writer.Write([]byte("second "))
|
||||||
writer.Write([]byte("third"))
|
writer.Write([]byte("third"))
|
||||||
|
@ -534,7 +536,7 @@ func TestPatch(t *testing.T) {
|
||||||
info = event.Upload
|
info = event.Upload
|
||||||
a.Equal("yes", info.ID)
|
a.Equal("yes", info.ID)
|
||||||
a.Equal(int64(100), info.Size)
|
a.Equal(int64(100), info.Size)
|
||||||
a.Equal(int64(18), info.Offset)
|
a.Equal(int64(28), info.Offset)
|
||||||
|
|
||||||
writer.Close()
|
writer.Close()
|
||||||
|
|
||||||
|
@ -548,12 +550,12 @@ func TestPatch(t *testing.T) {
|
||||||
ReqHeader: map[string]string{
|
ReqHeader: map[string]string{
|
||||||
"Tus-Resumable": "1.0.0",
|
"Tus-Resumable": "1.0.0",
|
||||||
"Content-Type": "application/offset+octet-stream",
|
"Content-Type": "application/offset+octet-stream",
|
||||||
"Upload-Offset": "0",
|
"Upload-Offset": "10",
|
||||||
},
|
},
|
||||||
ReqBody: reader,
|
ReqBody: reader,
|
||||||
Code: http.StatusNoContent,
|
Code: http.StatusNoContent,
|
||||||
ResHeader: map[string]string{
|
ResHeader: map[string]string{
|
||||||
"Upload-Offset": "18",
|
"Upload-Offset": "28",
|
||||||
},
|
},
|
||||||
}).Run(handler, t)
|
}).Run(handler, t)
|
||||||
|
|
||||||
|
|
|
@ -986,20 +986,21 @@ func (handler *UnroutedHandler) absFileURL(r *http.Request, id string) string {
|
||||||
// closed.
|
// closed.
|
||||||
func (handler *UnroutedHandler) sendProgressMessages(hook HookEvent, reader *bodyReader) chan<- struct{} {
|
func (handler *UnroutedHandler) sendProgressMessages(hook HookEvent, reader *bodyReader) chan<- struct{} {
|
||||||
previousOffset := int64(0)
|
previousOffset := int64(0)
|
||||||
|
originalOffset := hook.Upload.Offset
|
||||||
stop := make(chan struct{}, 1)
|
stop := make(chan struct{}, 1)
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case <-stop:
|
case <-stop:
|
||||||
hook.Upload.Offset = reader.bytesRead()
|
hook.Upload.Offset = originalOffset + reader.bytesRead()
|
||||||
if hook.Upload.Offset != previousOffset {
|
if hook.Upload.Offset != previousOffset {
|
||||||
handler.UploadProgress <- hook
|
handler.UploadProgress <- hook
|
||||||
previousOffset = hook.Upload.Offset
|
previousOffset = hook.Upload.Offset
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
case <-time.After(1 * time.Second):
|
case <-time.After(1 * time.Second):
|
||||||
hook.Upload.Offset = reader.bytesRead()
|
hook.Upload.Offset = originalOffset + reader.bytesRead()
|
||||||
if hook.Upload.Offset != previousOffset {
|
if hook.Upload.Offset != previousOffset {
|
||||||
handler.UploadProgress <- hook
|
handler.UploadProgress <- hook
|
||||||
previousOffset = hook.Upload.Offset
|
previousOffset = hook.Upload.Offset
|
||||||
|
|
Loading…
Reference in New Issue