Beispiel #1
0
        private static void HttpRequestHttpCallback(IPluginHttpUtilClient client, HttpRequest request, ICallInfo info,
                                                    HttpRequestQueueResultCode result, AsyncHttpRequest asyncHttpRequest, object state)
        {
            var response = HttpResponseImpl.CreateHttpResponse(request, info, result, asyncHttpRequest);

            client.Log.Debug("Got HttpResoonse - executing callback.");


            // Sync request triggers an event to release the waiting Request thread to continue
            try
            {
                request.Callback(response, state);
            }
            catch (Exception ex)
            {
                client.Log.Error(ex);
                if (request.Async)
                {
                    client.Log.Error(ex);
                    client.PluginReportError(ErrorCodes.AsyncCallbackException, ex, state);
                }
                else
                {
                    throw;
                }
            }
        }
Beispiel #2
0
        private void HandleErrorHttpRespone(PeerBase peer, byte operationCode, HttpRequestQueueResultCode result, AsyncHttpRequest request, string requestUri)
        {
            string msg;

            if (request != null)
            {
                msg = string.Format(
                    "webRpc request to address '{0}' failed. HttpQueueResult:{3}, WebStatus:{1}, Exception :{2}",
                    requestUri,
                    request.WebStatus,
                    request.Exception == null ? "(null)" : request.Exception.ToString(), result);
            }
            else
            {
                msg = string.Format("webRpc request to address '{0}' failed. HttpQueueResult:{1}", requestUri, result);
            }

            this.SendErrorResponse(peer, operationCode, new SendParameters(), msg: msg);

            if (result == HttpRequestQueueResultCode.QueueFull)
            {
                Log.Debug(msg);
            }
            else
            {
                Log.Error(msg);
            }
        }
Beispiel #3
0
        public static HttpResponseImpl CreateHttpResponse(HttpRequest request, ICallInfo info,
                                                          HttpRequestQueueResultCode result, AsyncHttpRequest asyncHttpRequest)
        {
            var    statusCode = -1;
            string statusDescription;

            byte[] responseData         = null;
            NameValueCollection headers = null;

            try
            {
                switch (result)
                {
                case HttpRequestQueueResultCode.Success:
                    statusCode        = (int)asyncHttpRequest.WebResponse.StatusCode;
                    statusDescription = asyncHttpRequest.WebResponse.StatusDescription;
                    responseData      = asyncHttpRequest.Response;
                    headers           = asyncHttpRequest.WebResponse.Headers;
                    break;

                case HttpRequestQueueResultCode.Error:
                    if (asyncHttpRequest.WebResponse != null)
                    {
                        statusCode        = (int)asyncHttpRequest.WebResponse.StatusCode;
                        statusDescription = asyncHttpRequest.WebResponse.StatusDescription;
                        headers           = asyncHttpRequest.WebResponse.Headers;
                    }
                    else
                    {
                        statusDescription = asyncHttpRequest.Exception.Message;
                    }

                    break;

                default:
                    statusCode        = -1;
                    statusDescription = String.Empty;
                    break;
                }
            }
            catch (Exception ex)
            {
                // we should never get her
                statusDescription = ex.Message;

                log.Warn("Exception during http response creation", ex);
            }

            var webStatus = asyncHttpRequest == null ? -1 : (int)asyncHttpRequest.WebStatus;

            if (asyncHttpRequest != null)
            {
                asyncHttpRequest.Dispose();
            }

            return(new HttpResponseImpl(request, info, responseData, result, statusCode, statusDescription, webStatus, headers));
        }
Beispiel #4
0
 private void HandleHttpResponse(PeerBase peer, byte operationCode, HttpRequestQueueResultCode result, WebRpcRequest rpcRequest, AsyncHttpRequest request, string requestUri)
 {
     if (result == HttpRequestQueueResultCode.Success)
     {
         this.HandleSuccessHttpResponse(peer, operationCode, rpcRequest, request);
     }
     else
     {
         this.HandleErrorHttpRespone(peer, operationCode, result, request, requestUri);
     }
 }
