From 31149117c7ceee175f265a02b113ed4b52256732 Mon Sep 17 00:00:00 2001 From: David Driscoll Date: Sat, 9 Jan 2016 15:08:44 -0500 Subject: [PATCH] Updated StdioServer.cs to create a feature collection per request, to avoid the issue of reused requests from Kestrel --- src/OmniSharp.Host/Program.cs | 7 ++++--- src/OmniSharp.Stdio/StdioServer.cs | 31 ++++++++++++++++-------------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/OmniSharp.Host/Program.cs b/src/OmniSharp.Host/Program.cs index 37e3c31551..d60fa0a179 100644 --- a/src/OmniSharp.Host/Program.cs +++ b/src/OmniSharp.Host/Program.cs @@ -88,16 +88,17 @@ public static void Main(string[] args) if (transportType == TransportType.Stdio) { - builder.UseServerFactory(new StdioServerFactory(Console.In, writer)); + builder.UseServer(new StdioServerFactory(Console.In, writer)); } else { - builder.UseServerFactory("Microsoft.AspNet.Server.Kestrel"); + builder.UseServer("Microsoft.AspNet.Server.Kestrel"); } var app = builder.Build(); - using (app.Start()) + using (app) { + app.Start(); var appLifeTime = app.Services.GetRequiredService(); Console.CancelKeyPress += (sender, e) => diff --git a/src/OmniSharp.Stdio/StdioServer.cs b/src/OmniSharp.Stdio/StdioServer.cs index 8244a34c25..b5f1650f9e 100644 --- a/src/OmniSharp.Stdio/StdioServer.cs +++ b/src/OmniSharp.Stdio/StdioServer.cs @@ -20,10 +20,9 @@ class StdioServer : IServer private readonly TextReader _input; private readonly ISharedTextWriter _writer; private readonly CancellationTokenSource _cancellation; - private readonly RequestFeature _requestFeature; - private readonly ResponseFeature _responseFeature; private readonly IHttpContextFactory _httpContextFactory; private readonly IHttpContextAccessor _httpContextAccessor; + private readonly object _lock = new object(); public StdioServer(TextReader input, ISharedTextWriter writer) { @@ -35,11 +34,11 @@ public StdioServer(TextReader input, ISharedTextWriter writer) _httpContextFactory = new HttpContextFactory(_httpContextAccessor); var features = new FeatureCollection(); - _requestFeature = new RequestFeature(); - _responseFeature = new ResponseFeature(); + var requestFeature = new RequestFeature(); + var responseFeature = new ResponseFeature(); - features.Set(_requestFeature); - features.Set(_responseFeature); + features.Set(requestFeature); + features.Set(responseFeature); Features = features; } @@ -96,20 +95,24 @@ private async Task HandleRequest(string json, IHttpApplication(requestFeature); + features.Set(responseFeature); + + var context = application.CreateContext(features); // hand off request to next layer await application.ProcessRequestAsync(context); - if (_responseFeature.StatusCode != 200) + if (responseFeature.StatusCode != 200) { response.Success = false; }