コード例 #1
0
        /// <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));
        }
コード例 #2
0
        public string PostJson(string routePath, object parameters, object postData)
        {
            ChromelyResponse chromelyResponse = CefSharpRequestTaskRunner.Run(routePath, parameters, postData);
            string           jsonResponse     = chromelyResponse.EnsureJson();

            return(jsonResponse);
        }
コード例 #3
0
        private ChromelyResponse GetDirectories(ChromelyRequest request)
        {
            try {
                IDictionary <string, object> requestParams = request.Parameters;
                string path         = (string)requestParams["path"];
                bool   includeFiles = (bool)requestParams["includeFiles"];

                FileSystemService  fileSystemService = FileSystemService.getInstance();
                List <FsDirectory> directories       = fileSystemService.GetDirectories(path);
                List <FsFile>      files             = new List <FsFile>();

                if (includeFiles)
                {
                    files = fileSystemService.GetFiles(path);
                }

                FsView fsView = new FsView();
                fsView.directories = directories;
                fsView.files       = files;

                string fsJson = JsonConvert.SerializeObject(fsView);

                ChromelyResponse response = new ChromelyResponse();
                response.Data = fsJson;
                return(response);
            } catch (Exception e) {
                Log.Error(e);
                return(null);
            }
        }
コード例 #4
0
    private IChromelyResponse CreateResponse(object?content)
    {
        IChromelyResponse?chromelyResponse = content as IChromelyResponse;

        if (chromelyResponse is null && HasReturnValue)
        {
            var task = content as Task;
            if (task is not null)
            {
                switch (task.Status)
                {
                case TaskStatus.RanToCompletion:
                {
                    var resultProperty = task.GetType().GetProperty("Result");
                    chromelyResponse = resultProperty?.GetValue(task) as IChromelyResponse;
                    if (chromelyResponse is null)
                    {
                        chromelyResponse = new ChromelyResponse
                        {
                            Data = resultProperty?.GetValue(task)
                        };
                    }

                    chromelyResponse.Status     = (int)HttpStatusCode.OK;
                    chromelyResponse.StatusText = ResourceConstants.StatusOKText;
                    break;
                }

                default:
                {
                    chromelyResponse = new ChromelyResponse
                    {
                        Status = (int)HttpStatusCode.BadRequest
                    };
                    var builder    = new StringBuilder();
                    var statusText = task.Status.ToString();
                    builder.AppendLine($"{statusText}");
                    if (task.Exception is not null)
                    {
                        builder.AppendLine($"  - {task.Exception.Message}");
                        Logger.Instance.Log.LogError(task.Exception);
                    }
                    chromelyResponse.Data       = builder.ToString();
                    chromelyResponse.StatusText = statusText;
                    break;
                }
                }
            }
        }

        if (chromelyResponse is null)
        {
            chromelyResponse = new ChromelyResponse
            {
                Data = HasReturnValue ? content : null
            };
        }

        return(chromelyResponse);
    }
コード例 #5
0
            /// <summary>
            /// The get 2.
            /// </summary>
            /// <param name="request">
            /// The request.
            /// </param>
            /// <returns>
            /// The <see cref="ChromelyResponse"/>.
            /// </returns>
            private ChromelyResponse Get2(ChromelyRequest request)
            {
                ChromelyResponse response = new ChromelyResponse();

                response.Data = "Test Get 2";
                return(response);
            }
コード例 #6
0
            /// <summary>
            /// The save.
            /// </summary>
            /// <param name="request">
            /// The request.
            /// </param>
            /// <returns>
            /// The <see cref="ChromelyResponse"/>.
            /// </returns>
            private ChromelyResponse Save(ChromelyRequest request)
            {
                ChromelyResponse response = new ChromelyResponse();

                response.Data = request.PostData;
                return(response);
            }
