diff --git a/SpotifyAPI/Web/Auth/AuthenticationFactory.cs b/SpotifyAPI/Web/Auth/AuthenticationFactory.cs index 2653ef11..a8a52a2c 100644 --- a/SpotifyAPI/Web/Auth/AuthenticationFactory.cs +++ b/SpotifyAPI/Web/Auth/AuthenticationFactory.cs @@ -44,15 +44,20 @@ namespace SpotifyAPI.Web.Auth authenticationWaitFlag.Set(); }; - authentication.StartHttpServer(m_ListeningPort); + try + { + authentication.StartHttpServer(m_ListeningPort); - authentication.DoAuth(); + authentication.DoAuth(); - authenticationWaitFlag.WaitOne(m_Timeout); - if (spotifyWebApi == null) - throw new TimeoutException($"No valid response received for the last {m_Timeout.TotalSeconds} seconds"); - - authentication.StopHttpServer(); + authenticationWaitFlag.WaitOne(m_Timeout); + if (spotifyWebApi == null) + throw new TimeoutException($"No valid response received for the last {m_Timeout.TotalSeconds} seconds"); + } + finally + { + authentication.StopHttpServer(); + } return Task.FromResult(spotifyWebApi); } diff --git a/SpotifyAPI/Web/SimpleHttpServer.cs b/SpotifyAPI/Web/SimpleHttpServer.cs index 369d7629..26de79b2 100644 --- a/SpotifyAPI/Web/SimpleHttpServer.cs +++ b/SpotifyAPI/Web/SimpleHttpServer.cs @@ -87,7 +87,6 @@ namespace SpotifyAPI.Web OutputStream.Flush(); _inputStream = null; OutputStream = null; - socket.Close(); } public void ParseRequest() @@ -219,26 +218,8 @@ namespace SpotifyAPI.Web _listener = new TcpListener(IPAddress.Any, Port); _listener.Start(); - using (HttpProcessor processor = new HttpProcessor(this)) - { - while (IsActive) - { - _listener.BeginAcceptTcpClient(ar => - { - try - { - TcpListener listener = (TcpListener)ar.AsyncState; - var tcpCLient = listener.EndAcceptTcpClient(ar); - processor.Process(tcpCLient); + _listener.BeginAcceptTcpClient(AcceptTcpConnection, _listener); - } - catch (ObjectDisposedException) - { - // Ignore - } - }, _listener); - } - } } catch (SocketException e) { @@ -247,6 +228,28 @@ namespace SpotifyAPI.Web } } + private void AcceptTcpConnection(IAsyncResult ar) + { + TcpListener listener = (TcpListener)ar.AsyncState; + try + { + var tcpCLient = listener.EndAcceptTcpClient(ar); + using (HttpProcessor processor = new HttpProcessor(this)) + { + processor.Process(tcpCLient); + } + } + catch (ObjectDisposedException) + { + // Ignore + } + + if (!IsActive) + return; + //listener.Start(); + listener.BeginAcceptTcpClient(AcceptTcpConnection, listener); + } + public abstract void HandleGetRequest(HttpProcessor p); public abstract void HandlePostRequest(HttpProcessor p, StreamReader inputData);