コード例 #1
0
        void getResponseCallback(IAsyncResult result)
        {
            AsyncResult asyncResult = result as AsyncResult;

            if (asyncResult == null)
            {
                asyncResult = result.AsyncState as AsyncResult;
            }

            UnmarshallerContext context = null;

            asyncResult.RequestState.GetResponseCallbackCalled = true;
            bool shouldRetry = false;
            AmazonWebServiceResponse response = null;

            try
            {
                AsyncResult.AsyncRequestState state = asyncResult.RequestState;
                HttpWebResponse httpResponse        = null;
                try
                {
                    if (asyncResult.CompletedSynchronously)
                    {
                        httpResponse = state.WebRequest.GetResponse() as HttpWebResponse;
                    }
                    else
                    {
                        httpResponse = state.WebRequest.EndGetResponse(result) as HttpWebResponse;
                    }

                    using (asyncResult.Metrics.StartEvent(Metric.ResponseProcessingTime))
                    {
                        var unmarshaller = asyncResult.Unmarshaller;
                        LogResponse(asyncResult.Metrics, asyncResult.Request, httpResponse.StatusCode);

                        try
                        {
                            var httpResponseData = new HttpWebRequestResponseData(httpResponse);
                            context = unmarshaller.CreateContext(httpResponseData,
                                                                 this.SupportResponseLogging &&
                                                                 (Config.LogResponse || Config.ReadEntireResponse || AWSConfigs.LoggingConfig.LogResponses != ResponseLoggingOption.Never),
                                                                 httpResponseData.ResponseBody.OpenResponse(),
                                                                 asyncResult.Metrics);

                            using (asyncResult.Metrics.StartEvent(Metric.ResponseUnmarshallTime))
                            {
                                response = unmarshaller.Unmarshall(context);
                            }
                            context.ValidateCRC32IfAvailable();

                            response.ContentLength    = httpResponse.ContentLength;
                            response.HttpStatusCode   = httpResponse.StatusCode;
                            asyncResult.FinalResponse = response;
                            if (response.ResponseMetadata != null)
                            {
                                asyncResult.Metrics.AddProperty(Metric.AWSRequestID, response.ResponseMetadata.RequestId);
                            }

                            LogFinishedResponse(asyncResult.Metrics, context, httpResponse.ContentLength);
                        }
                        finally
                        {
                            if (!unmarshaller.HasStreamingProperty)
                            {
                                httpResponse.Close();
                            }
                        }
                    }
                }
                catch (WebException we)
                {
                    HttpWebResponse exceptionHttpResponse = we.Response as HttpWebResponse;

                    // If the error is a 404 and the request is configured to supress it. Then unmarshall as much as we can.
                    if (exceptionHttpResponse != null &&
                        exceptionHttpResponse.StatusCode == HttpStatusCode.NotFound &&
                        asyncResult.Request.Suppress404Exceptions)
                    {
                        var unmarshaller                 = asyncResult.Unmarshaller;
                        var httpResponseData             = new HttpWebRequestResponseData(exceptionHttpResponse);
                        UnmarshallerContext errorContext = unmarshaller.CreateContext(
                            httpResponseData,
                            Config.LogResponse || Config.ReadEntireResponse || AWSConfigs.LoggingConfig.LogResponses != ResponseLoggingOption.Never,
                            httpResponseData.ResponseBody.OpenResponse(),
                            asyncResult.Metrics);

                        try
                        {
                            response = unmarshaller.Unmarshall(errorContext);
                            response.ContentLength  = exceptionHttpResponse.ContentLength;
                            response.HttpStatusCode = exceptionHttpResponse.StatusCode;
                        }
                        catch (Exception e)
                        {
                            logger.Debug(e, "Failed to unmarshall 404 response when it was being supressed");
                        }

                        asyncResult.FinalResponse = response;
                    }
                    else
                    {
                        if (exceptionHttpResponse != null)
                        {
                            LogResponse(asyncResult.Metrics, asyncResult.Request, exceptionHttpResponse.StatusCode);
                        }
                        else
                        {
                            asyncResult.Metrics.StopEvent(Metric.HttpRequestTime);
                        }
                        shouldRetry = HandleHttpWebErrorResponse(asyncResult, we);
                    }
                }
                catch (IOException ioe)
                {
                    LogResponse(asyncResult.Metrics, asyncResult.Request, HttpStatusCode.Unused);
                    shouldRetry = HandleIOException(asyncResult, httpResponse, ioe);
                    if (!shouldRetry)
                    {
                        asyncResult.Exception = ioe;
                    }
                }

                if (shouldRetry)
                {
                    asyncResult.RequestState.WebRequest.Abort();
                    asyncResult.RetriesAttempt++;
                    InvokeHelper(asyncResult);
                }
                else
                {
                    LogFinalMetrics(asyncResult.Metrics);
                }
            }
            catch (Exception e)
            {
                if (context != null && AWSConfigs.LoggingConfig.LogResponses == ResponseLoggingOption.OnError)
                {
                    this.logger.Error(e, "Received response: [{0}]", context.ResponseBody);
                }

                asyncResult.RequestState.WebRequest.Abort();
                asyncResult.Exception = e;
                asyncResult.Metrics.AddProperty(Metric.Exception, e);
                asyncResult.Metrics.StopEvent(Metric.ClientExecuteTime);
                shouldRetry = false;
                if (Config.LogMetrics)
                {
                    logger.InfoFormat("Request metrics: {0}", asyncResult.Metrics);
                }

                ProcessExceptionHandlers(e, asyncResult.Request);
                logger.Error(e, "Error configuring web request {0} to {1}.", asyncResult.RequestName, asyncResult.Request.Endpoint.ToString());
            }
            finally
            {
                if (!shouldRetry)
                {
                    var responseData = context == null ? null : context.ResponseData;
                    ProcessResponseHandlers(response, asyncResult.Request, responseData);
                    asyncResult.InvokeCallback();
                }
            }
        }