コード例 #7
0
        /// <summary>
        /// The execute.
        /// </summary>
        /// <param name="request">
        /// The request.
        /// </param>
        /// <returns>
        /// The <see cref="ChromelyResponse"/>.
        /// </returns>
        private ChromelyResponse Execute(ChromelyRequest request)
        {
            var response = new ChromelyResponse(request.Id)
            {
                ReadyState = (int)ReadyState.ResponseIsReady,
                Status     = (int)System.Net.HttpStatusCode.OK,
                StatusText = "OK",
                Data       = DateTime.Now.ToLongDateString()
            };

            try
            {
                var scriptInfo = new ScriptInfo(request.PostData);
                var frame      = FrameHandler.GetFrame(scriptInfo.FrameName);
                if (frame == null)
                {
                    response.Data = $"Frame {scriptInfo.FrameName} does not exist.";
                    return(response);
                }

                frame.ExecuteJavaScript(scriptInfo.Script, null, 0);
                response.Data = "Executed script :" + scriptInfo.Script;
                return(response);
            }
            catch (Exception e)
            {
                response.Data       = e.Message;
                response.ReadyState = (int)ReadyState.RequestReceived;
                response.Status     = (int)System.Net.HttpStatusCode.BadRequest;
                response.StatusText = "Error";
            }

            return(response);
        }
コード例 #8
0
            /// <summary>
            /// The get 1.
            /// </summary>
            /// <param name="request">
            /// The request.
            /// </param>
            /// <returns>
            /// The <see cref="ChromelyResponse"/>.
            /// </returns>
            private ChromelyResponse Get1(ChromelyRequest request)
            {
                ChromelyResponse response = new ChromelyResponse();

                response.Data = 1000;
                return(response);
            }
コード例 #9
0
        private ChromelyResponse ExportAllConversations(ChromelyRequest request)
        {
            IDictionary <string, object> parameters = request.Parameters;
            string  postDataJson = (string)request.PostData.EnsureJson();
            JObject data         = JObject.Parse(postDataJson);

            ConversationService conversationService = ConversationService.getInstance();

            List <ConversationAsset> conversations = conversationService.LoadConversations();

            foreach (ConversationAsset conversationAsset in conversations)
            {
                conversationService.SaveConversation(conversationAsset, FileFormat.JSON);
            }

            try {
                string conversationAssetString = data["conversationAsset"].ToString();

                if (conversationAssetString != "")
                {
                    ConversationAsset conversationAsset = JsonConvert.DeserializeObject <ConversationAsset>(conversationAssetString);
                    conversationService.SaveConversation(conversationAsset, FileFormat.JSON);
                }
            } catch (Exception e) {
                Log.Error(e);
            }

            List <ConversationAsset> updatedConversations = conversationService.LoadConversations();
            string           conversationsJson            = JsonConvert.SerializeObject(updatedConversations);
            ChromelyResponse response = new ChromelyResponse();

            response.Data = conversationsJson;
            return(response);
        }
コード例 #10
0
        public IChromelyResponse GetInfo(string requestId)
        {
            var response      = new ChromelyResponse(requestId);
            var bitness       = Environment.Is64BitProcess ? "x64" : "x86";
            var chromeVersion = $"Chromium: {Cef.ChromiumVersion}, CEF: {Cef.CefVersion}, CefSharp: {Cef.CefSharpVersion}, Environment: {bitness}";

            var infoItemDic = new Dictionary <string, string>
            {
                {
                    "divObjective",
                    "To build HTML5 desktop apps using embedded Chromium without WinForm or WPF. Uses Windows, Linux and MacOS native GUI API. It can be extended to use WinForm or WPF. Main form of communication with Chromium rendering process is via CEF Message Router, Ajax HTTP/XHR requests using custom schemes and domains."
                },
                {
                    "divPlatform",
                    "Cross-platform - Windows, Linux, MacOS. Built on CefGlue, CefSharp, NET Standard 2.0, .NET Core 3.0, .NET Framework 4.61 and above."
                },
                { "divVersion", chromeVersion }
            };

            response.ReadyState = (int)ReadyState.ResponseIsReady;
            response.Status     = (int)System.Net.HttpStatusCode.OK;
            response.StatusText = "OK";
            response.Data       = infoItemDic;

            return(response);
        }
コード例 #11
0
        /// <summary>
        /// The get json.
        /// </summary>
        /// <param name="routePath">
        /// The route path.
        /// </param>
        /// <param name="parameters">
        /// The parameters.
        /// </param>
        /// <returns>
        /// The <see cref="string"/>.
        /// </returns>
        public string GetJson(string routePath, object parameters)
        {
            ChromelyResponse chromelyResponse = RequestTaskRunner.Run(routePath, parameters, null);
            string           jsonResponse     = chromelyResponse.EnsureJson();

            return(jsonResponse);
        }
