/// <summary> /// The run. /// </summary> /// <param name="requestId"> /// The request identifier. /// </param> /// <param name="routePath"> /// The route path. /// </param> /// <param name="parameters"> /// The parameters. /// </param> /// <param name="postData"> /// The post data. /// </param> /// <returns> /// The <see cref="ChromelyResponse"/>. /// </returns> /// <exception cref="Exception"> /// Generic exception - Route path not valid. /// </exception> public static ChromelyResponse Run(string requestId, RoutePath routePath, object parameters, object postData) { var response = new ChromelyResponse(requestId); if (string.IsNullOrEmpty(routePath.Path)) { response.ReadyState = (int)ReadyState.ResponseIsReady; response.Status = (int)System.Net.HttpStatusCode.BadRequest; response.StatusText = "Bad Request"; return(response); } if (routePath.Path.ToLower().Equals("/info")) { response = GetInfo(); return(response); } var route = ServiceRouteProvider.GetRoute(routePath); if (route == null) { throw new Exception($"Route for path = {routePath} is null or invalid."); } return(ExcuteRoute(requestId, routePath, parameters, postData)); }
public ChromelyResponse Run(ChromelyRequest request) { if (request.RoutePath == null) { return(GetBadRequestResponse(request.Id)); } if (string.IsNullOrEmpty(request.RoutePath.Path)) { return(GetBadRequestResponse(request.Id)); } if (request.RoutePath.Path.ToLower().Equals("/info")) { return(GetInfo(request.Id)); } var route = ServiceRouteProvider.GetActionRoute(_container, request.RoutePath); if (route == null) { throw new Exception($"Route for path = {request.RoutePath} is null or invalid."); } var parameters = request.Parameters ?? request.RoutePath.Path.GetParameters()?.ToObjectDictionary(); var postData = request.PostData; return(ExecuteRoute(request.Id, request.RoutePath, parameters, postData, request.RawJson)); }
private async Task <ChromelyResponse> ExecuteRouteAsync(string requestId, RoutePath routePath, IDictionary <string, string> parameters, object postData, string requestData) { var route = ServiceRouteProvider.GetActionRoute(_container, routePath); if (route == null) { throw new Exception($"Route for path = {routePath} is null or invalid."); } ChromelyResponse response; if (route.IsAsync) { response = await route.InvokeAsync(requestId : requestId, routePath : routePath, parameters : parameters, postData : postData, rawJson : requestData); } else { response = route.Invoke(requestId: requestId, routePath: routePath, parameters: parameters, postData: postData, rawJson: requestData); } response.ReadyState = (int)ReadyState.ResponseIsReady; response.Status = (int)System.Net.HttpStatusCode.OK; response.StatusText = "OK"; return(response); }
public ChromelyResponse Run(string method, string path, IDictionary <string, string> parameters, object postData) { var response = new ChromelyResponse(); var routePath = new RoutePath(method, path); if (routePath == null || string.IsNullOrWhiteSpace(routePath?.Path)) { response.ReadyState = (int)ReadyState.ResponseIsReady; response.Status = (int)System.Net.HttpStatusCode.BadRequest; response.StatusText = "Bad Request"; return(response); } if (routePath.Path.ToLower().Equals("/info")) { response = GetInfo(); return(response); } var route = ServiceRouteProvider.GetActionRoute(_container, routePath); if (route == null) { throw new Exception($"Route for path = {routePath.Path} is null or invalid."); } return(ExecuteRoute(string.Empty, routePath, parameters, postData, string.Empty)); }
public void ScannerShouldInstantiateScannerControllerWithInjectedDependencies() { const string TestRoute = "/scannercontroller/get2"; var test = new TestDependency(); IoC.RegisterInstance <ITestDependency>(nameof(ITestDependency), test); var logger = new TestLogger(); IoC.RegisterInstance <IChromelyLogger>(nameof(IChromelyLogger), logger); var scanner = new RouteScanner(Assembly.GetExecutingAssembly()); var routeCommands = scanner.Scan(); foreach (var route in routeCommands.Item1) { ServiceRouteProvider.AddRoute(route.Key, route.Value); } foreach (var command in routeCommands.Item2) { ServiceRouteProvider.AddCommand(command.Key, command.Value); } var request = new ChromelyRequest(new RoutePath(Method.GET, TestRoute), null, null); var routePath = new RoutePath(Method.GET, TestRoute); var get2 = ServiceRouteProvider.GetRoute(routePath); var getResponse = get2.Invoke(request); Assert.Equal(TestDependency.TestDependencyResponse, getResponse.Data.ToString()); Assert.Equal(ScannerControllerWithDependencyInjection.Get2Response, logger.Message); }
/// <summary> /// The run. /// </summary> /// <param name="request"> /// The request. /// </param> /// <returns> /// The <see cref="ChromelyResponse"/>. /// </returns> /// <exception cref="Exception"> /// Generic exception - Route path not valid. /// </exception> public static ChromelyResponse Run(CefRequest request) { var uri = new Uri(request.Url); string path = uri.LocalPath; var response = new ChromelyResponse(); if (string.IsNullOrEmpty(path)) { response.ReadyState = (int)ReadyState.ResponseIsReady; response.Status = (int)System.Net.HttpStatusCode.BadRequest; response.StatusText = "Bad Request"; return(response); } if (path.ToLower().Equals("/info")) { response = GetInfo(); return(response); } var routePath = new RoutePath(request.Method, path); var route = ServiceRouteProvider.GetRoute(routePath); if (route == null) { throw new Exception($"Route for path = {path} is null or invalid."); } var parameters = request.Url.GetParameters(); var postData = GetPostData(request); return(ExcuteRoute(string.Empty, routePath, parameters, postData)); }
public void RegisterRoutes() { // Get all Controllers var controllerObjs = _container.GetAllInstances(typeof(ChromelyController)).ToList(); if (controllerObjs != null && controllerObjs.Any()) { foreach (var obj in controllerObjs) { var controller = obj as ChromelyController; if (controller != null) { ServiceRouteProvider.RegisterActionRoutes(_container, controller.ActionRouteDictionary); ServiceRouteProvider.RegisterCommnandRoutes(_container, controller.CommandRouteDictionary); var actionRouteDictionary = new Dictionary <string, ActionRoute>(); var commandRouteDictionary = new Dictionary <string, CommandRoute>(); var controllerFactory = new ChromelyControllerFactory(_container); // Add Http Attributes var httpAttributeRoutes = controllerFactory.GetHttpAttributeRoutes(controller); if ((httpAttributeRoutes != null) && httpAttributeRoutes.Any()) { foreach (var item in httpAttributeRoutes) { if (!actionRouteDictionary.ContainsKey(item.Key)) { actionRouteDictionary.Add(item.Key, item.Value); } } } // Add Custom Attributes var customAttributeRoutes = controllerFactory.GetCommandAttributeRoutes(controller); if ((customAttributeRoutes != null) && customAttributeRoutes.Any()) { foreach (var item in customAttributeRoutes) { if (!commandRouteDictionary.ContainsKey(item.Key)) { commandRouteDictionary.Add(item.Key, item.Value); } } } ServiceRouteProvider.RegisterActionRoutes(_container, actionRouteDictionary); ServiceRouteProvider.RegisterCommnandRoutes(_container, commandRouteDictionary); } } } }
public override bool OnQuery(CefBrowser browser, CefFrame frame, long queryId, string request, bool persistent, CefMessageRouterBrowserSide.Callback callback) { var options = new JsonSerializerOptions(); options.ReadCommentHandling = JsonCommentHandling.Skip; options.AllowTrailingCommas = true; var requestData = JsonSerializer.Deserialize <request>(request, options); var method = requestData.method ?? string.Empty; if (RoutePath.ValidMethod(method)) { var id = requestData.id ?? string.Empty; var path = requestData.url ?? string.Empty; var routePath = new RoutePath(method, path); bool isRequestAsync = ServiceRouteProvider.IsActionRouteAsync(_container, routePath); if (isRequestAsync) { Task.Run(async() => { var parameters = requestData.parameters; var postData = requestData.postData; var response = await _requestTaskRunner.RunAsync(id, routePath, parameters, postData, request); var jsonResponse = response.ToJson(); callback.Success(jsonResponse); }); } else { Task.Run(() => { var parameters = requestData.parameters; var postData = requestData.postData; var response = _requestTaskRunner.Run(id, routePath, parameters, postData, request); var jsonResponse = response.ToJson(); callback.Success(jsonResponse); }); } return(true); } callback.Failure(100, "Request is not valid."); return(false); }
public void ScanAssemblies() { if ((ServiceAssemblies == null) || (ServiceAssemblies.Count == 0)) { return; } foreach (var assembly in ServiceAssemblies) { RouteScanner scanner = new RouteScanner(assembly); Dictionary <string, Route> currentRouteDictionary = scanner.Scan(); ServiceRouteProvider.MergeRoutes(currentRouteDictionary); } }
/// <summary> /// The scan assemblies. /// </summary> public void ScanAssemblies() { if ((this.ServiceAssemblies == null) || (this.ServiceAssemblies.Count == 0)) { return; } foreach (var assembly in this.ServiceAssemblies) { var scanner = new RouteScanner(assembly); var currentRouteDictionary = scanner.Scan(); ServiceRouteProvider.MergeRoutes(currentRouteDictionary); } }
/// <summary> /// The excute route async. /// </summary> /// <param name="requestId"> /// The request id. /// </param> /// <param name="routePath"> /// The route path. /// </param> /// <param name="parameters"> /// The parameters. /// </param> /// <param name="postData"> /// The post data. /// </param> /// <returns> /// The <see cref="Task"/>. /// </returns> private static async Task <ChromelyResponse> ExcuteRouteAsync(string requestId, RoutePath routePath, object parameters, object postData) { var route = ServiceRouteProvider.GetRoute(routePath); if (route == null) { throw new Exception($"Route for path = {routePath} is null or invalid."); } ChromelyResponse response; try { if (route.IsAsync) { // ReSharper disable once ConsiderUsingConfigureAwait response = await route.InvokeAsync( requestId, routePath, parameters?.ToObjectDictionary(), postData); } else { response = route.Invoke( requestId, routePath, parameters?.ToObjectDictionary(), postData); } response.ReadyState = (int)ReadyState.ResponseIsReady; response.Status = (int)System.Net.HttpStatusCode.OK; response.StatusText = "OK"; } catch (Exception exception) { Log.Error(exception); response = new ChromelyResponse { ReadyState = (int)ReadyState.ResponseIsReady, Status = (int)System.Net.HttpStatusCode.InternalServerError, StatusText = "Error" }; } return(response); }
private ChromelyResponse ExecuteRoute(string requestId, RoutePath routePath, IDictionary <string, string> parameters, object postData, string requestData) { var route = ServiceRouteProvider.GetActionRoute(_container, routePath); if (route == null) { throw new Exception($"Route for path = {routePath} is null or invalid."); } var response = route.Invoke(requestId: requestId, routePath: routePath, parameters: parameters, postData: postData, rawJson: requestData); response.ReadyState = (int)ReadyState.ResponseIsReady; response.Status = (response.Status == 0) ? (int)HttpStatusCode.OK : response.Status; response.StatusText = (string.IsNullOrWhiteSpace(response.StatusText) && (response.Status == (int)HttpStatusCode.OK)) ? "OK" : response.StatusText; return(response); }
/// <summary> /// The excute route. /// </summary> /// <param name="requestId"> /// The request identifier. /// </param> /// <param name="routePath"> /// The route path. /// </param> /// <param name="parameters"> /// The parameters. /// </param> /// <param name="postData"> /// The post data. /// </param> /// <returns> /// The <see cref="ChromelyResponse"/>. /// </returns> /// <exception cref="Exception"> /// Generic exception - Route path not valid. /// </exception> private static ChromelyResponse ExcuteRoute(string requestId, RoutePath routePath, object parameters, object postData) { var route = ServiceRouteProvider.GetRoute(routePath); if (route == null) { throw new Exception($"Route for path = {routePath} is null or invalid."); } var response = route.Invoke(requestId: requestId, routePath: routePath, parameters: parameters?.ToObjectDictionary(), postData: postData); response.ReadyState = (int)ReadyState.ResponseIsReady; response.Status = (int)System.Net.HttpStatusCode.OK; response.StatusText = "OK"; return(response); }
public void RouteProviderTest() { var routeDict = BaseTest(); Assert.Equal(3, routeDict.Count); foreach (var item in routeDict) { ServiceRouteProvider.AddRoute(item.Key, item.Value); } var getRoute1 = ServiceRouteProvider.GetRoute(new RoutePath(Method.GET, "/testcontroller/get1")); var getRoute2 = ServiceRouteProvider.GetRoute(new RoutePath(Method.GET, "/testcontroller/get2")); var postRoute = ServiceRouteProvider.GetRoute(new RoutePath(Method.POST, "/testcontroller/save")); Assert.True((getRoute1 != null) || (getRoute2 != null) || (postRoute != null)); }
public void RouteProviderTest() { var routeDict = BaseTest(); Assert.Equal(3, routeDict.Count); foreach (var item in routeDict) { ServiceRouteProvider.AddRoute(item.Key, item.Value); } foreach (var item in routeDict) { var route = ServiceRouteProvider.GetRoute(item.Key); Assert.NotNull(route); } }
private static ChromelyResponse ExcuteRoute(string routePath, object parameters, object postData) { ChromelyResponse response = new ChromelyResponse(); Route route = ServiceRouteProvider.GetRoute(routePath); if (route == null) { throw new Exception(string.Format("Route for path = {0} is null or invalid.", routePath)); } response = route.Invoke(routePath, parameters: parameters?.ToObjectDictionary(), postData: postData); response.ReadyState = (int)ReadyState.ResponseIsReady; response.Status = (int)System.Net.HttpStatusCode.OK; response.StatusText = "OK"; return(response); }
public void RegisterRoutes() { // Get all Controllers var controllerObjs = _container.GetAllInstances(typeof(ChromelyController)).ToList(); if (controllerObjs != null && controllerObjs.Any()) { foreach (var obj in controllerObjs) { var controller = obj as ChromelyController; if (controller != null) { ServiceRouteProvider.RegisterActionRoutes(_container, controller.ActionRouteDictionary); ServiceRouteProvider.RegisterCommnandRoutes(_container, controller.CommandRouteDictionary); } } } }
public void RouteProviderTest() { var routeDict = BaseTest(); Assert.Equal(3, routeDict.Count); foreach (var item in routeDict) { ServiceRouteProvider.AddRoute(item.Key, item.Value); } foreach (var item in routeDict) { var getRoute = ServiceRouteProvider.GetRoute(new RoutePath(Method.GET, item.Key)); var postRoute = ServiceRouteProvider.GetRoute(new RoutePath(Method.GET, item.Key)); Assert.True((getRoute != null) || (postRoute != null)); } }
/// <summary> /// The scan assemblies. /// </summary> public void ScanAssemblies() { if ((this.HostConfig?.ServiceAssemblies == null) || (this.HostConfig?.ServiceAssemblies.Count == 0)) { return; } foreach (var assembly in this.HostConfig?.ServiceAssemblies) { if (!assembly.IsScanned) { RouteScanner scanner = new RouteScanner(assembly.Assembly); Dictionary <string, Route> currentRouteDictionary = scanner.Scan(); ServiceRouteProvider.MergeRoutes(currentRouteDictionary); assembly.IsScanned = true; } } }
public void Run(string url) { try { var commandPath = GetPathFromUrl(url); var command = ServiceRouteProvider.GetCommandRoute(_container, commandPath); if (command == null) { Logger.Instance.Log.Error($"Command for path = {commandPath} is null or invalid."); return; } var queryParameters = GetQueryParameters(url); command.Invoke(queryParameters); } catch (Exception exception) { Logger.Instance.Log.Error(exception); } }
/// <summary> /// The scan assemblies. /// </summary> public void ScanAssemblies() { if ((HostConfig?.ServiceAssemblies == null) || (HostConfig?.ServiceAssemblies.Count == 0)) { return; } foreach (var assembly in HostConfig?.ServiceAssemblies) { if (!assembly.IsScanned) { var scanner = new RouteScanner(assembly.Assembly); var currentRouteDictionary = scanner.Scan().Item1; var currentCommandDictionary = scanner.Scan().Item2; ServiceRouteProvider.MergeRoutes(currentRouteDictionary); ServiceRouteProvider.MergeCommands(currentCommandDictionary); assembly.IsScanned = true; } } }
public ChromelyResponse Run(string requestId, RoutePath routePath, IDictionary <string, string> parameters, object postData, string requestData) { if (string.IsNullOrEmpty(routePath.Path)) { return(GetBadRequestResponse(requestId)); } if (routePath.Path.ToLower().Equals("/info")) { return(GetInfo(requestId)); } var route = ServiceRouteProvider.GetActionRoute(_container, routePath); if (route == null) { throw new Exception($"Route for path = {routePath} is null or invalid."); } return(ExecuteRoute(requestId, routePath, parameters, postData, requestData)); }
public ChromelyResponse Run(ChromelyRequest request) { var response = new ChromelyResponse(request.Id); if (request.RoutePath == null) { response.ReadyState = (int)ReadyState.ResponseIsReady; response.Status = (int)System.Net.HttpStatusCode.BadRequest; response.StatusText = "Bad Request"; return(response); } if (string.IsNullOrEmpty(request.RoutePath.Path)) { response.ReadyState = (int)ReadyState.ResponseIsReady; response.Status = (int)System.Net.HttpStatusCode.BadRequest; response.StatusText = "Bad Request"; return(response); } if (request.RoutePath.Path.ToLower().Equals("/info")) { response = GetInfo(); return(response); } var route = ServiceRouteProvider.GetActionRoute(_container, request.RoutePath); if (route == null) { throw new Exception($"Route for path = {request.RoutePath} is null or invalid."); } var parameters = request.Parameters ?? request.RoutePath.Path.GetParameters()?.ToObjectDictionary(); var postData = request.PostData; return(ExecuteRoute(request.Id, request.RoutePath, parameters, postData, request.RawJson)); }
public void ScanAssemblies() { if ((_config?.ControllerAssemblies == null) || (_config?.ControllerAssemblies.Count == 0)) { return; } foreach (var assembly in _config?.ControllerAssemblies) { if (!assembly.IsScanned) { var scanner = new RouteScanner(assembly.Assembly, _container); var scanResult = scanner.Scan(); var actionRoutes = scanResult?.Item1; var commandRoutes = scanResult?.Item2; ServiceRouteProvider.RegisterActionRoutes(_container, actionRoutes); ServiceRouteProvider.RegisterCommnandRoutes(_container, commandRoutes); assembly.IsScanned = true; } } }
public async Task <ChromelyResponse> RunAsync(string method, string path, IDictionary <string, string> parameters, object postData) { var routePath = new RoutePath(method, path); if (routePath == null || string.IsNullOrWhiteSpace(routePath?.Path)) { return(GetBadRequestResponse(null)); } if (routePath.Path.ToLower().Equals("/info")) { return(GetInfo(string.Empty)); } var route = ServiceRouteProvider.GetActionRoute(_container, routePath); if (route == null) { throw new Exception($"Route for path = {routePath.Path} is null or invalid."); } return(await ExecuteRouteAsync(string.Empty, routePath, parameters, postData, string.Empty)); }
/// <summary> /// The run command async. /// </summary> /// <param name="url"> /// The url. /// </param> /// <returns> /// The <see cref="Task"/>. /// </returns> public static void RunAsync(string url) { Task.Run(() => { try { var commandPath = GetPathFromUrl(url); var command = ServiceRouteProvider.GetCommand(commandPath); if (command == null) { Log.Error($"Command for path = {commandPath} is null or invalid."); return; } var queryParameters = GetQueryParameters(url); command.Invoke(queryParameters); } catch (Exception exception) { Log.Error(exception); } }); }
protected override bool ProcessRequest(CefRequest request, CefCallback callback) { var isCustomScheme = _config?.UrlSchemes?.IsUrlRegisteredCustomScheme(request.Url); if (isCustomScheme.HasValue && isCustomScheme.Value) { var uri = new Uri(request.Url); var path = uri.LocalPath; bool isRequestAsync = ServiceRouteProvider.IsActionRouteAsync(_container, new RoutePath(request.Method, path)); if (isRequestAsync) { ProcessRequestAsync(path); } else { ProcessRequest(path); } return(true); } Logger.Instance.Log.Error($"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)System.Net.HttpStatusCode.BadRequest; response.StatusText = "Bad Request"; _chromelyResponse = response; } else { var parameters = request.Url.GetParameters(); var postData = GetPostData(request); _chromelyResponse = _requestTaskRunner.Run(request.Method, path, parameters, postData); string jsonData = _chromelyResponse.Data.EnsureResponseDataIsJsonFormat(); _responseBytes = Encoding.UTF8.GetBytes(jsonData); } } catch (Exception exception) { Logger.Instance.Log.Error(exception); _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); _chromelyResponse = await _requestTaskRunner.RunAsync(request.Method, path, parameters, postData); string jsonData = _chromelyResponse.Data.EnsureResponseDataIsJsonFormat(); _responseBytes = Encoding.UTF8.GetBytes(jsonData); } } catch (Exception exception) { Logger.Instance.Log.Error(exception); _chromelyResponse = new ChromelyResponse { Status = (int)HttpStatusCode.BadRequest, Data = "An error occured." }; } finally { callback.Continue(); } } }); } #endregion }