コード例 #2
0
        void getRequestStreamCallback(IAsyncResult result)
        {
            AsyncResult asyncResult = result as AsyncResult;

            if (asyncResult == null)
            {
                asyncResult = result.AsyncState as AsyncResult;
            }

            asyncResult.RequestState.GetRequestStreamCallbackCalled = true;

            try
            {
                try
                {
                    AsyncResult.AsyncRequestState state = asyncResult.RequestState;
                    if (asyncResult != null &&
                        asyncResult.RequestState != null &&
                        ((asyncResult.RequestState.RequestData != null && asyncResult.RequestState.RequestData.Length > 0) || asyncResult.RequestState.RequestStream != null) &&
                        (!asyncResult.Request.UseQueryString && (asyncResult.RequestState.WebRequest.Method == "POST" || asyncResult.RequestState.WebRequest.Method == "PUT")))
                    {
                        Stream requestStream;
                        if (asyncResult.CompletedSynchronously)
                        {
                            requestStream = state.WebRequest.GetRequestStream();
                        }
                        else
                        {
                            requestStream = state.WebRequest.EndGetRequestStream(result);
                        }

                        using (requestStream)
                        {
                            if (asyncResult.RequestState.RequestStream == null)
                            {
                                byte[] requestData = asyncResult.RequestState.RequestData;
                                asyncResult.Metrics.AddProperty(Metric.RequestSize, requestData.Length);
                                requestStream.Write(requestData, 0, requestData.Length);
                            }
                            else
                            {
                                var originalStream = asyncResult.RequestState.RequestStream;
                                var callback       = asyncResult.Request.OriginalRequest.StreamUploadProgressCallback;
                                if (callback != null)
                                {
                                    var eventStream = new EventStream(originalStream, true);
                                    var tracker     = new StreamReadTracker(this, callback, originalStream.Length, this.Config.ProgressUpdateInterval);
                                    eventStream.OnRead += tracker.ReadProgress;
                                    originalStream      = eventStream;
                                }

                                var buffer      = new byte[this.Config.BufferSize];
                                var inputStream = asyncResult.Request.UseChunkEncoding && asyncResult.Request.AWS4SignerResult != null
                                    ? new ChunkedUploadWrapperStream(originalStream,
                                                                     Config.BufferSize,
                                                                     asyncResult.Request.AWS4SignerResult)
                                    : originalStream;

                                int bytesRead   = 0;
                                int bytesToRead = buffer.Length;

                                while ((bytesRead = inputStream.Read(buffer, 0, bytesToRead)) > 0)
                                {
                                    requestStream.Write(buffer, 0, bytesRead);
                                }
                            }
                        }
                    }

                    if (asyncResult.CompletedSynchronously)
                    {
                        this.getResponseCallback(asyncResult);
                    }
                    else
                    {
                        IAsyncResult httpResult = state.WebRequest.BeginGetResponse(new AsyncCallback(this.getResponseCallback), asyncResult);
                        if (httpResult.CompletedSynchronously)
                        {
                            if (!asyncResult.RequestState.GetResponseCallbackCalled)
                            {
                                getResponseCallback(httpResult);
                            }
                            asyncResult.SetCompletedSynchronously(true);
                        }
                    }
                }
                catch (WebException e)
                {
                    asyncResult.RequestState.WebRequest.Abort();
                    HandleHttpWebErrorResponse(asyncResult, e);

                    asyncResult.RetriesAttempt++;
                    InvokeHelper(asyncResult);
                }
                catch (IOException ioe)
                {
                    if (HandleIOException(asyncResult, null, ioe))
                    {
                        asyncResult.RetriesAttempt++;
                        InvokeHelper(asyncResult);
                    }
                    else
                    {
                        throw;
                    }
                }
                catch (Exception e)
                {
                    asyncResult.RequestState.WebRequest.Abort();
                    asyncResult.Metrics.AddProperty(Metric.Exception, e);

                    asyncResult.HandleException(e);
                }
            }
            catch (Exception exception)
            {
                ProcessExceptionHandlers(exception, asyncResult.Request);
                // Handle WebException/IOExceptionexceptions/AmazonServiceException
                // thrown after retry limit is reached.
                asyncResult.HandleException(exception);
            }
        }