コード例 #12
0
        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));
        }
コード例 #13
0
        public override bool OnQuery(CefBrowser browser, CefFrame frame, long queryId, string request, bool persistent, CefMessageRouterBrowserSide.Callback callback)
        {
            JsonData requestData = JsonMapper.ToObject(request);
            string   method      = requestData["method"].ToString();

            method = string.IsNullOrWhiteSpace(method) ? string.Empty : method;

            if (method.Equals("Get", StringComparison.InvariantCultureIgnoreCase) ||
                method.Equals("Post", StringComparison.InvariantCultureIgnoreCase))
            {
                new Task(() =>
                {
                    string routePath  = requestData["url"].ToString();
                    object parameters = requestData["parameters"];
                    object postData   = requestData["postData"];

                    ChromelyResponse response = RequestTaskRunner.Run(routePath, parameters, postData);
                    string jsonResponse       = response.EnsureJson();

                    callback.Success(jsonResponse);
                }).Start();

                return(true);
            }

            callback.Failure(100, "Request is not valid.");
            return(false);
        }
コード例 #14
0
        /// <summary>
        /// The broadcast.
        /// </summary>
        /// <param name="connectionId">
        /// The connection id.
        /// </param>
        /// <param name="response">
        /// The response.
        /// </param>
        public static void Broadcast(int connectionId, ChromelyResponse response)
        {
            Task.Factory.StartNew(() =>
            {
                try
                {
                    if (connectionId == 0)
                    {
                        return;
                    }

                    if (response == null)
                    {
                        return;
                    }

                    if (Server == null)
                    {
                        return;
                    }

                    string jsonResponse = JsonMapper.ToJson(response);
                    BroadcastMessage(connectionId, jsonResponse);
                }
                catch (Exception exception)
                {
                    Log.Error(exception);
                }
            });
        }
コード例 #15
0
        /// <summary>
        /// The send.
        /// </summary>
        /// <param name="connectionId">
        /// The connection id.
        /// </param>
        /// <param name="response">
        /// The response.
        /// </param>
        public static void Send(int connectionId, ChromelyResponse response)
        {
            lock (ObjLock2)
            {
                try
                {
                    if (connectionId == 0)
                    {
                        return;
                    }

                    if (response == null)
                    {
                        return;
                    }

                    if (Server == null)
                    {
                        return;
                    }

                    var jsonResponse = JsonMapper.ToJson(response);
                    SendMessage(connectionId, jsonResponse);
                }
                catch (Exception exception)
                {
                    Log.Error(exception);
                }
            }
        }
コード例 #16
0
        /// <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));
        }
コード例 #17
0
        /// <summary>
        /// The save movies.
        /// </summary>
        /// <param name="request">
        /// The request.
        /// </param>
        /// <returns>
        /// The <see cref="ChromelyResponse"/>.
        /// </returns>
        /// <exception cref="ArgumentNullException">
        /// ArgumentNullException - request is null exception.
        /// </exception>
        /// <exception cref="Exception">
        /// Exception - post data is null exception.
        /// </exception>
        private ChromelyResponse SaveMovies(ChromelyRequest request)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            if (request.PostData == null)
            {
                throw new Exception("Post data is null or invalid.");
            }

            var response     = new ChromelyResponse(request.Id);
            var postDataJson = request.PostData.ToJson();

            var options = new JsonSerializerOptions();

            options.ReadCommentHandling = JsonCommentHandling.Skip;
            options.AllowTrailingCommas = true;
            var movies       = JsonSerializer.Deserialize <List <MovieInfo> >(postDataJson, options);
            var rowsReceived = movies != null ? movies.Count : 0;

            response.Data = $"{DateTime.Now}: {rowsReceived} rows of data successfully saved.";

            return(response);
        }
