@@ -15,6 +15,7 @@ import (
1515 "github.com/forceu/gokapi/internal/logging"
1616 "github.com/forceu/gokapi/internal/models"
1717 "github.com/forceu/gokapi/internal/storage"
18+ "github.com/forceu/gokapi/internal/storage/chunking"
1819 "github.com/forceu/gokapi/internal/storage/filerequest"
1920 "github.com/forceu/gokapi/internal/webserver/authentication/users"
2021 "github.com/forceu/gokapi/internal/webserver/fileupload"
@@ -334,42 +335,86 @@ func apiChunkAdd(w http.ResponseWriter, r requestParser, _ models.User) {
334335 if ! ok {
335336 panic ("invalid parameter passed" )
336337 }
337- maxUpload := int64 (configuration .Get ().MaxFileSizeMB ) * 1024 * 1024
338- if request .Request .ContentLength > maxUpload {
339- sendError (w , http .StatusBadRequest , storage .ErrorFileTooLarge .Error ())
338+ statusCode , errString := processNewChunk (w , request , configuration .Get ().MaxFileSizeMB )
339+ if statusCode != http .StatusOK {
340+ sendError (w , statusCode , errString )
341+ }
342+ }
343+
344+ func apiChunkUploadRequestAdd (w http.ResponseWriter , r requestParser , _ models.User ) {
345+ request , ok := r .(* paramChunkUploadRequestAdd )
346+ if ! ok {
347+ panic ("invalid parameter passed" )
348+ }
349+ fileRequest , ok , status , errorMsg := checkFileRequestAndApiKey (request .FileRequestId , request .ApiKey )
350+ if ! ok {
351+ sendError (w , status , errorMsg )
340352 return
341353 }
354+ maxUpload := configuration .Get ().MaxFileSizeMB
355+ if ! fileRequest .IsUnlimitedSize () {
356+ if (fileRequest .MaxSize ) < maxUpload {
357+ maxUpload = fileRequest .MaxSize
358+ }
359+ }
360+ statusCode , errString := processNewChunk (w , request , maxUpload )
361+ if statusCode != http .StatusOK {
362+ sendError (w , statusCode , errString )
363+ }
364+ }
342365
343- request .Request .Body = http .MaxBytesReader (w , request .Request .Body , maxUpload )
344- err := fileupload .ProcessNewChunk (w , request .Request , true )
366+ func checkFileRequestAndApiKey (fileRequestId , apiKey string ) (models.FileRequest , bool , int , string ) {
367+ fileRequest , ok := filerequest .Get (fileRequestId )
368+ if ! ok {
369+ return models.FileRequest {}, false , http .StatusNotFound , "FileRequest does not exist with the given ID"
370+ }
371+ if fileRequest .ApiKey != apiKey {
372+ return models.FileRequest {}, false , http .StatusUnauthorized , "Invalid API key"
373+ }
374+ return fileRequest , true , 0 , ""
375+ }
376+
377+ type chunkParams interface {
378+ GetRequest () * http.Request
379+ }
380+
381+ func processNewChunk (w http.ResponseWriter , request chunkParams , maxFileSizeMb int ) (int , string ) {
382+ maxUpload := int64 (maxFileSizeMb ) * 1024 * 1024
383+ if request .GetRequest ().ContentLength > maxUpload {
384+ return http .StatusBadRequest , storage .ErrorFileTooLarge .Error ()
385+ }
386+
387+ request .GetRequest ().Body = http .MaxBytesReader (w , request .GetRequest ().Body , maxUpload )
388+ err := fileupload .ProcessNewChunk (w , request .GetRequest (), true )
345389 if err != nil {
346- sendError (w , http .StatusBadRequest , err .Error ())
347- return
390+ return http .StatusBadRequest , err .Error ()
348391 }
392+ return http .StatusOK , ""
349393}
350394
351395func apiChunkComplete (w http.ResponseWriter , r requestParser , user models.User ) {
352396 request , ok := r .(* paramChunkComplete )
353397 if ! ok {
354398 panic ("invalid parameter passed" )
355399 }
400+ uploadParams := fileupload .CreateUploadConfig (request .AllowedDownloads ,
401+ request .ExpiryDays ,
402+ request .Password ,
403+ request .UnlimitedTime ,
404+ request .UnlimitedDownloads ,
405+ request .IsE2E ,
406+ request .FileSize ,
407+ "" )
356408 if request .IsNonBlocking {
357- go doBlockingPartCompleteChunk (nil , request , user )
409+ go doBlockingPartCompleteChunk (nil , request . Uuid , request . FileHeader , user , uploadParams )
358410 _ , _ = io .WriteString (w , "{\" result\" :\" OK\" }" )
359411 return
360412 }
361- doBlockingPartCompleteChunk (w , request , user )
413+ go doBlockingPartCompleteChunk (w , request . Uuid , request . FileHeader , user , uploadParams )
362414}
363415
364- func doBlockingPartCompleteChunk (w http.ResponseWriter , request * paramChunkComplete , user models.User ) {
365- uploadRequest := fileupload .CreateUploadConfig (request .AllowedDownloads ,
366- request .ExpiryDays ,
367- request .Password ,
368- request .UnlimitedTime ,
369- request .UnlimitedDownloads ,
370- request .IsE2E ,
371- request .FileSize )
372- file , err := fileupload .CompleteChunk (request .Uuid , request .FileHeader , user .Id , uploadRequest )
416+ func doBlockingPartCompleteChunk (w http.ResponseWriter , uuid string , fileHeader chunking.FileHeader , user models.User , uploadParameters models.UploadParameters ) {
417+ file , err := fileupload .CompleteChunk (uuid , fileHeader , user .Id , uploadParameters )
373418 if err != nil {
374419 sendError (w , http .StatusBadRequest , err .Error ())
375420 return
@@ -378,6 +423,27 @@ func doBlockingPartCompleteChunk(w http.ResponseWriter, request *paramChunkCompl
378423 outputFileJson (w , file )
379424}
380425
426+ func apiChunkUploadRequestComplete (w http.ResponseWriter , r requestParser , user models.User ) {
427+ request , ok := r .(* paramChunkUploadRequestComplete )
428+ if ! ok {
429+ panic ("invalid parameter passed" )
430+ }
431+ fileRequest , ok , status , errorMsg := checkFileRequestAndApiKey (request .FileRequestId , request .ApiKey )
432+ if ! ok {
433+ sendError (w , status , errorMsg )
434+ return
435+ }
436+ uploadParams := fileupload .CreateUploadConfig (0 ,
437+ 0 , "" , true , true ,
438+ false , request .FileSize , fileRequest .Id )
439+ if request .IsNonBlocking {
440+ go doBlockingPartCompleteChunk (nil , request .Uuid , request .FileHeader , user , uploadParams )
441+ _ , _ = io .WriteString (w , "{\" result\" :\" OK\" }" )
442+ return
443+ }
444+ go doBlockingPartCompleteChunk (w , request .Uuid , request .FileHeader , user , uploadParams )
445+ }
446+
381447func apiVersionInfo (w http.ResponseWriter , _ requestParser , _ models.User ) {
382448 type versionInfo struct {
383449 Version string
@@ -565,7 +631,8 @@ func apiDuplicateFile(w http.ResponseWriter, r requestParser, user models.User)
565631 request .UnlimitedTime ,
566632 request .UnlimitedDownloads ,
567633 false , // is not being used by storage.DuplicateFile
568- 0 ) // is not being used by storage.DuplicateFile
634+ 0 , // is not being used by storage.DuplicateFile
635+ "" )
569636 newFile , err := storage .DuplicateFile (file , request .RequestedChanges , request .FileName , uploadRequest )
570637 if err != nil {
571638 sendError (w , http .StatusInternalServerError , err .Error ())
@@ -954,7 +1021,7 @@ func isAuthorisedForApi(r *http.Request, routing apiRoute) (models.User, bool) {
9541021 return models.User {}, false
9551022 }
9561023 // Returns false if a public upload key is used for non-public api call or vice versa
957- if routing .UsesPublicUploadApiKey != apiKey .IsUploadRequestKey () {
1024+ if routing .IsFileRequestApi != apiKey .IsUploadRequestKey () {
9581025 return models.User {}, false
9591026 }
9601027 return user , true
0 commit comments