public void CheckPermission(string permission, CheckPermissionDelegate callback) { if (HasPermission(permission)) { callback(); } else { Login(permission, delegate(bool success){ if (success) { callback(); } }); } }
public TableDataServiceV1(TableProtocolHead tableProtocolHead, IAccountIdentifier identifier, IUtilityTableDataContextFactory factory, bool operationIsConditional, Dictionary <string, string> continuationToken, RequestStartedCallback requestStartedCallback, CheckPermissionDelegate checkPermissionCallback, QueryRowCommandPropertiesAvailableCallback queryRowCommandPropertiesAvailableCallback, ContinuationTokenAvailableCallback continuationTokenAvailableCallback) : base(tableProtocolHead, identifier, factory, operationIsConditional, continuationToken, requestStartedCallback, checkPermissionCallback, queryRowCommandPropertiesAvailableCallback, continuationTokenAvailableCallback) { }
public IAsyncResult BeginPerformOperation(IAccountIdentifier accountId, string accountName, IDataServiceHost host, RequestStartedCallback requestStartedCallback, CheckPermissionDelegate checkPermissionCallback, QueryRowCommandPropertiesAvailableCallback queryRowCommandPropertiesAvailableCallback, Dictionary <string, string> continuationToken, ContinuationTokenAvailableCallback continuationTokenAvailableCallback, bool operationIsConditional, RequestContext requestContext, AsyncCallback callback, object state) { TableProtocolHead tableProtocolHead = host as TableProtocolHead; NephosAssertionException.Assert(tableProtocolHead != null, "Expecting host to be instance of TableProtocolHead."); AsyncIteratorContext <NoResults> asyncIteratorContext = new AsyncIteratorContext <NoResults>("TableManager.PerformOperation", callback, state); asyncIteratorContext.Begin(this.PerformOperationImpl(accountId, accountName, tableProtocolHead, requestStartedCallback, checkPermissionCallback, queryRowCommandPropertiesAvailableCallback, continuationToken, continuationTokenAvailableCallback, operationIsConditional, requestContext, asyncIteratorContext)); return(asyncIteratorContext); }
private IEnumerator <IAsyncResult> PerformOperationImpl(IAccountIdentifier identifier, string accountName, TableProtocolHead tableProtocolHead, RequestStartedCallback requestStartedCallback, CheckPermissionDelegate checkPermissionCallback, QueryRowCommandPropertiesAvailableCallback queryRowCommandPropertiesAvailableCallback, Dictionary <string, string> continuationToken, ContinuationTokenAvailableCallback continuationTokenAvailableCallback, bool operationIsConditional, RequestContext requestContext, AsyncIteratorContext <NoResults> context) { TimeSpan maxValue = TimeSpan.MaxValue; if (VersioningHelper.CompareVersions(tableProtocolHead.RequestRestVersion, "2016-05-31") >= 0) { maxValue = tableProtocolHead.operationContext.RemainingTimeout(); } IAsyncResult workerThread = this.authorizationManager.BeginCheckAccess(identifier, accountName, null, null, PermissionLevel.Owner, maxValue, context.GetResumeCallback(), context.GetResumeState("AuthorizationManager.BeginCheckAccess")); yield return(workerThread); this.authorizationManager.EndCheckAccess(workerThread); using (Stream bufferPoolMemoryStream = new BufferPoolMemoryStream(65536)) { bool flag = false; if (tableProtocolHead.ShouldReadRequestBody) { long requestContentLength = tableProtocolHead.RequestContentLength; if (requestContentLength > (long)4194304) { IStringDataEventStream verbose = Logger <IRestProtocolHeadLogger> .Instance.Verbose; object[] objArray = new object[] { requestContentLength, 4194304 }; verbose.Log("Content-Length is out of range. Content-Length={0} MaxRequestBodySize={1}", objArray); if (!tableProtocolHead.IsBatchRequest()) { if (VersioningHelper.CompareVersions(tableProtocolHead.RequestRestVersion, "2013-08-15") < 0) { throw new RequestTooLargeException(); } throw new RequestEntityTooLargeException(new long?((long)4194304)); } flag = true; requestContentLength = (long)102400; } else if (requestContentLength == (long)-1) { requestContentLength = (long)4194305; } Logger <IRestProtocolHeadLogger> .Instance.Verbose.Log("Started asynchronously reading from input stream"); if (VersioningHelper.CompareVersions(tableProtocolHead.RequestRestVersion, "2016-05-31") >= 0) { maxValue = tableProtocolHead.operationContext.RemainingTimeout(); } workerThread = AsyncStreamCopy.BeginAsyncStreamCopy(tableProtocolHead.RequestStream, bufferPoolMemoryStream, requestContentLength, 65536, maxValue, context.GetResumeCallback(), context.GetResumeState("BeginAsyncStreamCopy")); yield return(workerThread); long num = AsyncStreamCopy.EndAsyncStreamCopy(workerThread); bufferPoolMemoryStream.Seek((long)0, SeekOrigin.Begin); tableProtocolHead.RequestStream = bufferPoolMemoryStream; Logger <IRestProtocolHeadLogger> .Instance.Verbose.Log("Finished reading from input stream"); workerThread = AsyncHelpers.BeginSwitchToWorkerThread(context.GetResumeCallback(), context.GetResumeState("PerformOperationImpl")); yield return(workerThread); AsyncHelpers.EndSwitchToWorkerThread(workerThread); Logger <IRestProtocolHeadLogger> .Instance.Verbose.Log("Switched to a WorkerThread"); if (num > (long)4194304) { IStringDataEventStream stringDataEventStream = Logger <IRestProtocolHeadLogger> .Instance.Verbose; object[] requestContentLength1 = new object[] { tableProtocolHead.RequestContentLength, 4194304, num }; stringDataEventStream.Log("Request body is too long. Content-Length={0} MaxRequestBodySize={1} BytesRead={2}", requestContentLength1); if (!tableProtocolHead.IsBatchRequest()) { if (VersioningHelper.CompareVersions(tableProtocolHead.RequestRestVersion, "2013-08-15") < 0) { throw new RequestTooLargeException(); } throw new RequestEntityTooLargeException(new long?((long)4194304)); } flag = true; } } if (!flag) { this.DispatchRequestToAstoria(identifier, tableProtocolHead, requestStartedCallback, checkPermissionCallback, queryRowCommandPropertiesAvailableCallback, continuationToken, continuationTokenAvailableCallback, operationIsConditional); } else { Logger <IRestProtocolHeadLogger> .Instance.Error.Log("Batch request body is too long. Sending error batch response now."); if (VersioningHelper.CompareVersions(tableProtocolHead.RequestRestVersion, "2013-08-15") >= 0) { throw new RequestEntityTooLargeException(new long?((long)4194304)); } string str = tableProtocolHead.ReadContentIdFromRequest(100, 102400); TableProtocolHead tableProtocolHead1 = tableProtocolHead; string str1 = str; if (str1 == null) { str1 = "1"; } tableProtocolHead1.SendBatchRequestTooLargeResponse(str1); } } }
private void DispatchRequestToAstoria(IAccountIdentifier identifier, TableProtocolHead tableProtocolHead, RequestStartedCallback requestStartedCallback, CheckPermissionDelegate checkPermissionCallback, QueryRowCommandPropertiesAvailableCallback queryRowCommandPropertiesAvailableCallback, Dictionary <string, string> continuationToken, ContinuationTokenAvailableCallback continuationTokenAvailableCallback, bool operationIsConditional) { Logger <IRestProtocolHeadLogger> .Instance.Verbose.Log("Deferring request to Astoria."); TableDataServiceBase <IUtilityTableDataContext> tableDataServiceV3 = null; if (tableProtocolHead.IsRequestVersionAtLeast("2013-08-15")) { tableDataServiceV3 = new TableDataServiceV3 <IUtilityTableDataContext>(tableProtocolHead, identifier, this.utilityTableDataContextFactory, operationIsConditional, continuationToken, requestStartedCallback, checkPermissionCallback, queryRowCommandPropertiesAvailableCallback, continuationTokenAvailableCallback); } else if (!tableProtocolHead.IsRequestVersionAtLeast("2011-08-18")) { tableDataServiceV3 = new TableDataServiceV1 <IUtilityTableDataContext>(tableProtocolHead, identifier, this.utilityTableDataContextFactory, operationIsConditional, continuationToken, requestStartedCallback, checkPermissionCallback, queryRowCommandPropertiesAvailableCallback, continuationTokenAvailableCallback); } else { tableDataServiceV3 = new TableDataServiceV2 <IUtilityTableDataContext>(tableProtocolHead, identifier, this.utilityTableDataContextFactory, operationIsConditional, continuationToken, requestStartedCallback, checkPermissionCallback, queryRowCommandPropertiesAvailableCallback, continuationTokenAvailableCallback); } tableDataServiceV3.AttachHost(tableProtocolHead); tableDataServiceV3.ProcessRequest(); Logger <IRestProtocolHeadLogger> .Instance.Verbose.Log("Astoria finished processing request."); }
public TableDataServiceBase(TableProtocolHead tableProtocolHead, IAccountIdentifier identifier, IUtilityTableDataContextFactory factory, bool operationIsConditional, Dictionary <string, string> continuationToken, RequestStartedCallback requestStartedCallback, CheckPermissionDelegate checkPermissionCallback, QueryRowCommandPropertiesAvailableCallback queryRowCommandPropertiesAvailableCallback, ContinuationTokenAvailableCallback continuationTokenAvailableCallback) { if (factory == null) { throw new ArgumentNullException("factory"); } if (tableProtocolHead == null) { throw new ArgumentNullException("tableProtocolHead"); } this.dataSource = factory.CreateDataContext(identifier, tableProtocolHead.ServiceOperationContext.AccountName, tableProtocolHead.RequestRestVersion); this.dataSource.ApiVersion = tableProtocolHead.RequestRestVersion; this.dataSource.OldMetricsTableNamesDeprecated = tableProtocolHead.IsRequestVersionAtLeast("2013-08-15"); this.dataSource.IsBatchRequest = tableProtocolHead.IsBatchRequest(); this.dataSource.OperationIsConditional = operationIsConditional; this.dataSource.ContinuationToken = continuationToken; this.dataSource.RequestStartedCallback = requestStartedCallback; this.dataSource.CheckPermissionCallback = checkPermissionCallback; this.dataSource.QueryRowCommandPropertiesAvailableCallback = queryRowCommandPropertiesAvailableCallback; this.dataSource.ContinuationTokenAvailableCallback = continuationTokenAvailableCallback; this.tableProtocolHead = tableProtocolHead; if (VersioningHelper.CompareVersions(tableProtocolHead.RequestRestVersion, "2016-05-31") >= 0) { this.dataSource.Timeout = tableProtocolHead.operationContext.RemainingTimeout(); } }