コード例 #18
0
        /// <summary>
        /// The send.
        /// </summary>
        /// <param name="clientName">
        /// The client name.
        /// </param>
        /// <param name="response">
        /// The response.
        /// </param>
        public static void Send(string clientName, ChromelyResponse response)
        {
            lock (ObjLock1)
            {
                try
                {
                    if (string.IsNullOrEmpty(clientName))
                    {
                        return;
                    }

                    if (response == null)
                    {
                        return;
                    }

                    if (Server == null)
                    {
                        return;
                    }

                    string jsonResponse = JsonMapper.ToJson(response);
                    SendMessage(clientName, jsonResponse);
                }
                catch (Exception exception)
                {
                    Log.Error(exception);
                }
            }
        }
コード例 #19
0
        /// <summary>
        /// The broadcast.
        /// </summary>
        /// <param name="connectionId">
        /// The connection id.
        /// </param>
        /// <param name="response">
        /// The response.
        /// </param>
        public static void Broadcast(int connectionId, ChromelyResponse response)
        {
            lock (ObjLock6)
            {
                try
                {
                    if (connectionId == 0)
                    {
                        return;
                    }

                    if (response == null)
                    {
                        return;
                    }

                    if (Server == null)
                    {
                        return;
                    }

                    string jsonResponse = JsonMapper.ToJson(response);
                    BroadcastMessage(connectionId, jsonResponse);
                }
                catch (Exception exception)
                {
                    Log.Error(exception);
                }
            }
        }
コード例 #20
0
        /// <summary>
        /// The execute.
        /// </summary>
        /// <param name="request">
        /// The request.
        /// </param>
        /// <returns>
        /// The <see cref="ChromelyResponse"/>.
        /// </returns>
        private ChromelyResponse Execute(ChromelyRequest request)
        {
            var response = new ChromelyResponse(request.Id)
            {
                ReadyState = (int)ReadyState.ResponseIsReady,
                Status     = (int)System.Net.HttpStatusCode.OK,
                StatusText = "OK",
                Data       = DateTime.Now.ToLongDateString()
            };

            try
            {
                var scriptInfo     = new ScriptInfo(request.PostData);
                var scriptExecutor = _config?.JavaScriptExecutor;
                if (scriptExecutor == null)
                {
                    response.Data = $"Frame {scriptInfo.FrameName} does not exist.";
                    return(response);
                }

                scriptExecutor.ExecuteScript(scriptInfo.Script);
                response.Data = "Executed script :" + scriptInfo.Script;
                return(response);
            }
            catch (Exception e)
            {
                Logger.Instance.Log.Error(e);
                response.Data       = e.Message;
                response.ReadyState = (int)ReadyState.RequestReceived;
                response.Status     = (int)System.Net.HttpStatusCode.BadRequest;
                response.StatusText = "Error";
            }

            return(response);
        }
コード例 #21
0
        /// <summary>
        /// The get info.
        /// </summary>
        /// <returns>
        /// The <see cref="ChromelyResponse"/>.
        /// </returns>
        private static ChromelyResponse GetInfo()
        {
            var response      = new ChromelyResponse();
            var chromeVersion = CefRuntime.ChromeVersion;

            var infoItemDic = new Dictionary <string, string>
            {
                {
                    "divObjective",
                    "To build HTML5 desktop apps using embedded Chromium without WinForm or WPF. Uses Windows and Linux native GUI API. It can be extended to use WinForm or WPF. Main form of communication with Chromium rendering process is via Ajax HTTP/XHR requests using custom schemes and domains (CefGlue, CefSharp) and .NET/Javascript integration (CefSharp)."
                },
                {
                    "divPlatform",
                    "Cross-platform - Windows, Linux. Built on CefGlue, CefSharp, NET Standard 2.0, .NET Core 2.0, .NET Framework 4.61 and above."
                },
                { "divVersion", chromeVersion }
            };

            response.ReadyState = (int)ReadyState.ResponseIsReady;
            response.Status     = (int)System.Net.HttpStatusCode.OK;
            response.StatusText = "OK";
            response.Data       = infoItemDic;

            return(response);
        }
コード例 #22
0
        protected override bool ProcessRequest(CefRequest request, CefCallback callback)
        {
            var isCustomScheme = _config?.UrlSchemes?.IsUrlRegisteredCustomScheme(request.Url);

            if (isCustomScheme.HasValue && isCustomScheme.Value)
            {
                Task.Run(() =>
                {
                    using (callback)
                    {
                        try
                        {
                            var uri  = new Uri(request.Url);
                            var 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";

                                _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();
                        }
                    }
                });

                return(true);
            }

            Logger.Instance.Log.Error($"Url {request.Url} is not of a registered custom scheme.");
            callback.Dispose();
            return(false);
        }
