Example #1
0
        public void Intercept(IInvocation invocation)
        {
            var client = new RestClient(_baseUrl);

            client.Timeout = int.Parse(ConfigurationManager.AppSettings[CLINET_REST_TIMEOUT]);

            var methodInfo  = invocation.Method;
            var route       = methodInfo.GetCustomAttributes <RouteAttribute>().First().Template;
            var method      = GetHttpMethod(methodInfo);
            var restRequest = new RestRequest(route, method);

            // adds "Token" to header
            var url = _baseUrl + route;

            if (!IsLogin(url) && !IsExchangeRates(url) && !IsRegister(url) && !IsRegisterPending(url) && !IsAnonymous(url))
            {
                restRequest.AddHeader(TOKEN_HEADER, _token.GetToken());
            }

            // adds "Accept-Language" to header
            string uiLanguage = Thread.CurrentThread.CurrentUICulture.Name;

            if (uiLanguage.Equals(SPANISH_LANGUAGE))
            {
                restRequest.AddHeader(ACCEPT_LANGUAGE_HEADER, uiLanguage);
            }
            else
            {
                restRequest.AddHeader(ACCEPT_LANGUAGE_HEADER, ENGLISH_LANGUAGE);
            }

            // adds client ip address to header.
            restRequest.AddHeader(CLIENT_IP_ADDRESS, HttpContext.Current.Request.UserHostAddress);

            // adds validation code to heander.
            SetValidationCode(restRequest);

            // adds j1kpme4dvag1dt0tmjbx0oeh to ASP.NET_SessionId cookie. POS backend's session id will be hardcoded.
            restRequest.AddCookie(ASP_NET_SESSION_ID, HttpContext.Current.Session.SessionID);

            var parameters = methodInfo.GetParameters();

            // handles the segment parameters in url, i.e. {controller}/{id}, the id is a segment parameter
            var segmentCount = route.Count(c => c == '{');

            for (var i = 0; i < segmentCount; i++)
            {
                restRequest.AddUrlSegment(parameters[i].Name, invocation.Arguments[i].ToString());
            }

            // handles the parameters except segment parameters
            for (var i = segmentCount; i < parameters.Count(); i++)
            {
                var parameter    = parameters[i];
                var argument     = invocation.Arguments[i];
                var argumentType = argument.GetType();
                if ((argumentType.IsPrimitive || argumentType.IsValueType || argumentType == typeof(string)))
                {
                    AddSimpleParameter(restRequest, parameter, argument, argumentType);
                }
                else if (argumentType.IsArray)
                {
                    AddArrayParameter(restRequest, parameter, argument, argumentType);
                }
                else
                {
                    AddObjectParameter(restRequest, parameter, argument, argumentType);
                }
            }

            var methodName = methodInfo.ReflectedType.FullName + "." + methodInfo.Name;

            _loggerHelper.LogWebRequest(methodName, LogWebRequestState.Request, LogWebRequestType.Exec);

            // handles the response
            var response = client.Execute(restRequest);

            _loggerHelper.LogWebRequest(methodName, LogWebRequestState.Completed, LogWebRequestType.Exec);

            int responseCode = (int)response.StatusCode;

            if (responseCode == 200)
            {
                var returnValue = JsonConvert.DeserializeObject(response.Content, methodInfo.ReturnType, _jsonSerializerSettings);
                invocation.ReturnValue = returnValue;
            }
            else if (responseCode != 204)
            {
                if (string.IsNullOrEmpty(response.Content))
                {
                    _loggerHelper.LogWebRequest(methodName, LogWebRequestState.Error, LogWebRequestType.Exec, response.ErrorMessage);

                    throw new Exception(response.ErrorMessage);
                }
                else
                {
                    _loggerHelper.LogWebRequest(methodName, LogWebRequestState.Error, LogWebRequestType.Exec, response.Content);

                    throw new WebException(response.Content);
                }
            }
            else
            {
                if (string.IsNullOrEmpty(response.Content))
                {
                    _loggerHelper.LogWebRequest(methodName, LogWebRequestState.Error, LogWebRequestType.Exec, response.ErrorMessage);
                }
                else
                {
                    _loggerHelper.LogWebRequest(methodName, LogWebRequestState.Error, LogWebRequestType.Exec, response.Content);
                }
            }
        }