diff --git a/WelsonJS.Toolkit/WelsonJS.Launcher/ResourceServer.cs b/WelsonJS.Toolkit/WelsonJS.Launcher/ResourceServer.cs index 8a56427..ff5c4ca 100644 --- a/WelsonJS.Toolkit/WelsonJS.Launcher/ResourceServer.cs +++ b/WelsonJS.Toolkit/WelsonJS.Launcher/ResourceServer.cs @@ -108,39 +108,57 @@ namespace WelsonJS.Launcher { int statusCode = 200; - List executables = _executablesCollector.GetExecutables(); - - CompletionItem[] completionItems = executables - .Where(exec => exec.IndexOf(word, 0, StringComparison.OrdinalIgnoreCase) > -1) - .Select(exec => new CompletionItem - { - Label = Path.GetFileName(exec), - Kind = "Text", - Documentation = "An executable file", - InsertText = exec - }) - .ToArray(); - - XElement response = new XElement("suggestions", - completionItems.Select(item => new XElement("item", - new XElement("label", item.Label), - new XElement("kind", item.Kind), - new XElement("documentation", item.Documentation), - new XElement("insertText", item.InsertText) - )) - ); - - byte[] data = Encoding.UTF8.GetBytes( - "\r\n" + - response.ToString() - ); - - context.Response.StatusCode = statusCode; - context.Response.ContentType = "application/xml"; - context.Response.ContentLength64 = data.Length; - using (Stream outputStream = context.Response.OutputStream) + try { - outputStream.Write(data, 0, data.Length); + List executables = _executablesCollector.GetExecutables(); + + CompletionItem[] completionItems = executables + .Where(exec => exec.IndexOf(word, 0, StringComparison.OrdinalIgnoreCase) > -1) + .Take(100) // Limit results to prevent excessive response sizes + .Select(exec => new CompletionItem + { + Label = Path.GetFileName(exec), + Kind = "Text", + Documentation = "An executable file", + InsertText = exec + }) + .ToArray(); + + XElement response = new XElement("suggestions", + completionItems.Select(item => new XElement("item", + new XElement("label", item.Label), + new XElement("kind", item.Kind), + new XElement("documentation", item.Documentation), + new XElement("insertText", item.InsertText) + )) + ); + + byte[] data = Encoding.UTF8.GetBytes( + "\r\n" + + response.ToString() + ); + + context.Response.StatusCode = statusCode; + context.Response.ContentType = "application/xml"; + context.Response.ContentLength64 = data.Length; + using (Stream outputStream = context.Response.OutputStream) + { + outputStream.Write(data, 0, data.Length); + } + } + catch (Exception ex) + { + byte[] errorData = Encoding.UTF8.GetBytes( + "\r\n" + + $"Failed to process completion request. {ex.Message}" + ); + context.Response.StatusCode = 500; + context.Response.ContentType = "application/xml"; + context.Response.ContentLength64 = errorData.Length; + using (Stream outputStream = context.Response.OutputStream) + { + outputStream.Write(errorData, 0, errorData.Length); + } } }