Beispiel #5
0
 public HttpResponseImpl(HttpRequest request, ICallInfo info, byte[] responseData,
                         HttpRequestQueueResultCode status, int httpCode, string reason, int webStatus, NameValueCollection headers)
 {
     this.Request      = request;
     this.responseData = responseData;
     this.responseText = responseData == null ? null : Encoding.UTF8.GetString(responseData, 0, responseData.Length);
     this.status       = (byte)status;
     this.httpCode     = httpCode;
     this.reason       = reason;
     this.webStatus    = webStatus;
     this.CallInfo     = info;
     this.Headers      = headers;
 }
Beispiel #6
0
        private void ResponseCallBack(HttpRequestQueueResultCode result, AsyncHttpRequest response, object state)
        {
            Interlocked.Increment(ref this.responseCount);

            var requestState = state as RequestState;

            if (requestState != null)
            {
                requestState.Result   = result;
                requestState.Response = response;
                requestState.State    = state;
                requestState.ResetEvent.Set();
            }

            this.resetEvent.Set();
        }
Beispiel #7
0
 public HttpResponseImpl(HttpRequest request, ICallInfo info, HttpRequestQueueResultCode status, string reason, int webStatus)
     : this(request, info, null, status, 0, reason, webStatus, null)
 {
 }
Beispiel #8
0
        private static void HttpRequestCallback(IPluginHttpUtilClient client, HttpRequest request, HttpRequestQueueResultCode result, AsyncHttpRequest httpRequest, object state, ICallInfo info)
        {
            var callInfo = (ICallInfoImpl)info;

            var doCheck = !callInfo.IsProcessed;

            if (doCheck)
            {
                callInfo.Reset();
            }

            var response = HttpResponseImpl.CreateHttpResponse(request, info, result, httpRequest);

            client.Log.Debug("Got HttpResponse - executing callback.");

            try
            {
                request.Callback(response, state);

                string errorMsg;
                // and check that one of methods was called
                if (doCheck && !info.StrictModeCheck(out errorMsg))
                {
                    var infoTypeName = info.GetType().ToString();
                    client.PluginReportError(ErrorCodes.MissingCallProcessing, null, infoTypeName);
                    info.Fail(string.Format("HttpRequestCallback: {0}", errorMsg));
                }
            }
            catch (Exception ex)
            {
                client.Log.Error(ex);
                client.PluginReportError(ErrorCodes.AsyncCallbackException, ex, state);
                if (!callInfo.IsProcessed)
                {
                    callInfo.Fail(ex.ToString());
                }
            }
        }
