diff --git a/Directory.Build.props b/Directory.Build.props index 2443969d..63bd7e7e 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,6 @@ - 1.9.20.451-gwyn + 1.9.20.453-gwyn LibreMetaverse Sjofn LLC, OpenMetaverse Developers Copyright © OpenMetaverse Developers 2008, 2017. Copyright © Sjofn LLC 2018-2022. All rights reserved. @@ -8,7 +8,7 @@ Sjofn LLC - 1.9.20.451-gwyn + 1.9.20.453-gwyn logo.png README.md BSD-3-Clause diff --git a/LibreMetaverse/Capabilities/EventQueueClient.cs b/LibreMetaverse/Capabilities/EventQueueClient.cs index ed613d41..587c594c 100644 --- a/LibreMetaverse/Capabilities/EventQueueClient.cs +++ b/LibreMetaverse/Capabilities/EventQueueClient.cs @@ -24,7 +24,8 @@ * POSSIBILITY OF SUCH DAMAGE. */ -using System; +using System; +using System.Collections; using System.Net; using System.Threading; using OpenMetaverse.StructuredData; @@ -155,7 +156,37 @@ namespace OpenMetaverse.Http break; case (HttpStatusCode)499: // weird error returned occasionally, ignore for now // I believe this is the timeout error invented by LL for LSL HTTP-out requests (gwyneth 20220413) - Logger.Log("Possible HTTP-out timeout error, no need to continue)", Helpers.LogLevel.Info); + Logger.Log($"Possible HTTP-out timeout error from {_Address}, no need to continue", Helpers.LogLevel.Debug); + + _Running = false; + _Dead = true; + break; + case HttpStatusCode.InternalServerError: + // As per LL's instructions, we ought to consider this a + // 'request to close client' (gwyneth 20220413) + Logger.Log($"Grid sent a {code} at {_Address}, closing connection", Helpers.LogLevel.Debug); + + // ... but do we happen to have an InnerException? Log it! + if (error.InnerException != null) + { + // unravel the whole inner error message, so we finally figure out what it is! + // (gwyneth 20220414) + Logger.Log($"Unrecognized internal caps exception from {_Address}: '{error.InnerException.Message}'", Helpers.LogLevel.Warning); + Logger.Log("\nMessage ---\n{error.Message}", Helpers.LogLevel.Warning); + Logger.Log("\nHelpLink ---\n{ex.HelpLink}", Helpers.LogLevel.Warning); + Logger.Log("\nSource ---\n{error.Source}", Helpers.LogLevel.Warning); + Logger.Log("\nStackTrace ---\n{error.StackTrace}", Helpers.LogLevel.Warning); + Logger.Log("\nTargetSite ---\n{error.TargetSite}", Helpers.LogLevel.Warning); + if (error.Data.Count > 0) + { + Logger.Log(" Extra details:", Helpers.LogLevel.Warning); + foreach (DictionaryEntry de in error.Data) + Logger.Log(String.Format(" Key: {0,-20} Value: {1}", + "'" + de.Key.ToString() + "'", de.Value), + Helpers.LogLevel.Warning); + } + // but we'll nevertheless close this connection (gwyneth 20220414) + } _Running = false; _Dead = true; @@ -165,7 +196,11 @@ namespace OpenMetaverse.Http // The EventQueue server is a proxy that connects to a Squid // cache which will time out periodically. The EventQueue server // interprets this as a generic error and returns a 502 to us - // that we ignore + // that we ignore + // + // Note: if this condition persists, it _might_ be the grid trying to request + // that the client closes the connection, as per LL's specs (gwyneth 20220414) + Logger.Log($"Grid sent a Bad Gateway Error at {_Address}; probably a time-out from the grid's EventQueue server (normal) -- ignoring and continuing", Helpers.LogLevel.Debug); break; default: ++_errorCount; @@ -178,26 +213,20 @@ namespace OpenMetaverse.Http } else if (error.InnerException != null) { - // There is a situation where the InnerException contains - // InternalServerError (the 500 HTTP code) although the - // code _is_ HttpStatusCode.OK. Keeping this open will - // leak memory massively!! - // As per LL's instructions, we ought to consider this a - // 'request to close client' even though it's improperly - // formatted... (gwyneth 202204139) - if (error.InnerException.Message == "InternalServerError") + // see comment above (gwyneth 20220414) + Logger.Log($"Unrecognized internal caps exception from {_Address}: '{error.InnerException.Message}'", Helpers.LogLevel.Warning); + Logger.Log("\nMessage ---\n{error.Message}", Helpers.LogLevel.Warning); + Logger.Log("\nHelpLink ---\n{ex.HelpLink}", Helpers.LogLevel.Warning); + Logger.Log("\nSource ---\n{error.Source}", Helpers.LogLevel.Warning); + Logger.Log("\nStackTrace ---\n{error.StackTrace}", Helpers.LogLevel.Warning); + Logger.Log("\nTargetSite ---\n{error.TargetSite}", Helpers.LogLevel.Warning); + if (error.Data.Count > 0) { - Logger.Log("Grid sent us back an Internal Server Error, but HTTP code was 200, not 500 -- closing connection", - Helpers.LogLevel.Warning); - - _Running = false; - _Dead = true; - break; - } - else - { - Logger.Log($"Unrecognized internal caps exception from {_Address}: {error.InnerException.Message}", - Helpers.LogLevel.Warning); + Logger.Log(" Extra details:", Helpers.LogLevel.Warning); + foreach (DictionaryEntry de in error.Data) + Logger.Log(String.Format(" Key: {0,-20} Value: {1}", + "'" + de.Key.ToString() + "'", de.Value), + Helpers.LogLevel.Warning); } } else @@ -206,7 +235,7 @@ namespace OpenMetaverse.Http Helpers.LogLevel.Warning); } break; - } + } // end switch #endregion Error handling }