Example #1
0
 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)
 {
 }
Example #2
0
        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);
        }
Example #3
0
        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.");
        }
Example #4
0
        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);
                }
            }
        }
Example #5
0
 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();
     }
 }