Beispiel #9
0
        //added for Viveport, they use 4XX status codes when token expires
        private void OnCallbackReturnExpectedStatusCodes(HttpRequestQueueResultCode resultCode, AsyncHttpRequest result, object userState, Action <AsyncHttpResponse, ClientAuthenticationQueue> userCallback, List <HttpStatusCode> expectedStatusCodes)
        {
            try
            {
                var    url          = result.WebRequest.RequestUri;
                byte[] responseData = null;
                var    status       = result.Status;
                var    exception    = result.Exception;

                this.RequestTimeCounter.AddValue((int)result.Elapsedtime.TotalMilliseconds);
                if (result.Response != null)
                {
                    responseData = result.Response;
                }

                if (resultCode == HttpRequestQueueResultCode.Error && expectedStatusCodes != null && expectedStatusCodes.Any(expectedStatusCode => expectedStatusCode == result.WebResponse.StatusCode))
                {
                    resultCode   = HttpRequestQueueResultCode.Success;
                    responseData = Encoding.UTF8.GetBytes(string.Format("{0}/{1}", (int)result.WebResponse.StatusCode, result.WebResponse.StatusDescription));
//                    responseData = Encoding.UTF8.GetBytes(((int)result.WebResponse.StatusCode).ToString());
                }

                result.Dispose();

                byte[] resultResponseData = null;
                switch (resultCode)
                {
                case HttpRequestQueueResultCode.Success:
                {
                    if (log.IsDebugEnabled)
                    {
                        var responseString = string.Empty;
                        if (responseData != null)
                        {
                            responseString = Encoding.UTF8.GetString(responseData);
                        }

                        log.DebugFormat(
                            "Custom authentication result: uri={0}, status={1}, msg={2}, data={3}",
                            url,
                            status,
                            exception != null ? exception.Message : string.Empty,
                            responseString);
                    }

                    this.timeoutCounter.AddValue(0);
                    resultResponseData = responseData;
                }
                break;

                case HttpRequestQueueResultCode.RequestTimeout:
                {
                    if (log.IsDebugEnabled)
                    {
                        log.DebugFormat("Custom authentication timed out: uri={0}, status={1}, msg={2}",
                                        url, status, exception != null ? exception.Message : string.Empty);
                    }
                    this.timeoutCounter.AddValue(1);
                }
                break;

                case HttpRequestQueueResultCode.QueueFull:
                {
                    if (log.IsDebugEnabled)
                    {
                        log.DebugFormat(
                            "Custom authentication error: queue is full. Requests count {0}, url:{1}, msg:{2}",
                            this.httpRequestQueue.QueuedRequestCount, url,
                            exception != null ? exception.Message : string.Empty);
                    }
                }
                break;

                case HttpRequestQueueResultCode.QueueTimeout:
                    if (log.IsDebugEnabled)
                    {
                        log.DebugFormat("Custom authentication error: Queue timedout. uri={0}, status={1}, msg={2}",
                                        url, status, exception != null ? exception.Message : string.Empty);
                    }
                    break;

                case HttpRequestQueueResultCode.Error:
                {
                    if (log.IsDebugEnabled)
                    {
                        log.DebugFormat("Custom authentication error: uri={0}, status={1}, msg={2}",
                                        url, status, exception != null ? exception.Message : string.Empty);
                    }
                }
                break;

                case HttpRequestQueueResultCode.Offline:
                {
                    if (log.IsDebugEnabled)
                    {
                        log.DebugFormat("Custom auth error. Queue is offline. url:{0}, status{1}, msg:{2}",
                                        url, status, exception != null ? exception.Message : string.Empty);
                    }
                }
                break;
                }

                var response = new AsyncHttpResponse(resultCode, this.RejectIfUnavailable, userState)
                {
                    ResponseData = resultResponseData,
                    ElapsedTicks = result.ElapsedTicks,
                };

                ThreadPool.QueueUserWorkItem(delegate { userCallback(response, this); });
                return;
            }
            catch (Exception e)
            {
                log.Error(e);
            }


            ThreadPool.QueueUserWorkItem(delegate { userCallback(new AsyncHttpResponse(HttpRequestQueueResultCode.Error, this.RejectIfUnavailable, userState), this); });
        }
Beispiel #10
0
 private void HandleHttpResponse(PeerBase peer, byte operationCode, HttpRequestQueueResultCode result, WebRpcRequest rpcRequest, AsyncHttpRequest request, string requestUri)
 {
     if (result == HttpRequestQueueResultCode.Success)
     {
         this.HandleSuccessHttpResponse(peer, operationCode, rpcRequest, request);
     }
     else
     {
         this.HandleErrorHttpRespone(peer, operationCode, result, request, requestUri);
     }
 }
