/// <summary> /// Processes a UnlockAndRelock request /// </summary> /// <remarks> /// For full documentation on UnlockAndRelock, see https://wopi.readthedocs.org/projects/wopirest/en/latest/files/UnlockAndRelock.html /// </remarks> private async static Task <HttpResponseMessage> UnlockAndRelock(this HttpContext context, FileModel file) { // Get the Lock and OldLock values passed in on the request string requestLock = context.Request.Headers[WopiRequestHeaders.LOCK]; string requestOldLock = context.Request.Headers[WopiRequestHeaders.OLD_LOCK]; // Ensure the file has a valid lock if (String.IsNullOrEmpty(file.LockValue)) { // File isn't locked...pass empty Lock in mismatch response return(context.returnLockMismatch(String.Empty, "File isn't locked")); } else if (file.LockExpires != null && file.LockExpires < DateTime.Now) { // File lock expired, so clear it out file.LockValue = null; file.LockExpires = null; await DocumentDBRepository <FileModel> .UpdateItemAsync("Files", file.id.ToString(), (FileModel)file); // File isn't locked...pass empty Lock in mismatch response return(context.returnLockMismatch(String.Empty, "File isn't locked")); } else if (requestOldLock != file.LockValue) { // File lock mismatch...pass Lock in mismatch response return(context.returnLockMismatch(file.LockValue, "Lock mismatch")); } else { // Update the file with a LockValue and LockExpiration file.LockValue = requestLock; file.LockExpires = DateTime.Now.AddMinutes(30); await DocumentDBRepository <FileModel> .UpdateItemAsync("Files", file.id.ToString(), (FileModel)file); // Return success 200 return(returnStatus(HttpStatusCode.OK, "Success")); } }
/// <summary> /// Processes a PutFile request /// </summary> /// <remarks> /// For full documentation on PutFile, see https://wopi.readthedocs.org/projects/wopirest/en/latest/files/PutFile.html /// </remarks> private async static Task <HttpResponseMessage> PutFile(this HttpContext context, FileModel file) { // Get the Lock value passed in on the request string requestLock = context.Request.Headers[WopiRequestHeaders.LOCK]; // Ensure the file has a valid lock if (String.IsNullOrEmpty(file.LockValue)) { // If the file is 0 bytes, this is document creation if (context.Request.InputStream.Length == 0) { // Update the file in blob storage var bytes = new byte[context.Request.InputStream.Length]; context.Request.InputStream.Read(bytes, 0, bytes.Length); file.Size = bytes.Length; await AzureStorageUtil.UploadFile(file.id.ToString(), file.Container, bytes); // Update version file.Version++; await DocumentDBRepository <FileModel> .UpdateItemAsync("Files", file.id.ToString(), (FileModel)file); // Return success 200 return(returnStatus(HttpStatusCode.OK, "Success")); } else { // File isn't locked...pass empty Lock in mismatch response return(context.returnLockMismatch(String.Empty, "File isn't locked")); } } else if (file.LockExpires != null && file.LockExpires < DateTime.Now) { // File lock expired, so clear it out file.LockValue = null; file.LockExpires = null; await DocumentDBRepository <FileModel> .UpdateItemAsync("Files", file.id.ToString(), (FileModel)file); // File isn't locked...pass empty Lock in mismatch response return(context.returnLockMismatch(String.Empty, "File isn't locked")); } else if (requestLock != file.LockValue) { // File lock mismatch...pass Lock in mismatch response return(context.returnLockMismatch(file.LockValue, "Lock mismatch")); } else { // Update the file in blob storage var bytes = new byte[context.Request.InputStream.Length]; context.Request.InputStream.Read(bytes, 0, bytes.Length); file.Size = bytes.Length; await AzureStorageUtil.UploadFile(file.id.ToString(), file.Container, bytes); // Update version file.Version++; await DocumentDBRepository <FileModel> .UpdateItemAsync("Files", file.id.ToString(), (FileModel)file); // Return success 200 return(returnStatus(HttpStatusCode.OK, "Success")); } }