public override void OnProcessRequest(HttpContext context) { try { var request = new ChunkedRequestHelper(context.Request); if (!TryAuthorize(request)) { WriteError(context, "Can't authorize given initiate session request or session with specified upload id already expired"); return; } if (CoreContext.TenantManager.GetCurrentTenant().Status != TenantStatus.Active) { WriteError(context, "Can't perform upload for deleted or transfering portals"); } switch (request.Type) { case ChunkedRequestType.Abort: FileUploader.AbortUpload(request.UploadId); WriteSuccess(context, null); return; case ChunkedRequestType.Initiate: var createdSession = FileUploader.InitiateUpload(request.FolderId, request.FileId, request.FileName, request.FileSize); WriteSuccess(context, ToResponseObject(createdSession, true)); return; case ChunkedRequestType.Upload: var resumedSession = FileUploader.UploadChunk(request.UploadId, request.ChunkStream, request.ChunkSize); if (resumedSession.BytesUploaded == resumedSession.BytesTotal) { WriteSuccess(context, ToResponseObject(resumedSession.File), statusCode: 201); FilesMessageService.Send(resumedSession.File, context.Request, MessageAction.FileUploaded, resumedSession.File.Title); } else { WriteSuccess(context, ToResponseObject(resumedSession)); } return; default: WriteError(context, "Unknown request type."); return; } } catch(Exception error) { Global.Logger.Error(error); WriteError(context, error.Message); } }
private static bool TryAuthorize(ChunkedRequestHelper request) { if (request.Type == ChunkedRequestType.Initiate) { CoreContext.TenantManager.SetCurrentTenant(request.TenantId); SecurityContext.AuthenticateMe(CoreContext.Authentication.GetAccountByID(request.AuthKey)); return true; } if (!string.IsNullOrEmpty(request.UploadId)) { var uploadSession = ChunkedUploadSessionHolder.GetSession(request.UploadId); if (uploadSession != null) { CoreContext.TenantManager.SetCurrentTenant(uploadSession.TenantId); SecurityContext.AuthenticateMe(CoreContext.Authentication.GetAccountByID(uploadSession.UserId)); return true; } } return false; }