コード例 #3
0
        void getRequestStreamCallback(IAsyncResult result)
        {
            AsyncResult asyncResult;

            if (result is AsyncResult)
            {
                asyncResult = result as AsyncResult;
            }
            else
            {
                asyncResult = result.AsyncState as AsyncResult;
            }

            asyncResult.RequestState.GetRequestStreamCallbackCalled = true;
            try
            {
                AsyncResult.AsyncRequestState state = asyncResult.RequestState;
                if (asyncResult != null &&
                    asyncResult.RequestState != null &&
                    ((asyncResult.RequestState.RequestData != null && asyncResult.RequestState.RequestData.Length > 0) || asyncResult.RequestState.RequestStream != null) &&
                    (!asyncResult.Request.UseQueryString && (asyncResult.RequestState.WebRequest.Method == "POST" || asyncResult.RequestState.WebRequest.Method == "PUT")))
                {
                    Stream requestStream;
                    if (asyncResult.CompletedSynchronously)
                    {
                        requestStream = state.WebRequest.GetRequestStream();
                    }
                    else
                    {
                        requestStream = state.WebRequest.EndGetRequestStream(result);
                    }

                    using (requestStream)
                    {
                        if (asyncResult.RequestState.RequestStream == null)
                        {
                            byte[] requestData = asyncResult.RequestState.RequestData;
                            requestStream.Write(requestData, 0, requestData.Length);
                        }
                        else
                        {
                            var    callback          = asyncResult.Request.OriginalRequest.StreamUploadProgressCallback;
                            byte[] buffer            = new byte[this.config.BufferSize];
                            int    bytesRead         = 0;
                            long   totalBytesWritten = 0;
                            Stream inputStream       = asyncResult.RequestState.RequestStream;
                            while ((bytesRead = inputStream.Read(buffer, 0, buffer.Length)) > 0)
                            {
                                requestStream.Write(buffer, 0, bytesRead);
                                totalBytesWritten += bytesRead;

                                if (callback != null)
                                {
                                    AWSSDKUtils.InvokeInBackground(
                                        callback,
                                        new StreamTransferProgressArgs(bytesRead, totalBytesWritten, inputStream.Length),
                                        this);
                                }
                            }
                        }
                    }
                }

                if (asyncResult.CompletedSynchronously)
                {
                    this.getResponseCallback(asyncResult);
                }
                else
                {
                    IAsyncResult httpResult = state.WebRequest.BeginGetResponse(new AsyncCallback(this.getResponseCallback), asyncResult);
                    if (httpResult.CompletedSynchronously)
                    {
                        if (!asyncResult.RequestState.GetResponseCallbackCalled)
                        {
                            getResponseCallback(httpResult);
                        }
                        asyncResult.SetCompletedSynchronously(true);
                    }
                }
            }
            catch (WebException e)
            {
                try
                {
                    asyncResult.RequestState.WebRequest.Abort();
                    handleHttpWebErrorResponse(asyncResult, e);

                    asyncResult.RetriesAttempt++;
                    InvokeHelper(asyncResult);
                }
                catch (Exception ei)
                {
                    asyncResult.Exception = ei;

                    asyncResult.SignalWaitHandle();
                    if (asyncResult.Callback != null)
                    {
                        asyncResult.Callback(asyncResult);
                    }
                }
            }
            catch (Exception e)
            {
                asyncResult.RequestState.WebRequest.Abort();
                asyncResult.Exception = e;
                asyncResult.Metrics.AddProperty(RequestMetrics.Metric.Exception, e);

                asyncResult.SignalWaitHandle();
                if (asyncResult.Callback != null)
                {
                    asyncResult.Callback(asyncResult);
                }
            }
        }
