/// <summary> /// Listens for any requests and responds with the game host's config values /// </summary> /// <param name="config">The config values we're returning</param> private static void ProcessRequests() { while (_listener.IsListening) { try { HttpListenerContext context = _listener.GetContext(); HttpListenerRequest request = context.Request; HttpListenerResponse response = context.Response; LogMessage(string.Format("HTTP:Received {0}", request.Headers.ToString())); IDictionary <string, string> config = null; // For each request, "add" a connected player, but limit player count to 20. const int maxPlayers = 20; if (players.Count < maxPlayers) { players.Add(new ConnectedPlayer("gamer" + requestCount)); } else { LogMessage($"Player not added since max of {maxPlayers} is reached. Current request count: {requestCount}."); } requestCount++; GameserverSDK.UpdateConnectedPlayers(players); config = GameserverSDK.getConfigSettings() ?? new Dictionary <string, string>(); // First, check if we need to delay shutdown for testing if (config.TryGetValue(GameserverSDK.SessionCookieKey, out string sessionCookie) && sessionCookie.Equals("delayshutdown", StringComparison.OrdinalIgnoreCase)) { _delayShutdown = true; } // If the server has been allocated, add the list of players to the response. if (_isActivated) { config.Add("initialPlayers", string.Join(",", GameserverSDK.GetInitialPlayers())); } config.Add("isActivated", _isActivated.ToString()); config.Add("isShutdown", _isShutdown.ToString()); config.Add("assetFileText", _assetFileText); config.Add("logsDirectory", GameserverSDK.GetLogsDirectory()); config.Add("sharedContentDirectory", GameserverSDK.GetSharedContentDirectory()); config.Add("installedCertThumbprint", _installedCertThumbprint); config.Add("cmdArgs", _cmdArgs); if (_nextMaintenance != DateTimeOffset.MinValue) { config.Add("nextMaintenance", _nextMaintenance.ToLocalTime().ToString()); } foreach (GamePort portInformation in GameserverSDK.GetGameServerConnectionInfo().GamePortsConfiguration) { config.Add($"Public{portInformation.Name}", portInformation.ClientConnectionPort.ToString()); } string content = JsonConvert.SerializeObject(config, Formatting.Indented); response.AddHeader("Content-Type", "application/json"); byte[] buffer = System.Text.Encoding.UTF8.GetBytes(content); response.ContentLength64 = buffer.Length; using (System.IO.Stream output = response.OutputStream) { output.Write(buffer, 0, buffer.Length); } // Once we're shut down, return a response one more time (so the tests can // verify the _isShutdown field) and then actually terminate if (_isShutdown) { _listener.Stop(); _listener.Close(); } } catch (HttpListenerException httpEx) { // This one is expected if we stopped the listener because we were asked to shutdown LogMessage($"Got HttpListenerException: {httpEx.ToString()}, shutdown value is: {_isShutdown} "); } catch (Exception ex) { LogMessage($"Got Exception: {ex.ToString()}"); } } }