public virtual IChromelyResponse HandleError(IChromelyRequest request, IChromelyResponse response, Exception exception)
        {
            Logger.Instance.Log.LogError(exception, exception.Message);

            return(new ChromelyResponse
            {
                RequestId = request?.Id,
                ReadyState = (int)ReadyState.ResponseIsReady,
                Status = (int)System.Net.HttpStatusCode.BadRequest,
                StatusText = "An error has occurred"
            });
        }
Beispiel #2
0
        public void Get2InvokeTest()
        {
            BaseTest();

            string routeKey  = RouteKey.CreateRequestKey("/testcontroller/movies/2");
            var    routeGet2 = _requestActionRouteDictionary[routeKey];

            Assert.NotNull(routeGet2);

            IChromelyResponse response = routeGet2.Invoke(new ChromelyRequest("/testcontroller/movies/2", null, null));

            Assert.NotNull(response);
            Assert.True(response.Data is string);
            Assert.Equal("Test Get 2", (string)response.Data);
        }
 public DefaultRequestSchemeHandler(IChromelyRouteProvider routeProvider,
                                    IChromelyRequestSchemeProvider requestSchemeProvider,
                                    IChromelyRequestHandler requestHandler,
                                    IChromelyDataTransferOptions dataTransferOptions,
                                    IChromelyErrorHandler chromelyErrorHandler)
 {
     _routeProvider         = routeProvider;
     _requestSchemeProvider = requestSchemeProvider;
     _requestHandler        = requestHandler;
     _dataTransferOptions   = dataTransferOptions;
     _chromelyErrorHandler  = chromelyErrorHandler;
     _chromelyResponse      = new ChromelyResponse();
     _mimeType = ResourceHandler.DefaultMimeType;
     _stream   = Stream.Null;
 }
        public string Execute(string path, object parameters = null, object postData = null)
        {
            IChromelyResponse response = null;
            bool isRequestAsync        = _routeProvider.IsActionRouteAsync(path);

            if (isRequestAsync)
            {
                var task = Task.Run(async() => { return(await _requestTaskRunner.RunAsync(path, parameters.ToDictionary(), postData)); });
                task.Wait();
                response = task.Result;
            }
            else
            {
                response = _requestTaskRunner.Run(path, parameters.ToDictionary(), postData);
            }

            return(response == null ? string.Empty : _serializerUtil.ObjectToJson(response));
        }
    /// <inheritdoc/>
    public virtual IChromelyResponse HandleError(IChromelyRequest request, IChromelyResponse response, Exception?exception = null)
    {
        if (exception is not null)
        {
            Logger.Instance.Log.LogError(exception);
        }

        var localResponse = new ChromelyResponse
        {
            ReadyState = (int)ReadyState.ResponseIsReady,
            Status     = (int)System.Net.HttpStatusCode.BadRequest,
            StatusText = "An error has occurred"
        };

        localResponse.RequestId = (request is not null && string.IsNullOrWhiteSpace(request.Id))
                                ? request.Id
                                : localResponse.RequestId;

        return(localResponse);
    }
        protected override bool ProcessRequest(CefRequest request, CefCallback callback)
        {
            var isSchemeRegistered = _requestSchemeProvider?.IsSchemeRegistered(request.Url);

            if (isSchemeRegistered.HasValue && isSchemeRegistered.Value)
            {
                var uri  = new Uri(request.Url);
                var path = uri.LocalPath;

                bool isRequestAsync = _routeProvider.IsActionRouteAsync(path);
                if (isRequestAsync)
                {
                    ProcessRequestAsync(path);
                }
                else
                {
                    ProcessRequest(path);
                }

                return(true);
            }
            else
            {
                _chromelyResponse = _chromelyErrorHandler.HandleRouteNotFound(request.Identifier.ToString(), request.Url);
                string jsonData = _serializerUtil.EnsureResponseDataIsJson(_chromelyResponse.Data);
                _responseBytes = Encoding.UTF8.GetBytes(jsonData);
            }

            callback.Dispose();
            return(false);

            #region Process Request

            void ProcessRequest(string path)
            {
                Task.Run(() =>
                {
                    using (callback)
                    {
                        try
                        {
                            if (string.IsNullOrWhiteSpace(path))
                            {
                                _chromelyResponse = _chromelyErrorHandler.HandleRouteNotFound(request.Identifier.ToString(), path);
                                string jsonData   = _serializerUtil.EnsureResponseDataIsJson(_chromelyResponse.Data);
                                _responseBytes    = Encoding.UTF8.GetBytes(jsonData);
                            }
                            else
                            {
                                var parameters = request.Url.GetParameters(request.ReferrerURL);
                                var postData   = GetPostData(request);

                                var jsonRequest   = _serializerUtil.ObjectToJson(request);
                                _chromelyResponse = _requestTaskRunner.Run(request.Identifier.ToString(), path, parameters, postData, jsonRequest);
                                string jsonData   = _serializerUtil.EnsureResponseDataIsJson(_chromelyResponse.Data);
                                _responseBytes    = Encoding.UTF8.GetBytes(jsonData);
                            }
                        }
                        catch (Exception exception)
                        {
                            var chromelyRequest = new ChromelyRequest()
                            {
                                Id = request.Identifier.ToString(), RouteUrl = request.Url
                            };
                            _chromelyResponse = _chromelyErrorHandler.HandleError(chromelyRequest, exception);
                            string jsonData   = _serializerUtil.EnsureResponseDataIsJson(_chromelyResponse.Data);
                            _responseBytes    = Encoding.UTF8.GetBytes(jsonData);
                        }
                        finally
                        {
                            callback.Continue();
                        }
                    }
                });
            }

            #endregion

            #region Process Request Async

            void ProcessRequestAsync(string path)
            {
                Task.Run(async() =>
                {
                    using (callback)
                    {
                        try
                        {
                            if (string.IsNullOrWhiteSpace(path))
                            {
                                _chromelyResponse = _chromelyErrorHandler.HandleRouteNotFound(request.Identifier.ToString(), path);
                                string jsonData   = _serializerUtil.EnsureResponseDataIsJson(_chromelyResponse.Data);
                                _responseBytes    = Encoding.UTF8.GetBytes(jsonData);
                            }
                            else
                            {
                                var parameters = request.Url.GetParameters(request.ReferrerURL);
                                var postData   = GetPostData(request);

                                var jsonRequest   = _serializerUtil.ObjectToJson(request);
                                _chromelyResponse = await _requestTaskRunner.RunAsync(request.Identifier.ToString(), path, parameters, postData, jsonRequest);
                                string jsonData   = _serializerUtil.EnsureResponseDataIsJson(_chromelyResponse.Data);

                                _responseBytes = Encoding.UTF8.GetBytes(jsonData);
                            }
                        }
                        catch (Exception exception)
                        {
                            var chromelyRequest = new ChromelyRequest()
                            {
                                Id = request.Identifier.ToString(), RouteUrl = request.Url
                            };
                            _chromelyResponse = _chromelyErrorHandler.HandleError(chromelyRequest, exception);
                            string jsonData   = _serializerUtil.EnsureResponseDataIsJson(_chromelyResponse.Data);
                            _responseBytes    = Encoding.UTF8.GetBytes(jsonData);
                        }
                        finally
                        {
                            callback.Continue();
                        }
                    }
                });
            }

            #endregion
        }
        protected override bool ProcessRequest(CefRequest request, CefCallback callback)
        {
            var isSchemeRegistered = _requestSchemeProvider?.IsSchemeRegistered(request.Url);

            if (isSchemeRegistered.HasValue && isSchemeRegistered.Value)
            {
                var uri  = new Uri(request.Url);
                var path = uri.LocalPath;

                bool isRequestAsync = _routeProvider.IsActionRouteAsync(path);
                if (isRequestAsync)
                {
                    ProcessRequestAsync(path);
                }
                else
                {
                    ProcessRequest(path);
                }

                return(true);
            }

            Logger.Instance.Log.LogWarning($"Url {request.Url} is not of a registered custom scheme.");
            callback.Dispose();
            return(false);

            #region Process Request

            void ProcessRequest(string path)
            {
                Task.Run(() =>
                {
                    using (callback)
                    {
                        try
                        {
                            var response = new ChromelyResponse();
                            if (string.IsNullOrEmpty(path))
                            {
                                response.ReadyState = (int)ReadyState.ResponseIsReady;
                                response.Status     = (int)HttpStatusCode.BadRequest;
                                response.StatusText = "Bad Request";

                                _chromelyResponse = response;
                            }
                            else
                            {
                                var parameters = request.Url.GetParameters();
                                var postData   = GetPostData(request);

                                var jsonRequest   = _serializerUtil.ObjectToJson(request);
                                _chromelyResponse = _requestTaskRunner.Run(request.Identifier.ToString(), path, parameters, postData, jsonRequest);
                                string jsonData   = _serializerUtil.EnsureResponseDataIsJson(_chromelyResponse.Data);
                                _responseBytes    = Encoding.UTF8.GetBytes(jsonData);
                            }
                        }
                        catch (Exception exception)
                        {
                            Logger.Instance.Log.LogError(exception, exception.Message);

                            _chromelyResponse =
                                new ChromelyResponse
                            {
                                Status = (int)HttpStatusCode.BadRequest,
                                Data   = "An error occured."
                            };
                        }
                        finally
                        {
                            callback.Continue();
                        }
                    }
                });
            }

            #endregion

            #region Process Request Async

            void ProcessRequestAsync(string path)
            {
                Task.Run(async() =>
                {
                    using (callback)
                    {
                        try
                        {
                            var response = new ChromelyResponse();
                            if (string.IsNullOrEmpty(path))
                            {
                                response.ReadyState = (int)ReadyState.ResponseIsReady;
                                response.Status     = (int)System.Net.HttpStatusCode.BadRequest;
                                response.StatusText = "Bad Request";

                                _chromelyResponse = response;
                            }
                            else
                            {
                                var parameters = request.Url.GetParameters();
                                var postData   = GetPostData(request);

                                var jsonRequest   = _serializerUtil.ObjectToJson(request);
                                _chromelyResponse = await _requestTaskRunner.RunAsync(request.Identifier.ToString(), path, parameters, postData, jsonRequest);
                                string jsonData   = _serializerUtil.EnsureResponseDataIsJson(_chromelyResponse.Data);

                                _responseBytes = Encoding.UTF8.GetBytes(jsonData);
                            }
                        }
                        catch (Exception exception)
                        {
                            Logger.Instance.Log.LogError(exception, exception.Message);

                            _chromelyResponse =
                                new ChromelyResponse
                            {
                                Status = (int)HttpStatusCode.BadRequest,
                                Data   = "An error occured."
                            };
                        }
                        finally
                        {
                            callback.Continue();
                        }
                    }
                });
            }

            #endregion
        }
    /// <summary>
    /// The process request async.
    /// </summary>
    /// <param name="request">
    /// The request.
    /// </param>
    /// <param name="callback">
    /// The callback.
    /// </param>
    /// <returns>
    /// The <see cref="bool"/>.
    /// </returns>
    public override CefReturnValue ProcessRequestAsync(CefRequest request, CefCallback callback)
    {
        var scheme = _requestSchemeProvider?.GetScheme(request.Url);

        if (scheme is not null && scheme.UrlSchemeType == UrlSchemeType.LocalRequest)
        {
            _stream = Stream.Null;
            var uri  = new Uri(request.Url);
            var path = uri.LocalPath;
            _mimeType = "application/json";

            bool isRequestAsync = _routeProvider.IsRouteAsync(path);
            if (isRequestAsync)
            {
                ProcessRequestAsync(path);
            }
            else
            {
                ProcessRequest(path);
            }
        }

        return(CefReturnValue.ContinueAsync);

        #region Process Request

        void ProcessRequest(string path)
        {
            Task.Run(() =>
            {
                using (callback)
                {
                    try
                    {
                        var response = new ChromelyResponse();
                        if (string.IsNullOrEmpty(path))
                        {
                            _chromelyResponse = _chromelyErrorHandler.HandleRouteNotFound(request.Identifier.ToString(), path);
                        }
                        else
                        {
                            var parameters = request.Url.GetParameters();
                            var postData   = GetPostData(request);

                            var jsonRequest   = _dataTransferOptions.ConvertObjectToJson(request);
                            _chromelyResponse = _requestHandler.Execute(request.Identifier.ToString(), path, parameters, postData, jsonRequest);
                            string?jsonData   = _dataTransferOptions.ConvertResponseToJson(_chromelyResponse.Data);

                            if (jsonData is not null)
                            {
                                var content = Encoding.UTF8.GetBytes(jsonData);
                                _stream     = new MemoryStream();
                                _stream.Write(content, 0, content.Length);
                            }
                        }
                    }
                    catch (Exception exception)
                    {
                        _stream             = Stream.Null;
                        var chromelyRequest = new ChromelyRequest()
                        {
                            Id = request.Identifier.ToString(), RouteUrl = request.Url
                        };
                        _chromelyResponse = _chromelyErrorHandler.HandleError(chromelyRequest, exception);
                    }

                    if (_stream is null)
                    {
                        callback.Cancel();
                    }
                    else
                    {
                        SetResponseInfoOnSuccess();
                        callback.Continue();
                    }
                }
            });
        }

        #endregion

        #region Process Request Async

        void ProcessRequestAsync(string path)
        {
            Task.Run(async() =>
            {
                using (callback)
                {
                    try
                    {
                        var response = new ChromelyResponse();
                        if (string.IsNullOrEmpty(path))
                        {
                            _chromelyResponse = _chromelyErrorHandler.HandleRouteNotFound(request.Identifier.ToString(), path);
                        }
                        else
                        {
                            var parameters = request.Url.GetParameters(request.ReferrerURL);
                            var postData   = GetPostData(request);

                            var jsonRequest   = _dataTransferOptions.ConvertObjectToJson(request);
                            _chromelyResponse = await _requestHandler.ExecuteAsync(request.Identifier.ToString(), path, parameters, postData, jsonRequest);
                            string?jsonData   = _dataTransferOptions.ConvertResponseToJson(_chromelyResponse.Data);

                            if (jsonData is not null)
                            {
                                var content = Encoding.UTF8.GetBytes(jsonData);
                                _stream     = new MemoryStream();
                                _stream.Write(content, 0, content.Length);
                            }
                        }
                    }
                    catch (Exception exception)
                    {
                        _stream             = Stream.Null;
                        var chromelyRequest = new ChromelyRequest()
                        {
                            Id = request.Identifier.ToString(), RouteUrl = request.Url
                        };
                        _chromelyResponse = _chromelyErrorHandler.HandleError(chromelyRequest, exception);
                    }

                    if (_stream is null)
                    {
                        callback.Cancel();
                    }
                    else
                    {
                        SetResponseInfoOnSuccess();
                        callback.Continue();
                    }
                }
            });
        }

        #endregion
    }
        /// <summary>
        /// The process request async.
        /// </summary>
        /// <param name="request">
        /// The request.
        /// </param>
        /// <param name="callback">
        /// The callback.
        /// </param>
        /// <returns>
        /// The <see cref="bool"/>.
        /// </returns>
        public override CefReturnValue ProcessRequestAsync(IRequest request, ICallback callback)
        {
            var scheme = _requestSchemeHandlerProvider?.GetScheme(request.Url);

            if (scheme != null && scheme.UrlSchemeType == UrlSchemeType.LocalRquest)
            {
                _stream = null;
                var uri  = new Uri(request.Url);
                var path = uri.LocalPath;
                _mimeType = "application/json";

                bool isRequestAsync = _routeProvider.IsActionRouteAsync(path);
                if (isRequestAsync)
                {
                    ProcessRequestAsync(path);
                }
                else
                {
                    ProcessRequest(path);
                }
            }

            return(CefReturnValue.ContinueAsync);

            #region Process Request

            void ProcessRequest(string path)
            {
                Task.Run(() =>
                {
                    using (callback)
                    {
                        try
                        {
                            var response = new ChromelyResponse();
                            if (string.IsNullOrEmpty(path))
                            {
                                response.ReadyState = (int)ReadyState.ResponseIsReady;
                                response.Status     = (int)System.Net.HttpStatusCode.BadRequest;
                                response.StatusText = "Bad Request";

                                _chromelyResponse = response;
                            }
                            else
                            {
                                var parameters = request.Url.GetParameters();
                                var postData   = request.GetPostData();

                                _chromelyResponse = _requestTaskRunner.Run(path, parameters, postData);
                                string jsonData   = _serializerUtil.EnsureResponseDataIsJson(_chromelyResponse.Data);
                                var content       = Encoding.UTF8.GetBytes(jsonData);
                                _stream           = new MemoryStream();
                                _stream.Write(content, 0, content.Length);
                            }
                        }
                        catch (Exception exception)
                        {
                            _stream = null;
                            Logger.Instance.Log.LogError(exception, exception.Message);

                            _chromelyResponse =
                                new ChromelyResponse
                            {
                                Status = (int)HttpStatusCode.BadRequest,
                                Data   = "An error occured."
                            };
                        }

                        if (_stream == null)
                        {
                            callback.Cancel();
                        }
                        else
                        {
                            SetResponseInfoOnSuccess();
                            callback.Continue();
                        }
                    }
                });
            }

            #endregion

            #region Process Request Async

            void ProcessRequestAsync(string path)
            {
                Task.Run(async() =>
                {
                    using (callback)
                    {
                        try
                        {
                            var response = new ChromelyResponse();
                            if (string.IsNullOrEmpty(path))
                            {
                                response.ReadyState = (int)ReadyState.ResponseIsReady;
                                response.Status     = (int)System.Net.HttpStatusCode.BadRequest;
                                response.StatusText = "Bad Request";

                                _chromelyResponse = response;
                            }
                            else
                            {
                                var parameters = request.Url.GetParameters();
                                var postData   = request.GetPostData();

                                _chromelyResponse = await _requestTaskRunner.RunAsync(path, parameters, postData);
                                string jsonData   = _serializerUtil.EnsureResponseDataIsJson(_chromelyResponse.Data);
                                var content       = Encoding.UTF8.GetBytes(jsonData);
                                _stream           = new MemoryStream();
                                _stream.Write(content, 0, content.Length);
                            }
                        }
                        catch (Exception exception)
                        {
                            _stream = null;
                            Logger.Instance.Log.LogError(exception, exception.Message);

                            _chromelyResponse =
                                new ChromelyResponse
                            {
                                Status = (int)HttpStatusCode.BadRequest,
                                Data   = "An error occured."
                            };
                        }

                        if (_stream == null)
                        {
                            callback.Cancel();
                        }
                        else
                        {
                            SetResponseInfoOnSuccess();
                            callback.Continue();
                        }
                    }
                });
            }

            #endregion
        }