コード例 #4
0
        void getResponseCallback(IAsyncResult result)
        {
            AsyncResult asyncResult;

            if (result is AsyncResult)
            {
                asyncResult = result as AsyncResult;
            }
            else
            {
                asyncResult = result.AsyncState as AsyncResult;
            }

            UnmarshallerContext context = null;

            asyncResult.RequestState.GetResponseCallbackCalled = true;
            bool shouldRetry = false;

            try
            {
                AsyncResult.AsyncRequestState state = asyncResult.RequestState;
                HttpWebResponse httpResponse        = null;
                try
                {
                    if (asyncResult.CompletedSynchronously)
                    {
                        httpResponse = state.WebRequest.GetResponse() as HttpWebResponse;
                    }
                    else
                    {
                        httpResponse = state.WebRequest.EndGetResponse(result) as HttpWebResponse;
                    }

                    using (asyncResult.Metrics.StartEvent(RequestMetrics.Metric.ResponseProcessingTime))
                    {
                        var unmarshaller = asyncResult.Unmarshaller;
                        asyncResult.Metrics.AddProperty(RequestMetrics.Metric.StatusCode, httpResponse.StatusCode);
                        LogResponse(asyncResult, httpResponse.StatusCode);
                        try
                        {
                            context = unmarshaller.CreateContext(httpResponse, config.LogResponse || config.ReadEntireResponse || AWSConfigs.ResponseLogging != ResponseLoggingOption.Never, asyncResult);

                            AmazonWebServiceResponse response;
                            using (asyncResult.Metrics.StartEvent(RequestMetrics.Metric.ResponseUnmarshallTime))
                            {
                                response = unmarshaller.Unmarshall(context);
                            }
                            context.ValidateCRC32IfAvailable();

                            response.ContentLength    = httpResponse.ContentLength;
                            asyncResult.FinalResponse = response;
                            asyncResult.Metrics.AddProperty(RequestMetrics.Metric.AWSRequestID, response.ResponseMetadata.RequestId);

                            LogFinishedResponse(asyncResult, context, httpResponse.ContentLength);
                            ProcessResponseHandlers(response, asyncResult.Request);
                        }
                        finally
                        {
                            if (!unmarshaller.HasStreamingProperty)
                            {
                                httpResponse.Close();
                            }
                        }
                    }
                }
                catch (WebException we)
                {
                    HttpWebResponse exceptionHttpResponse = we.Response as HttpWebResponse;
                    if (exceptionHttpResponse != null)
                    {
                        LogResponse(asyncResult, exceptionHttpResponse.StatusCode);
                    }
                    else
                    {
                        asyncResult.Metrics.StopEvent(RequestMetrics.Metric.HttpRequestTime);
                    }
                    shouldRetry = handleHttpWebErrorResponse(asyncResult, we);
                }
                catch (IOException ioe)
                {
                    LogResponse(asyncResult, HttpStatusCode.Unused);
                    shouldRetry = handleIOException(asyncResult, httpResponse, ioe);
                }

                if (shouldRetry)
                {
                    asyncResult.RequestState.WebRequest.Abort();
                    asyncResult.RetriesAttempt++;
                    InvokeHelper(asyncResult);
                }
                else
                {
                    LogFinalMetrics(asyncResult);
                }
            }
            catch (Exception e)
            {
                if (context != null && AWSConfigs.ResponseLogging == ResponseLoggingOption.OnError)
                {
                    logger.Error(e, "Received response: [{0}]", context.ResponseBody);
                }

                asyncResult.RequestState.WebRequest.Abort();
                asyncResult.Exception = e;
                asyncResult.Metrics.AddProperty(RequestMetrics.Metric.Exception, e);
                asyncResult.Metrics.StopEvent(RequestMetrics.Metric.ClientExecuteTime);
                shouldRetry = false;
                if (config.LogMetrics)
                {
                    logger.InfoFormat("Request metrics: {0}", asyncResult.Metrics);
                }

                ProcessExceptionHandlers(e, asyncResult.Request);
                logger.Error(e, "Error configuring web request {0} to {1}.", asyncResult.RequestName, asyncResult.Request.Endpoint.ToString());
            }
            finally
            {
                if (!shouldRetry)
                {
                    asyncResult.SignalWaitHandle();
                    if (asyncResult.Callback != null)
                    {
                        asyncResult.Callback(asyncResult);
                    }
                }
            }
        }
