Example #1
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();
     }
 }
Example #2
0
 protected override void OnStartProcessingRequest(ProcessRequestArgs args)
 {
     if (args.IsBatchOperation)
     {
         TableProtocolHead batchInnerOperationCount = this.tableProtocolHead;
         batchInnerOperationCount.BatchInnerOperationCount = batchInnerOperationCount.BatchInnerOperationCount + 1;
         if (!this.tableProtocolHead.IsRequestVersionAtLeast("2015-12-11"))
         {
             this.tableProtocolHead.EnsureSupportedRequestContentType();
             string item = args.OperationContext.RequestHeaders["Accept"];
             if (!string.IsNullOrWhiteSpace(item))
             {
                 int num = item.IndexOf(',');
                 if (num != -1)
                 {
                     item = item.Substring(0, num);
                 }
                 this.tableProtocolHead.EnsureSupportedMediaType(item);
             }
         }
         this.tableProtocolHead.OverrideRequestContentType  = args.OperationContext.RequestHeaders["Content-Type"];
         this.tableProtocolHead.OverrideResponseContentType = args.OperationContext.RequestHeaders["Accept"];
     }
     if (this.tableProtocolHead.IsRequestVersionAtLeast("2015-12-11") && (this.tableProtocolHead.BatchInnerOperationCount > 0 || !args.OperationContext.IsBatchRequest))
     {
         this.tableProtocolHead.EnsureContentTypeHeaderValuePostJul15(args.OperationContext.RequestHeaders["Content-Type"]);
         string queryStringValue = args.OperationContext.GetQueryStringValue("$format");
         if (!this.tableProtocolHead.CheckWhetherToSkipAcceptHeaderCheckPostJul15(queryStringValue))
         {
             this.tableProtocolHead.EnsureAcceptHeaderValuePostJul15(args.OperationContext.RequestHeaders["Accept"]);
         }
     }
     this.dataSource.OnStartProcessingRequest(args);
     base.OnStartProcessingRequest(args);
 }
Example #3
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 #4
0
        public override void AcceptRequest(RequestContext requestContext, Microsoft.Cis.Services.Nephos.Common.ServiceType serviceType)
        {
            requestContext.ServiceType = serviceType;
            PerRequestStorageManager perRequestStorageManager = new PerRequestStorageManager(TableServiceEntry.SharedStorageManager, requestContext.OperationStatus);
            AuthenticationManager    authenticationManager    = XFETableAuthenticationManager.CreateAuthenticationManager(TableServiceEntry.SharedStorageManager);
            AuthorizationManager     authorizationManager     = NephosAuthorizationManager.CreateAuthorizationManager(TableServiceEntry.SharedStorageManager, false);
            ITableManager            operationStatus          = TableManager.CreateTableManager(authorizationManager, TableServiceEntry.SharedTableDataFactory, TableServiceEntry.SharedStorageManager);

            operationStatus.Initialize();
            operationStatus.OperationStatus = requestContext.OperationStatus;
            IProcessor processor = TableProtocolHead.Create(requestContext, perRequestStorageManager, authenticationManager, operationStatus, TableProtocolHead.HttpProcessorConfigurationDefaultInstance, new TransformExceptionDelegate(SqlExceptionManager.TransformSqlException), null);

            ServiceRequestHandler.DispatchRequest(processor);
        }
Example #5
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 #6
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 #7
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);
                }
            }
        }