Beispiel #11
0
        private void HandleErrorHttpRespone(PeerBase peer, byte operationCode, HttpRequestQueueResultCode result, AsyncHttpRequest request, string requestUri)
        {
            string msg;
            if (request != null)
            {
                msg = string.Format(
                "webRpc request to address '{0}' failed. HttpQueueResult:{3}, WebStatus:{1}, Exception :{2}",
                requestUri,
                request.WebStatus,
                request.Exception == null ? "(null)" : request.Exception.ToString(), result);
            }
            else
            {
                msg = string.Format("webRpc request to address '{0}' failed. HttpQueueResult:{1}", requestUri, result);
            }

            this.SendErrorResponse(peer, operationCode, new SendParameters(), msg: msg);

            if (result == HttpRequestQueueResultCode.QueueFull)
            {
                Log.Debug(msg);
            }
            else
            {
                Log.Error(msg);
            }
        }
 public AsyncHttpResponse(HttpRequestQueueResultCode status, bool rejectIfUnavailable, object state)
 {
     this.Status = status;
     this.State = state;
     this.RejectIfUnavailable = rejectIfUnavailable;
 }
        private void OnCallback(HttpRequestQueueResultCode resultCode, 
            AsyncHttpRequest result, object userState, Action<AsyncHttpResponse, ClientAuthenticationQueue> userCallback)
        {
            try
            {
                var url = result.WebRequest.RequestUri;
                byte[] responseData = null;
                var status = result.Status;
                var exception = result.Exception;

                this.RequestTimeCounter.AddValue((int)result.Elapsedtime.TotalMilliseconds);
                if (result.Response != null)
                {
                    responseData = result.Response;
                }

                byte[] resultResponseData = null;
                switch (resultCode)
                {
                    case HttpRequestQueueResultCode.Success:
                    {
                        if (log.IsDebugEnabled)
                        {
                            var responseString = string.Empty;
                            if (responseData != null)
                            {
                                responseString = Encoding.UTF8.GetString(responseData);
                            }

                            log.DebugFormat(
                                "Custom authentication result: uri={0}, status={1}, msg={2}, data={3}",
                                url,
                                status,
                                exception != null ? exception.Message : string.Empty,
                                responseString);
                        }

                        this.timeoutCounter.AddValue(0);
                        resultResponseData = responseData;
                    }
                        break;
                    case HttpRequestQueueResultCode.RequestTimeout:
                    {
                        if (log.IsDebugEnabled)
                        {
                            log.DebugFormat("Custom authentication timed out: uri={0}, status={1}, msg={2}",
                                url, status, exception != null ? exception.Message : string.Empty);
                        }
                        this.timeoutCounter.AddValue(1);
                    }
                        break;
                    case HttpRequestQueueResultCode.QueueFull:
                    {
                        if (log.IsDebugEnabled)
                        {
                            log.DebugFormat(
                                "Custom authentication error: queue is full. Requests count {0}, url:{1}, msg:{2}",
                                this.httpRequestQueue.QueuedRequestCount, url,
                                exception != null ? exception.Message : string.Empty);
                        }
                    }
                        break;
                    case HttpRequestQueueResultCode.QueueTimeout:
                        if (log.IsDebugEnabled)
                        {
                            log.DebugFormat("Custom authentication error: Queue timedout. uri={0}, status={1}, msg={2}",
                                url, status, exception != null ? exception.Message : string.Empty);
                        }
                        break;
                    case HttpRequestQueueResultCode.Error:
                    {
                        if (log.IsDebugEnabled)
                        {
                            log.DebugFormat("Custom authentication error: uri={0}, status={1}, msg={2}",
                                url, status, exception != null ? exception.Message : string.Empty);
                        }
                    }
                        break;
                    case HttpRequestQueueResultCode.Offline:
                    {
                        if (log.IsDebugEnabled)
                        {
                            log.DebugFormat("Custom auth error. Queue is offline. url:{0}, status{1}, msg:{2}",
                                url, status, exception != null ? exception.Message : string.Empty);
                        }
                    }
                        break;
                }

                var response = new AsyncHttpResponse(resultCode, this.RejectIfUnavailable, userState)
                    {
                        ResponseData = resultResponseData
                    };

                ThreadPool.QueueUserWorkItem(delegate { userCallback(response, this); });
                return;
            }
            catch (Exception e)
            {
                log.ErrorFormat("Exception happened:{0}", e);
            }

            ThreadPool.QueueUserWorkItem(delegate { userCallback(new AsyncHttpResponse(HttpRequestQueueResultCode.Error, this.RejectIfUnavailable, userState), this); });
        }
        private void ResponseCallBack(HttpRequestQueueResultCode result, AsyncHttpRequest response, object state)
        {
            Interlocked.Increment(ref this.responseCount);

            var requestState = state as RequestState;
            if (requestState != null)
            {
                requestState.Result = result;
                requestState.Response = response;
                requestState.State = state;
                requestState.ResetEvent.Set();
            }

            this.resetEvent.Set();
        }
