private static void ProcessStartOfRequest <T>(ExecutionState <T> executionState) { // 1. Build request executionState.Req = executionState.RestCMD.BuildRequestDelegate(executionState.Cmd.Uri, executionState.Cmd.Builder, executionState.Cmd.ServerTimeoutInSeconds, executionState.OperationContext); // User Headers Executor.ApplyUserHeaders(executionState); executionState.CancelDelegate = executionState.Req.Abort; // 2. Set Headers if (executionState.RestCMD.SetHeaders != null) { executionState.RestCMD.SetHeaders(executionState.Req, executionState.OperationContext); } if (executionState.RestCMD.SendStream != null) { CommonUtils.ApplyRequestOptimizations(executionState.Req, executionState.RestCMD.SendStream.Length - executionState.RestCMD.SendStream.Position); } else { CommonUtils.ApplyRequestOptimizations(executionState.Req, -1); } Executor.FireSendingRequest(executionState); // 3. Sign Request if (executionState.RestCMD.SignRequest != null) { executionState.RestCMD.SignRequest(executionState.Req, executionState.OperationContext); } // 4. Set timeout (this is actually not honored by asynchronous requests) executionState.Req.Timeout = executionState.RemainingTimeout; }
/// <summary> /// Callback on DataContext object sending request. /// </summary> /// <param name="sender">The sender.</param> /// <param name="e">The <see cref="System.Data.Services.Client.SendingRequestEventArgs"/> instance containing the event data.</param> private void TableServiceContext_SendingRequest(object sender, SendingRequestEventArgs e) { HttpWebRequest request = e.Request as HttpWebRequest; // Check timeout int timeoutDex = request.RequestUri.Query.LastIndexOf("&timeout=", System.StringComparison.Ordinal); if (timeoutDex > 0) { timeoutDex += 9; // Magic number -> length of "&timeout=" int endDex = request.RequestUri.Query.IndexOf('&', timeoutDex); string timeoutString = endDex > 0 ? request.RequestUri.Query.Substring(timeoutDex, endDex - timeoutDex) : request.RequestUri.Query.Substring(timeoutDex); int result = -1; int.TryParse(timeoutString, out result); if (result > 0) { request.Timeout = result * 1000; // Convert to ms } } // Sign request if (this.ServiceClient.Credentials.IsSharedKey) { this.ServiceClient.AuthenticationHandler.SignRequest(request, null /* operationContext */); } else if (this.ServiceClient.Credentials.IsSAS) { Uri transformedUri = this.ServiceClient.Credentials.TransformUri(request.RequestUri); // Recreate the request HttpWebRequest newRequest = WebRequest.Create(transformedUri) as HttpWebRequest; TableUtilities.CopyRequestData(newRequest, request); e.Request = newRequest; request = newRequest; } lock (this.cancellationLock) { if (this.cancellationRequested) { throw new OperationCanceledException(SR.OperationCanceled); } this.currentRequest = request; } // SAS will be handled directly by the queries themselves prior to transformation request.Headers.Add( Constants.HeaderConstants.StorageVersionHeader, Constants.HeaderConstants.TargetStorageVersion); CommonUtils.ApplyRequestOptimizations(request, -1); if (this.sendingSignedRequestAction != null) { this.sendingSignedRequestAction(request); } }