@@ -40,28 +40,41 @@ func (t *target) s3Handler(w http.ResponseWriter, r *http.Request) {
4040 switch r .Method {
4141 case http .MethodHead :
4242 t .headObjS3 (w , r , apiItems )
43+ return
44+ case http .MethodGet , http .MethodPut , http .MethodDelete , http .MethodPost :
45+ // dpq parsed below
46+ default :
47+ cmn .WriteErr405 (w , r , http .MethodDelete , http .MethodGet , http .MethodHead , http .MethodPut , http .MethodPost )
48+ return
49+ }
50+
51+ dpq := dpqAlloc ()
52+ defer dpqFree (dpq )
53+ if err := dpq .parse (r .URL .RawQuery ); err != nil {
54+ s3 .WriteErr (w , r , s3.ErrInfo {Err : err })
55+ return
56+ }
57+ dpq .isS3 = true
58+
59+ switch r .Method {
4360 case http .MethodGet :
44- t .getObjS3 (w , r , apiItems )
61+ t .getObjS3 (w , r , apiItems , dpq )
4562 case http .MethodPut :
46- config := cmn .GCO .Get ()
47- t .putCopyMpt (w , r , config , apiItems )
63+ t .putCopyMpt (w , r , cmn .GCO .Get (), dpq , apiItems )
4864 case http .MethodDelete :
49- q := r .URL .Query ()
50- if q .Has (s3 .QparamMptUploadID ) {
51- t .abortMptS3 (w , r , apiItems , q )
65+ if dpq .has (s3 .QparamMptUploadID ) {
66+ t .abortMptS3 (w , r , dpq , apiItems )
5267 } else {
5368 t .delObjS3 (w , r , apiItems )
5469 }
5570 case http .MethodPost :
56- t .postObjS3 (w , r , apiItems )
57- default :
58- cmn .WriteErr405 (w , r , http .MethodDelete , http .MethodGet , http .MethodHead , http .MethodPut , http .MethodPost )
71+ t .postObjS3 (w , r , apiItems , dpq )
5972 }
6073}
6174
6275// PUT /s3/<bucket-name>/<object-name>
6376// [switch] mpt | put | copy
64- func (t * target ) putCopyMpt (w http.ResponseWriter , r * http.Request , config * cmn.Config , items []string ) {
77+ func (t * target ) putCopyMpt (w http.ResponseWriter , r * http.Request , config * cmn.Config , dpq * dpq , items []string ) {
6578 cs := fs .Cap ()
6679 if cs .IsOOS () {
6780 s3 .WriteErr (w , r , s3.ErrInfo {Err : cs .Err (), Status : http .StatusInsufficientStorage })
@@ -77,9 +90,8 @@ func (t *target) putCopyMpt(w http.ResponseWriter, r *http.Request, config *cmn.
7790 s3 .HandleAwsChunked (r )
7891 }
7992
80- q := r .URL .Query ()
8193 switch {
82- case q . Has (s3 .QparamMptPartNo ) && q . Has (s3 .QparamMptUploadID ):
94+ case dpq . has (s3 .QparamMptPartNo ) && dpq . has (s3 .QparamMptUploadID ):
8395 if r .Header .Get (cos .S3HdrObjSrc ) != "" {
8496 // TODO:
8597 // copy another object (or its range) => part of the specified multipart upload.
@@ -89,16 +101,16 @@ func (t *target) putCopyMpt(w http.ResponseWriter, r *http.Request, config *cmn.
89101 return
90102 }
91103 if cmn .Rom .V (5 , cos .ModS3 ) {
92- nlog .Infoln ("putPartMpt" , bck .String (), items , q )
104+ nlog .Infoln ("putPartMpt" , bck .String (), items , dpq . m )
93105 }
94- t .putPartMptS3 (w , r , items , q , bck )
106+ t .putPartMptS3 (w , r , dpq , bck , items )
95107 case r .Header .Get (cos .S3HdrObjSrc ) == "" :
96108 objName , errN := s3 .JoinValidateOname (w , r , items )
97109 if errN != nil {
98110 return
99111 }
100112 lom := core .AllocLOM (objName )
101- t .putObjS3 (w , r , bck , config , lom )
113+ t .putObjS3 (w , r , bck , config , lom , dpq )
102114 core .FreeLOM (lom )
103115 default :
104116 t .copyObjS3 (w , r , config , items )
@@ -201,7 +213,7 @@ func (t *target) copyObjS3(w http.ResponseWriter, r *http.Request, config *cmn.C
201213 sgl .Free ()
202214}
203215
204- func (t * target ) putObjS3 (w http.ResponseWriter , r * http.Request , bck * meta.Bck , config * cmn.Config , lom * core.LOM ) {
216+ func (t * target ) putObjS3 (w http.ResponseWriter , r * http.Request , bck * meta.Bck , config * cmn.Config , lom * core.LOM , dpq * dpq ) {
205217 if err := lom .InitBck (bck ); err != nil {
206218 if cmn .IsErrRemoteBckNotFound (err ) {
207219 t .BMDVersionFixup (r )
@@ -215,14 +227,6 @@ func (t *target) putObjS3(w http.ResponseWriter, r *http.Request, bck *meta.Bck,
215227 started := time .Now ()
216228 lom .SetAtimeUnix (started .UnixNano ())
217229
218- // TODO: dual checksumming, e.g. lom.SetCustom(apc.AWS, ...)
219-
220- dpq := dpqAlloc ()
221- if err := dpq .parse (r .URL .RawQuery ); err != nil {
222- s3 .WriteErr (w , r , s3.ErrInfo {Err : err })
223- dpqFree (dpq )
224- return
225- }
226230 poi := allocPOI ()
227231 {
228232 poi .atime = started .UnixNano ()
@@ -240,26 +244,22 @@ func (t *target) putObjS3(w http.ResponseWriter, r *http.Request, bck *meta.Bck,
240244 } else {
241245 s3 .SetS3Headers (w .Header (), lom )
242246 }
243- dpqFree (dpq )
244247}
245248
246249// GET s3/<bucket-name[/<object-name>]
247- func (t * target ) getObjS3 (w http.ResponseWriter , r * http.Request , items []string ) {
250+ func (t * target ) getObjS3 (w http.ResponseWriter , r * http.Request , items []string , dpq * dpq ) {
248251 bucket := items [0 ]
249252 bck , ecode , err := meta .InitByNameOnly (bucket , t .owner .bmd )
250253 if err != nil {
251254 s3 .WriteErr (w , r , s3.ErrInfo {Err : err , Status : ecode })
252255 return
253256 }
254257
255- // TODO -- FIXME: transition to dpq
256- q := r .URL .Query ()
257-
258- if len (items ) == 1 && q .Has (s3 .QparamMptUploads ) {
258+ if len (items ) == 1 && dpq .has (s3 .QparamMptUploads ) {
259259 if cmn .Rom .V (5 , cos .ModS3 ) {
260- nlog .Infoln ("listUploadsMpt" , bck .String (), q )
260+ nlog .Infoln ("listUploadsMpt" , bck .String (), dpq . m )
261261 }
262- t .listUploadsMptS3 (w , bck , q )
262+ t .listUploadsMptS3 (w , bck , dpq )
263263 return
264264 }
265265 if len (items ) < 2 {
@@ -271,32 +271,25 @@ func (t *target) getObjS3(w http.ResponseWriter, r *http.Request, items []string
271271 if errN != nil {
272272 return
273273 }
274- if q . Has (s3 .QparamMptPartNo ) {
274+ if dpq . has (s3 .QparamMptPartNo ) {
275275 if cmn .Rom .V (5 , cos .ModS3 ) {
276- nlog .Infoln ("getMptPart" , bck .String (), objName , q )
276+ nlog .Infoln ("getMptPart" , bck .String (), objName , dpq . m )
277277 }
278278 lom := core .AllocLOM (objName )
279- t .getPartMptS3 (w , r , bck , lom , q )
279+ t .getPartMptS3 (w , r , bck , lom , dpq )
280280 core .FreeLOM (lom )
281281 return
282282 }
283- uploadID := q . Get (s3 .QparamMptUploadID )
283+ uploadID := dpq . get (s3 .QparamMptUploadID )
284284 if uploadID != "" {
285285 if cmn .Rom .V (5 , cos .ModS3 ) {
286- nlog .Infoln ("listPartsMpt" , bck .String (), objName , q )
286+ nlog .Infoln ("listPartsMpt" , bck .String (), objName , dpq . m )
287287 }
288- t .listPartsMptS3 (w , r , bck , objName , q )
288+ t .listPartsMptS3 (w , r , bck , objName , dpq )
289289 return
290290 }
291291
292- dpq := dpqAlloc ()
293- if err := dpq .parse (r .URL .RawQuery ); err != nil {
294- dpqFree (dpq )
295- s3 .WriteErr (w , r , s3.ErrInfo {Err : err })
296- return
297- }
298292 lom := core .AllocLOM (objName )
299- dpq .isS3 = true
300293 lom , err = t .getObject (w , r , dpq , bck , lom )
301294 core .FreeLOM (lom )
302295
@@ -307,7 +300,6 @@ func (t *target) getObjS3(w http.ResponseWriter, r *http.Request, items []string
307300 }
308301 s3 .WriteErr (w , r , ei )
309302 }
310- dpqFree (dpq )
311303}
312304
313305// HEAD /s3/<bucket-name>/<object-name> (TODO: s3.HdrMptCnt)
@@ -417,27 +409,29 @@ func (t *target) delObjS3(w http.ResponseWriter, r *http.Request, items []string
417409}
418410
419411// POST /s3/<bucket-name>/<object-name>
420- func (t * target ) postObjS3 (w http.ResponseWriter , r * http.Request , items []string ) {
412+ func (t * target ) postObjS3 (w http.ResponseWriter , r * http.Request , items []string , dpq * dpq ) {
421413 bck , ecode , err := meta .InitByNameOnly (items [0 ], t .owner .bmd )
422414 if err != nil {
423415 s3 .WriteErr (w , r , s3.ErrInfo {Err : err , Status : ecode })
424416 return
425417 }
426- q := r . URL . Query ()
427- if q . Has (s3 .QparamMptUploads ) {
418+
419+ if dpq . has (s3 .QparamMptUploads ) {
428420 if cmn .Rom .V (5 , cos .ModS3 ) {
429- nlog .Infoln ("startMpt" , bck .String (), items , q )
421+ nlog .Infoln ("startMpt" , bck .String (), items , dpq . m )
430422 }
431- t .startMptS3 (w , r , items , bck )
423+ t .startMptS3 (w , r , bck , items )
432424 return
433425 }
434- if q .Has (s3 .QparamMptUploadID ) {
426+
427+ if dpq .has (s3 .QparamMptUploadID ) {
435428 if cmn .Rom .V (5 , cos .ModS3 ) {
436- nlog .Infoln ("completeMpt" , bck .String (), items , q )
429+ nlog .Infoln ("completeMpt" , bck .String (), items , dpq . m )
437430 }
438- t .completeMptS3 (w , r , items , q , bck )
431+ t .completeMptS3 (w , r , dpq , bck , items )
439432 return
440433 }
434+
441435 err = fmt .Errorf ("set query parameter %q to start multipart upload or %q to complete the upload" ,
442436 s3 .QparamMptUploads , s3 .QparamMptUploadID )
443437 s3 .WriteErr (w , r , s3.ErrInfo {Err : err })
0 commit comments