Beispiel #15
0
        private static void HttpRequestQueueCallbackAsync(HttpRequestQueueResultCode result, AsyncHttpRequest request, object userState)
        {
            var state = (AsyncRequestState)userState;

            state.Stopwatch.Stop();
            var appId     = state.AppId;
            var elapsedMS = state.Stopwatch.ElapsedMilliseconds;
            var queue     = state.HttpQueue;

            state.ResultCode = MonitoringServiceResult.Error;
            state.HttpRequestQueueResultCode = result;

            switch (result)
            {
            case HttpRequestQueueResultCode.Success:
            {
                GetTmpMonitoringFromResponse(state, request.WebRequest.RequestUri.ToString(), Encoding.UTF8.GetString(request.Response));
                break;
            }

            case HttpRequestQueueResultCode.RequestTimeout:
            {
                if (log.IsWarnEnabled)
                {
                    log.WarnFormat(
                        "Monitoring service: Request failed. Timeout. appId={0}, url={1}, duration: {2}ms, duration2: {4}, request timeout set to: {3}ms, ConnectionLimit:{5}",
                        appId,
                        request.WebRequest.RequestUri,
                        elapsedMS,
                        request.WebRequest.Timeout,
                        request.Elapsedtime,
                        System.Net.ServicePointManager.DefaultConnectionLimit);
                }


                state.ResultCode   = MonitoringServiceResult.Timeout;
                state.ErrorMessage = ErrorMessages.RequestTimedout;
                break;
            }

            case HttpRequestQueueResultCode.Error:
            {
                var response = request.WebResponse;
                if (response != null && response.StatusCode == HttpStatusCode.NotFound)
                {
//                            if (state.IsBlobStoreQueue && log.IsWarnEnabled)
//                            {
//                                log.WarnFormat(state.LogGuard,
//                                    "Account service: Application account does not exist or Url is wrong - did user submit an invalid App ID? appId={0}, url={1}, duration: {2}ms, request timeout set to: {3}ms",
//                                    appId,
//                                    request.WebRequest.RequestUri,
//                                    elapsedMS,
//                                    request.WebRequest.Timeout);
//                            }

                    state.ResultCode   = MonitoringServiceResult.NotFound;
                    state.ErrorMessage = ErrorMessages.AppIdNotFound;
                }
                else
                {
                    var msg = string.Format("Monitoring service: Error getting application account: appId={0}, url={1}", appId, request.WebRequest.RequestUri);
                    log.Error(state.LogGuard, msg, request.Exception);
                    state.ErrorMessage = string.Format("Error during getting monitoring: WebStatus:{0}, Request Status:{1}", request.WebStatus, request.Status);
                }
                break;
            }

            case HttpRequestQueueResultCode.QueueTimeout:
            {
                if (log.IsWarnEnabled)
                {
                    log.WarnFormat(state.LogGuard,
                                   "Monitoring service: Request failed. Http Queue Timeout. appId:'{0}', url:'{1}', timeout:{2}, max concurent request:{3}",
                                   appId,
                                   request.WebRequest.RequestUri,
                                   queue.QueueTimeout,
                                   queue.MaxConcurrentRequests
                                   );
                }

                state.ErrorMessage = ErrorMessages.QueueTimeout;
                break;
            }

            case HttpRequestQueueResultCode.QueueFull:
            {
                if (log.IsWarnEnabled)
                {
                    log.WarnFormat(state.LogGuard,
                                   "Monitoring service: Request failed. Http Queue Full. appId:'{0}', url:'{1}', max queue size:{2}",
                                   appId,
                                   request.WebRequest.RequestUri,
                                   queue.MaxQueuedRequests);
                }
                state.ErrorMessage = ErrorMessages.QueueFull;
                break;
            }

            case HttpRequestQueueResultCode.Offline:
            {
                if (log.IsWarnEnabled)
                {
                    log.WarnFormat(state.LogGuard,
                                   "Monitoring service: Request failed. Http Queue is offline. appId:'{0}', url:'{1}', queue reconnect interval:{2}",
                                   appId,
                                   request.WebRequest.RequestUri,
                                   queue.ReconnectInterval);
                }
                state.ErrorMessage = ErrorMessages.QueueOffline;
                break;
            }

            default:
                log.ErrorFormat("Monitoring service: Unknown result code: {0}, a", result);
                break;
            }

            request.Dispose();

            try
            {
                state.Callback(state);
            }
            catch (Exception e)
            {
                log.Warn(state.LogGuard, string.Format("Monitoring service: Got exception during callback call. appId:{0}. Exception Msg:{1}", appId, e.Message), e);
            }
        }
