Skip to content

Commit 9801b91

Browse files
Nealsoni00Acconut
andauthored
handler: Simultaneous support for -01 and -02 of IETF draft (#1066)
* [ADD] support for both draft v01 and v02 for the upload protocol This improves commit 09f105d to support both draft v01 and draft v02 versions of the ietf upload protocol * [ADD] config.go allowheaders * [ADD] tests to cors head and post Patch coming next * [HF] minor be even more explicit on which version has which headers * [ADD] patch test works now * [REFACTOR] don't use slices since not supported Error: pkg/handler/unrouted_handler.go:12:2: package slices is not in GOROOT (/Users/runner/hostedtoolcache/go/1.20.12/x64/src/slices) * [FIX] easy comments * [HF] extract isDraftVersionResumableUploadComplete * [HF] more consistent naming * [HF slightly cleaner code * [HF] comments on functions * [HF] bad find and replace * [REFACTOR] deduplicate code on post_test.go * [REFACTOR] head_test to deduplicate code * [REFACTOR] patch test to not repeat itself + standardize post test with othes * Make interop versions unexported and add comment * Rename some function to be shorter and clearer * Update variable names for distinguishing them * Put setting of Upload-Complete into own function * Typo * Refactor HEAD tests * Refactor POST tests * Refactor PATCH test * Reuse test helper * Move setting of interop version out of unrelated function --------- Co-authored-by: Marius Kleidl <marius@transloadit.com>
1 parent bbc40a9 commit 9801b91

File tree

7 files changed

+488
-413
lines changed

7 files changed

+488
-413
lines changed

pkg/handler/config.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -135,9 +135,9 @@ var DefaultCorsConfig = CorsConfig{
135135
AllowOrigin: regexp.MustCompile(".*"),
136136
AllowCredentials: false,
137137
AllowMethods: "POST, HEAD, PATCH, OPTIONS, GET, DELETE",
138-
AllowHeaders: "Authorization, Origin, X-Requested-With, X-Request-ID, X-HTTP-Method-Override, Content-Type, Upload-Length, Upload-Offset, Tus-Resumable, Upload-Metadata, Upload-Defer-Length, Upload-Concat, Upload-Complete, Upload-Draft-Interop-Version",
138+
AllowHeaders: "Authorization, Origin, X-Requested-With, X-Request-ID, X-HTTP-Method-Override, Content-Type, Upload-Length, Upload-Offset, Tus-Resumable, Upload-Metadata, Upload-Defer-Length, Upload-Concat, Upload-Incomplete, Upload-Complete, Upload-Draft-Interop-Version",
139139
MaxAge: "86400",
140-
ExposeHeaders: "Upload-Offset, Location, Upload-Length, Tus-Version, Tus-Resumable, Tus-Max-Size, Tus-Extension, Upload-Metadata, Upload-Defer-Length, Upload-Concat, Upload-Complete, Upload-Draft-Interop-Version",
140+
ExposeHeaders: "Upload-Offset, Location, Upload-Length, Tus-Version, Tus-Resumable, Tus-Max-Size, Tus-Extension, Upload-Metadata, Upload-Defer-Length, Upload-Concat, Upload-Incomplete, Upload-Complete, Upload-Draft-Interop-Version",
141141
}
142142

143143
func (config *Config) validate() error {

pkg/handler/cors_test.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ func TestCORS(t *testing.T) {
2323
},
2424
Code: http.StatusOK,
2525
ResHeader: map[string]string{
26-
"Access-Control-Allow-Headers": "Authorization, Origin, X-Requested-With, X-Request-ID, X-HTTP-Method-Override, Content-Type, Upload-Length, Upload-Offset, Tus-Resumable, Upload-Metadata, Upload-Defer-Length, Upload-Concat, Upload-Complete, Upload-Draft-Interop-Version",
26+
"Access-Control-Allow-Headers": "Authorization, Origin, X-Requested-With, X-Request-ID, X-HTTP-Method-Override, Content-Type, Upload-Length, Upload-Offset, Tus-Resumable, Upload-Metadata, Upload-Defer-Length, Upload-Concat, Upload-Incomplete, Upload-Complete, Upload-Draft-Interop-Version",
2727
"Access-Control-Allow-Methods": "POST, HEAD, PATCH, OPTIONS, GET, DELETE",
2828
"Access-Control-Max-Age": "86400",
2929
"Access-Control-Allow-Origin": "https://tus.io",
@@ -40,7 +40,7 @@ func TestCORS(t *testing.T) {
4040
},
4141
ResHeader: map[string]string{
4242
"Access-Control-Allow-Origin": "https://tus.io",
43-
"Access-Control-Expose-Headers": "Upload-Offset, Location, Upload-Length, Tus-Version, Tus-Resumable, Tus-Max-Size, Tus-Extension, Upload-Metadata, Upload-Defer-Length, Upload-Concat, Upload-Complete, Upload-Draft-Interop-Version",
43+
"Access-Control-Expose-Headers": "Upload-Offset, Location, Upload-Length, Tus-Version, Tus-Resumable, Tus-Max-Size, Tus-Extension, Upload-Metadata, Upload-Defer-Length, Upload-Concat, Upload-Incomplete, Upload-Complete, Upload-Draft-Interop-Version",
4444
"Vary": "Origin",
4545
"Access-Control-Allow-Methods": "",
4646
"Access-Control-Allow-Headers": "",
@@ -72,7 +72,7 @@ func TestCORS(t *testing.T) {
7272
},
7373
Code: http.StatusOK,
7474
ResHeader: map[string]string{
75-
"Access-Control-Allow-Headers": "Authorization, Origin, X-Requested-With, X-Request-ID, X-HTTP-Method-Override, Content-Type, Upload-Length, Upload-Offset, Tus-Resumable, Upload-Metadata, Upload-Defer-Length, Upload-Concat, Upload-Complete, Upload-Draft-Interop-Version",
75+
"Access-Control-Allow-Headers": "Authorization, Origin, X-Requested-With, X-Request-ID, X-HTTP-Method-Override, Content-Type, Upload-Length, Upload-Offset, Tus-Resumable, Upload-Metadata, Upload-Defer-Length, Upload-Concat, Upload-Incomplete, Upload-Complete, Upload-Draft-Interop-Version",
7676
"Access-Control-Allow-Methods": "POST, HEAD, PATCH, OPTIONS, GET, DELETE",
7777
"Access-Control-Max-Age": "86400",
7878
"Access-Control-Allow-Origin": "http://tus.io",
@@ -89,7 +89,7 @@ func TestCORS(t *testing.T) {
8989
},
9090
ResHeader: map[string]string{
9191
"Access-Control-Allow-Origin": "http://tus.io",
92-
"Access-Control-Expose-Headers": "Upload-Offset, Location, Upload-Length, Tus-Version, Tus-Resumable, Tus-Max-Size, Tus-Extension, Upload-Metadata, Upload-Defer-Length, Upload-Concat, Upload-Complete, Upload-Draft-Interop-Version",
92+
"Access-Control-Expose-Headers": "Upload-Offset, Location, Upload-Length, Tus-Version, Tus-Resumable, Tus-Max-Size, Tus-Extension, Upload-Metadata, Upload-Defer-Length, Upload-Concat, Upload-Incomplete, Upload-Complete, Upload-Draft-Interop-Version",
9393
"Vary": "Origin",
9494
"Access-Control-Allow-Methods": "",
9595
"Access-Control-Allow-Headers": "",

pkg/handler/head_test.go

+100-99
Original file line numberDiff line numberDiff line change
@@ -145,105 +145,106 @@ func TestHead(t *testing.T) {
145145
})
146146

147147
SubTest(t, "ExperimentalProtocol", func(t *testing.T, _ *MockFullDataStore, _ *StoreComposer) {
148-
SubTest(t, "IncompleteUpload", func(t *testing.T, store *MockFullDataStore, composer *StoreComposer) {
149-
ctrl := gomock.NewController(t)
150-
defer ctrl.Finish()
151-
upload := NewMockFullUpload(ctrl)
152-
153-
gomock.InOrder(
154-
store.EXPECT().GetUpload(gomock.Any(), "yes").Return(upload, nil),
155-
upload.EXPECT().GetInfo(gomock.Any()).Return(FileInfo{
156-
SizeIsDeferred: false,
157-
Size: 10,
158-
Offset: 5,
159-
}, nil),
160-
)
161-
162-
handler, _ := NewHandler(Config{
163-
StoreComposer: composer,
164-
EnableExperimentalProtocol: true,
148+
for _, interopVersion := range []string{"3", "4"} {
149+
SubTest(t, "InteropVersion"+interopVersion, func(t *testing.T, _ *MockFullDataStore, _ *StoreComposer) {
150+
SubTest(t, "IncompleteUpload", func(t *testing.T, store *MockFullDataStore, composer *StoreComposer) {
151+
ctrl := gomock.NewController(t)
152+
defer ctrl.Finish()
153+
upload := NewMockFullUpload(ctrl)
154+
155+
gomock.InOrder(
156+
store.EXPECT().GetUpload(gomock.Any(), "yes").Return(upload, nil),
157+
upload.EXPECT().GetInfo(gomock.Any()).Return(FileInfo{
158+
SizeIsDeferred: false,
159+
Size: 10,
160+
Offset: 5,
161+
}, nil),
162+
)
163+
164+
handler, _ := NewHandler(Config{
165+
StoreComposer: composer,
166+
EnableExperimentalProtocol: true,
167+
})
168+
169+
(&httpTest{
170+
Method: "HEAD",
171+
URL: "yes",
172+
ReqHeader: map[string]string{
173+
"Upload-Draft-Interop-Version": interopVersion,
174+
},
175+
Code: http.StatusNoContent,
176+
ResHeader: addIETFUploadCompleteHeader(map[string]string{
177+
"Upload-Draft-Interop-Version": interopVersion,
178+
"Upload-Offset": "5",
179+
}, false, interopVersion),
180+
}).Run(handler, t)
181+
})
182+
183+
SubTest(t, "CompleteUpload", func(t *testing.T, store *MockFullDataStore, composer *StoreComposer) {
184+
ctrl := gomock.NewController(t)
185+
defer ctrl.Finish()
186+
upload := NewMockFullUpload(ctrl)
187+
188+
gomock.InOrder(
189+
store.EXPECT().GetUpload(gomock.Any(), "yes").Return(upload, nil),
190+
upload.EXPECT().GetInfo(gomock.Any()).Return(FileInfo{
191+
SizeIsDeferred: false,
192+
Size: 10,
193+
Offset: 10,
194+
}, nil),
195+
)
196+
197+
handler, _ := NewHandler(Config{
198+
StoreComposer: composer,
199+
EnableExperimentalProtocol: true,
200+
})
201+
202+
(&httpTest{
203+
Method: "HEAD",
204+
URL: "yes",
205+
ReqHeader: map[string]string{
206+
"Upload-Draft-Interop-Version": interopVersion,
207+
},
208+
Code: http.StatusNoContent,
209+
ResHeader: addIETFUploadCompleteHeader(map[string]string{
210+
"Upload-Draft-Interop-Version": interopVersion,
211+
"Upload-Offset": "10",
212+
}, true, interopVersion),
213+
}).Run(handler, t)
214+
})
215+
216+
SubTest(t, "DeferredLength", func(t *testing.T, store *MockFullDataStore, composer *StoreComposer) {
217+
ctrl := gomock.NewController(t)
218+
defer ctrl.Finish()
219+
upload := NewMockFullUpload(ctrl)
220+
221+
gomock.InOrder(
222+
store.EXPECT().GetUpload(gomock.Any(), "yes").Return(upload, nil),
223+
upload.EXPECT().GetInfo(gomock.Any()).Return(FileInfo{
224+
SizeIsDeferred: true,
225+
Offset: 5,
226+
}, nil),
227+
)
228+
229+
handler, _ := NewHandler(Config{
230+
StoreComposer: composer,
231+
EnableExperimentalProtocol: true,
232+
})
233+
234+
(&httpTest{
235+
Method: "HEAD",
236+
URL: "yes",
237+
ReqHeader: map[string]string{
238+
"Upload-Draft-Interop-Version": interopVersion,
239+
},
240+
Code: http.StatusNoContent,
241+
ResHeader: addIETFUploadCompleteHeader(map[string]string{
242+
"Upload-Draft-Interop-Version": interopVersion,
243+
"Upload-Offset": "5",
244+
}, false, interopVersion),
245+
}).Run(handler, t)
246+
})
165247
})
166-
167-
(&httpTest{
168-
Method: "HEAD",
169-
URL: "yes",
170-
ReqHeader: map[string]string{
171-
"Upload-Draft-Interop-Version": "4",
172-
},
173-
Code: http.StatusNoContent,
174-
ResHeader: map[string]string{
175-
"Upload-Draft-Interop-Version": "4",
176-
"Upload-Complete": "?0",
177-
"Upload-Offset": "5",
178-
},
179-
}).Run(handler, t)
180-
})
181-
182-
SubTest(t, "CompleteUpload", func(t *testing.T, store *MockFullDataStore, composer *StoreComposer) {
183-
ctrl := gomock.NewController(t)
184-
defer ctrl.Finish()
185-
upload := NewMockFullUpload(ctrl)
186-
187-
gomock.InOrder(
188-
store.EXPECT().GetUpload(gomock.Any(), "yes").Return(upload, nil),
189-
upload.EXPECT().GetInfo(gomock.Any()).Return(FileInfo{
190-
SizeIsDeferred: false,
191-
Size: 10,
192-
Offset: 10,
193-
}, nil),
194-
)
195-
196-
handler, _ := NewHandler(Config{
197-
StoreComposer: composer,
198-
EnableExperimentalProtocol: true,
199-
})
200-
201-
(&httpTest{
202-
Method: "HEAD",
203-
URL: "yes",
204-
ReqHeader: map[string]string{
205-
"Upload-Draft-Interop-Version": "4",
206-
},
207-
Code: http.StatusNoContent,
208-
ResHeader: map[string]string{
209-
"Upload-Draft-Interop-Version": "4",
210-
"Upload-Complete": "?1",
211-
"Upload-Offset": "10",
212-
},
213-
}).Run(handler, t)
214-
})
215-
216-
SubTest(t, "DeferredLength", func(t *testing.T, store *MockFullDataStore, composer *StoreComposer) {
217-
ctrl := gomock.NewController(t)
218-
defer ctrl.Finish()
219-
upload := NewMockFullUpload(ctrl)
220-
221-
gomock.InOrder(
222-
store.EXPECT().GetUpload(gomock.Any(), "yes").Return(upload, nil),
223-
upload.EXPECT().GetInfo(gomock.Any()).Return(FileInfo{
224-
SizeIsDeferred: true,
225-
Offset: 5,
226-
}, nil),
227-
)
228-
229-
handler, _ := NewHandler(Config{
230-
StoreComposer: composer,
231-
EnableExperimentalProtocol: true,
232-
})
233-
234-
(&httpTest{
235-
Method: "HEAD",
236-
URL: "yes",
237-
ReqHeader: map[string]string{
238-
"Upload-Draft-Interop-Version": "4",
239-
},
240-
Code: http.StatusNoContent,
241-
ResHeader: map[string]string{
242-
"Upload-Draft-Interop-Version": "4",
243-
"Upload-Complete": "?0",
244-
"Upload-Offset": "5",
245-
},
246-
}).Run(handler, t)
247-
})
248+
}
248249
})
249250
}

0 commit comments

Comments
 (0)