コード例 #23
0
            /// <summary>
            /// The save.
            /// </summary>
            /// <param name="request">
            /// The request.
            /// </param>
            /// <returns>
            /// The <see cref="ChromelyResponse"/>.
            /// </returns>
            private ChromelyResponse Save(ChromelyRequest request)
            {
                var response = new ChromelyResponse {
                    Data = request.PostData
                };

                return(response);
            }
コード例 #24
0
            /// <summary>
            /// The get 1.
            /// </summary>
            /// <param name="request">
            /// The request.
            /// </param>
            /// <returns>
            /// The <see cref="ChromelyResponse"/>.
            /// </returns>
            private ChromelyResponse Get1(ChromelyRequest request)
            {
                var response = new ChromelyResponse {
                    Data = 1000
                };

                return(response);
            }
コード例 #25
0
            /// <summary>
            /// The get 2.
            /// </summary>
            /// <param name="request">
            /// The request.
            /// </param>
            /// <returns>
            /// The <see cref="ChromelyResponse"/>.
            /// </returns>
            private ChromelyResponse Get2(ChromelyRequest request)
            {
                var response = new ChromelyResponse {
                    Data = "Test Get 2"
                };

                return(response);
            }
コード例 #26
0
 public void GetJson(string routePath, object parameters, IJavascriptCallback javascriptCallback) {
     Task.Run(async () => {
         using (javascriptCallback) {
             ChromelyResponse chromelyResponse = await RequestTaskRunner.RunAsync(routePath, parameters, null);
             string jsonResponse = chromelyResponse.EnsureJson();
             var response = new CallbackResponseStruct(jsonResponse);
             await javascriptCallback.ExecuteAsync(response);
         }
     });
 }
コード例 #27
0
        /// <summary>
        /// The check status.
        /// </summary>
        /// <param name="request">
        /// The request.
        /// </param>
        /// <returns>
        /// The <see cref="ChromelyResponse"/>.
        /// </returns>
        private ChromelyResponse CheckStatus(ChromelyRequest request)
        {
            ChromelyResponse response = new ChromelyResponse(request.Id);

            response.ReadyState = (int)ReadyState.ResponseIsReady;
            response.Status     = (int)System.Net.HttpStatusCode.OK;
            response.StatusText = "OK";
            response.Data       = WebsocketServerRunner.IsServerRunning;
            return(response);
        }
コード例 #28
0
 public void PostJson(string routePath, object parameters, object postData, IJavascriptCallback javascriptCallback) {
     Task.Run(async () => {
         using (javascriptCallback) {
             Log.Info("Handler Data is " + postData);
             ChromelyResponse chromelyResponse = await RequestTaskRunner.RunAsync(routePath, parameters, postData);
             string jsonResponse = chromelyResponse.EnsureJson();
             var response = new CallbackResponseStruct(jsonResponse);
             await javascriptCallback.ExecuteAsync(response);
         }
     });
 }
コード例 #29
0
        /// <summary>
        /// The stop server.
        /// </summary>
        /// <param name="request">
        /// The request.
        /// </param>
        /// <returns>
        /// The <see cref="ChromelyResponse"/>.
        /// </returns>
        private ChromelyResponse StopServer(ChromelyRequest request)
        {
            WebsocketServerRunner.StopServer();
            ChromelyResponse response = new ChromelyResponse(request.Id);

            response.ReadyState = (int)ReadyState.ResponseIsReady;
            response.Status     = (int)System.Net.HttpStatusCode.OK;
            response.StatusText = "OK";
            response.Data       = true;
            return(response);
        }
コード例 #30
0
ファイル: Helpers.cs プロジェクト: moayyaed/Chromely
        public static IChromelyResponse ErrorResponse(this Exception exception, string requestId)
        {
            var response = new ChromelyResponse(requestId);

            response.ReadyState = (int)ReadyState.ResponseIsReady;
            response.Status     = (int)System.Net.HttpStatusCode.BadRequest;
            response.StatusText = "Bad Request";
            response.Data       = exception?.FlattenException();

            return(response);
        }