Beispiel #16
0
        private void HttpRequestHttpCallback(HttpRequest request, HttpRequestQueueResultCode result, AsyncHttpRequest httpRequest, object state)
        {
            var statusCode = -1;
            string statusDescription;
            byte[] responseData = null;

            try
            {
                switch (result)
                {
                    case HttpRequestQueueResultCode.Success:
                        statusCode = (int)httpRequest.WebResponse.StatusCode;
                        statusDescription = httpRequest.WebResponse.StatusDescription;
                        responseData = httpRequest.Response;
                        break;

                    case HttpRequestQueueResultCode.Error:
                        if (httpRequest.WebResponse != null)
                        {
                            statusCode = (int)httpRequest.WebResponse.StatusCode;
                            statusDescription = httpRequest.WebResponse.StatusDescription;
                        }
                        else
                        {
                            statusDescription = httpRequest.Exception.Message;
                        }

                        break;
                    default:
                        statusCode = -1;
                        statusDescription = string.Empty;
                        break;
                }
            }
            catch (Exception ex)
            {
                // we should never get her
                statusDescription = ex.Message;
            }

            var response = new HttpResponseImpl(
                request,
                responseData,
                responseData == null ? null : Encoding.UTF8.GetString(responseData, 0, responseData.Length),
                result,
                statusCode,
                statusDescription,
                httpRequest == null ? -1 : (int)httpRequest.WebStatus);

            Log.Debug("Got HttpResoonse - executing callback.");

            // Sync request triggers an event to release the waiting Request thread to continue
            try
            {
                request.Callback(response, state);
            }
            catch (Exception ex)
            {
                Log.Error(ex);
                if (request.Async)
                {
                    this.Plugin.ReportError(ErrorCodes.AsyncCallbackException, ex, state);
                }
                else
                {
                    throw;
                }
            }
        }
Beispiel #17
0
 public HttpResponseImpl(HttpRequest request, byte[] responseData, string responseText, HttpRequestQueueResultCode status, int httpCode, string reason, int webStatus)
 {
     this.Request = request;
     this.responseData = responseData;
     this.responseText = responseText;
     this.status = (byte)status;
     this.httpCode = httpCode;
     this.reason = reason;
     this.webStatus = webStatus;
 }
Beispiel #18
0
 public AsyncHttpResponse(HttpRequestQueueResultCode status, bool rejectIfUnavailable, object state)
 {
     this.Status = status;
     this.State  = state;
     this.RejectIfUnavailable = rejectIfUnavailable;
 }