public async Task <HttpResponseMessage> GetFile(string file_id)
        {
            var          getFileRequest = new GetFileRequest(this.Request, file_id);
            WopiResponse wopiResponse   = null;

            try
            {
                if (await Authorize(getFileRequest))
                {
                    if (await WopiProof.Validate(getFileRequest))
                    {
                        wopiResponse = await GetFile(getFileRequest);
                    }
                    else
                    {
                        getFileRequest.ResponseServerError("Proof validation failed");
                    }
                }
                else
                {
                    wopiResponse = getFileRequest.ResponseUnauthorized();
                }
            }
            catch (Exception ex)
            {
                wopiResponse = getFileRequest.ResponseServerError(ex.Message);
            }

            return(wopiResponse.ToHttpResponse());
        }
        public async Task <HttpResponseMessage> ProcessPostActions(string file_id)
        {
            WopiRequest  wopiRequest  = new WopiRequest(this.Request, file_id);
            WopiResponse wopiResponse = null;

            try
            {
                if (await Authorize(wopiRequest))
                {
                    if (await WopiProof.Validate(wopiRequest))
                    {
                        var filesPostOverride = WopiRequest.GetHttpRequestHeader(this.Request, WopiRequestHeaders.OVERRIDE);

                        switch (filesPostOverride)
                        {
                        case "LOCK":
                            var oldLock = WopiRequest.GetHttpRequestHeader(this.Request, WopiRequestHeaders.OLD_LOCK);
                            if (oldLock != null)
                            {
                                wopiResponse = await UnlockAndRelock(new UnlockAndRelockRequest(this.Request, file_id));
                            }
                            else
                            {
                                wopiResponse = await Lock(new LockRequest(this.Request, file_id));
                            }
                            break;

                        case "GET_LOCK":
                            wopiResponse = await GetLock(new GetLockRequest(this.Request, file_id));

                            break;

                        case "REFRESH_LOCK":
                            wopiResponse = await RefreshLock(new RefreshLockRequest(this.Request, file_id));

                            break;

                        case "UNLOCK":
                            wopiResponse = await Unlock(new UnlockRequest(this.Request, file_id));

                            break;

                        case "PUT_RELATIVE":
                            var suggestedTarget = WopiRequest.GetHttpRequestHeader(this.Request, WopiRequestHeaders.SUGGESTED_TARGET);
                            var relativeTarget  = WopiRequest.GetHttpRequestHeader(this.Request, WopiRequestHeaders.RELATIVE_TARGET);
                            if (suggestedTarget != null && relativeTarget != null)
                            {
                                // This really should be BadRequest, but the spec requires NotImplmented
                                wopiResponse = new WopiResponse()
                                {
                                    StatusCode = HttpStatusCode.NotImplemented
                                };
                            }
                            else
                            {
                                if (suggestedTarget != null)
                                {
                                    wopiResponse = await PutRelativeFileSuggested(new PutRelativeFileSuggestedRequest(this.Request, file_id));
                                }
                                else if (relativeTarget != null)
                                {
                                    wopiResponse = await PutRelativeFileSpecific(new PutRelativeFileSpecificRequest(this.Request, file_id));
                                }
                                else     // Both are null
                                {
                                    wopiResponse = new WopiResponse()
                                    {
                                        StatusCode = HttpStatusCode.BadRequest
                                    }
                                };
                            }
                            break;

                        case "RENAME_FILE":
                            wopiResponse = await RenameFile(new RenameFileRequest(this.Request, file_id));

                            break;

                        case "PUT_USER_INFO":
                            wopiResponse = await PutUserInfo(new PutUserInfoRequest(this.Request, file_id));

                            break;

                        case "DELETE":
                            wopiResponse = await DeleteFile(new DeleteFileRequest(this.Request, file_id));

                            break;

                        default:
                            wopiResponse = wopiRequest.ResponseServerError(string.Format("Invalid {0} header value: {1}", WopiRequestHeaders.OVERRIDE, filesPostOverride));
                            break;
                        }
                    }
                    else
                    {
                        wopiResponse = wopiRequest.ResponseServerError("Proof validation failed");
                    }
                }
                else
                {
                    wopiResponse = wopiRequest.ResponseUnauthorized();
                }
            }
            catch (Exception ex)
            {
                wopiResponse = wopiRequest.ResponseServerError(ex.Message);
            }
            return(wopiResponse.ToHttpResponse());
        }