コード例 #5
0
        void getResponseCallback(IAsyncResult result)
        {
            AsyncResult asyncResult;

            if (result is AsyncResult)
            {
                asyncResult = result as AsyncResult;
            }
            else
            {
                asyncResult = result.AsyncState as AsyncResult;
            }

            asyncResult.RequestState.GetResponseCallbackCalled = true;
            bool shouldRetry = false;

            try
            {
                AsyncResult.AsyncRequestState state = asyncResult.RequestState;
                HttpWebResponse httpResponse        = null;
                try
                {
                    if (asyncResult.CompletedSynchronously)
                    {
                        httpResponse = state.WebRequest.GetResponse() as HttpWebResponse;
                    }
                    else
                    {
                        httpResponse = state.WebRequest.EndGetResponse(result) as HttpWebResponse;
                    }

                    var unmarshaller = asyncResult.Unmarshaller;
                    LogResponse(asyncResult, httpResponse.StatusCode);
                    try
                    {
                        var context = unmarshaller.CreateContext(httpResponse, config.LogResponse || config.ReadEntireResponse, asyncResult);

                        AmazonWebServiceResponse response = unmarshaller.Unmarshall(context);
                        context.ValidateCRC32IfAvailable();

                        response.ContentLength    = httpResponse.ContentLength;
                        asyncResult.FinalResponse = response;

                        LogFinishedResponse(asyncResult, context, httpResponse.ContentLength);
                        ProcessResponseHandlers(response, asyncResult.Request);
                    }
                    finally
                    {
                        if (!unmarshaller.HasStreamingProperty)
                        {
                            httpResponse.Close();
                        }
                    }
                }
                catch (WebException we)
                {
                    HttpWebResponse exceptionHttpResponse = we.Response as HttpWebResponse;
                    if (exceptionHttpResponse != null)
                    {
                        LogResponse(asyncResult, exceptionHttpResponse.StatusCode);
                    }
                    shouldRetry = handleHttpWebErrorResponse(asyncResult, we);
                }
                catch (IOException ioe)
                {
                    LogResponse(asyncResult, HttpStatusCode.Unused);
                    shouldRetry = handleIOException(asyncResult, httpResponse, ioe);
                }

                if (shouldRetry)
                {
                    asyncResult.RequestState.WebRequest.Abort();
                    asyncResult.RetriesAttempt++;
                    InvokeConfiguredRequest(asyncResult);
                }
            }
            catch (Exception e)
            {
                asyncResult.RequestState.WebRequest.Abort();
                asyncResult.Exception = e;
                shouldRetry           = false;
                ProcessExceptionHandlers(e, asyncResult.Request);
                if (logger.IsErrorEnabled)
                {
                    logger.Error(string.Format("Error configuring web request {0} to {1}.", asyncResult.RequestName, asyncResult.Request.Endpoint.ToString()), e);
                }
            }
            finally
            {
                if (!shouldRetry)
                {
                    asyncResult.SignalWaitHandle();
                    if (asyncResult.Callback != null)
                    {
                        asyncResult.Callback(asyncResult);
                    }
                }
            }
        }