diff --git a/OpenSim/Framework/RestClient.cs b/OpenSim/Framework/RestClient.cs index 5c168722b0..49c7f632a5 100644 --- a/OpenSim/Framework/RestClient.cs +++ b/OpenSim/Framework/RestClient.cs @@ -88,7 +88,7 @@ namespace OpenSim.Framework /// /// Default time out period /// - private const int DefaultTimeout = 90; // 90 seconds timeout + private const int DefaultTimeout = 90000; // 90 seconds timeout /// /// Default Buffer size of a block requested from the web-server @@ -258,10 +258,10 @@ namespace OpenSim.Framework Uri uri = null; HttpResponseMessage responseMessage = null; HttpRequestMessage request = null; - CancellationTokenSource cancellationToken = null; + HttpClient client = null; try { - HttpClient client = WebUtil.SharedHttpClientWithRedir; + client = WebUtil.GetNewGlobalHttpClient(DefaultTimeout); uri = buildUri(); request = new(new HttpMethod(RequestMethod), uri); @@ -278,13 +278,12 @@ namespace OpenSim.Framework //else // request.Headers.TryAddWithoutValidation("Connection", "close"); - cancellationToken = new CancellationTokenSource(TimeSpan.FromSeconds(DefaultTimeout)); if (WebUtil.DebugLevel >= 3) m_log.DebugFormat("[REST CLIENT] {0} to {1}", RequestMethod, uri); //_request.ContentType = "application/xml"; - responseMessage = client.Send(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken.Token); + responseMessage = client.Send(request, HttpCompletionOption.ResponseHeadersRead); responseMessage.EnsureSuccessStatusCode(); Stream respStream = responseMessage.Content.ReadAsStream(); @@ -326,7 +325,7 @@ namespace OpenSim.Framework { request?.Dispose(); responseMessage?.Dispose(); - cancellationToken?.Dispose(); + client?.Dispose(); } if (_resource != null) @@ -348,10 +347,10 @@ namespace OpenSim.Framework Uri uri = null; HttpResponseMessage responseMessage = null; HttpRequestMessage request = null; - CancellationTokenSource cancellationToken = null; + HttpClient client = null; try { - HttpClient client = WebUtil.SharedHttpClientWithRedir; + client = WebUtil.GetNewGlobalHttpClient(DefaultTimeout); uri = buildUri(); request = new(HttpMethod.Post, uri); @@ -368,13 +367,11 @@ namespace OpenSim.Framework //else // request.Headers.TryAddWithoutValidation("Connection", "close"); - cancellationToken = new CancellationTokenSource(TimeSpan.FromSeconds(DefaultTimeout)); - request.Content = new ByteArrayContent(src); request.Content.Headers.TryAddWithoutValidation("Content-Type", "application/xml"); request.Content.Headers.TryAddWithoutValidation("Content-Length", src.Length.ToString()); - responseMessage = client.Send(request, HttpCompletionOption.ResponseContentRead, cancellationToken.Token); + responseMessage = client.Send(request, HttpCompletionOption.ResponseContentRead); responseMessage.EnsureSuccessStatusCode(); } catch (HttpRequestException e) @@ -402,7 +399,7 @@ namespace OpenSim.Framework { request?.Dispose(); responseMessage?.Dispose(); - cancellationToken?.Dispose(); + client?.Dispose(); } } diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs index 6543295c08..56ec2b08d6 100644 --- a/OpenSim/Framework/Util.cs +++ b/OpenSim/Framework/Util.cs @@ -55,6 +55,7 @@ using OpenMetaverse; using OpenMetaverse.StructuredData; using Amib.Threading; using System.Collections.Concurrent; +using System.Net.Http; namespace OpenSim.Framework { @@ -2194,6 +2195,7 @@ namespace OpenSim.Framework return ms; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static XmlRpcResponse XmlRpcCommand(string url, string methodName, params object[] args) { return SendXmlRpcCommand(url, methodName, args); @@ -2201,8 +2203,9 @@ namespace OpenSim.Framework public static XmlRpcResponse SendXmlRpcCommand(string url, string methodName, object[] args) { - XmlRpcRequest client = new(methodName, args); - return client.Send(url, WebUtil.SharedHttpClientWithRedir, 6000); + XmlRpcRequest xmlclient = new(methodName, args); + using HttpClient hclient = WebUtil.GetNewGlobalHttpClient(10000); + return xmlclient.Send(url, hclient); } /// diff --git a/OpenSim/Framework/WebUtil.cs b/OpenSim/Framework/WebUtil.cs index afbb29050e..1a9d9cc1e5 100644 --- a/OpenSim/Framework/WebUtil.cs +++ b/OpenSim/Framework/WebUtil.cs @@ -60,11 +60,8 @@ namespace OpenSim.Framework { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + public static SocketsHttpHandler SharedSocketsHttpHandlerNoRedir = null; public static SocketsHttpHandler SharedSocketsHttpHandler = null; - public static HttpClient SharedHttpClient = null; - - public static SocketsHttpHandler SharedSocketsHttpHandlerWithRedir = null; - public static HttpClient SharedHttpClientWithRedir = null; public static ExpiringKey GlobalExpiringBadURLs = new(30000); /// @@ -177,15 +174,7 @@ namespace OpenSim.Framework shh.UseProxy = true; } - var client = new HttpClient(shh) - { - Timeout = TimeSpan.FromMilliseconds(30000), - MaxResponseContentBufferSize = 250 * 1024 * 1024, - }; - client.DefaultRequestHeaders.ExpectContinue = false; - - SharedSocketsHttpHandler = shh; - SharedHttpClient = client; + SharedSocketsHttpHandlerNoRedir = shh; // **************** @@ -250,16 +239,29 @@ namespace OpenSim.Framework shh.Proxy = proxy; shh.UseProxy = true; } + SharedSocketsHttpHandler = shh; + } - client = new HttpClient(shh) + public static HttpClient GetNewGlobalHttpClient(int timeout) + { + var client = new HttpClient(SharedSocketsHttpHandler, false) { - Timeout = TimeSpan.FromMilliseconds(30000), + Timeout = TimeSpan.FromMilliseconds(timeout > 0 ? timeout : 30000), MaxResponseContentBufferSize = 250 * 1024 * 1024, }; client.DefaultRequestHeaders.ExpectContinue = false; + return client; + } - SharedSocketsHttpHandlerWithRedir = shh; - SharedHttpClientWithRedir = client; + public static HttpClient GetGlobalNoRedirHttpClient(int timeout) + { + var client = new HttpClient(SharedSocketsHttpHandlerNoRedir, false) + { + Timeout = TimeSpan.FromMilliseconds(timeout > 0 ? timeout : 30000), + MaxResponseContentBufferSize = 250 * 1024 * 1024, + }; + client.DefaultRequestHeaders.ExpectContinue = false; + return client; } /// @@ -366,11 +368,10 @@ namespace OpenSim.Framework int rcvlen = 0; HttpResponseMessage responseMessage = null; HttpRequestMessage request = null; - CancellationTokenSource cancellationToken = null; + HttpClient client = null; try { - HttpClient client = SharedHttpClientWithRedir; - + client = GetNewGlobalHttpClient(timeout); request = new(new HttpMethod(method), url); if (data is not null) @@ -418,16 +419,9 @@ namespace OpenSim.Framework else request.Headers.TryAddWithoutValidation("Connection", "close"); - if(timeout > 0) - cancellationToken = new CancellationTokenSource(TimeSpan.FromMilliseconds(timeout)); - request.Headers.TryAddWithoutValidation(OSHeaderRequestID, reqnum.ToString()); - if (cancellationToken is null) - responseMessage = client.Send(request, HttpCompletionOption.ResponseHeadersRead); - else - responseMessage = client.Send(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken.Token); - + responseMessage = client.Send(request, HttpCompletionOption.ResponseHeadersRead); responseMessage.EnsureSuccessStatusCode(); Stream resStream = responseMessage.Content.ReadAsStream(); @@ -455,7 +449,7 @@ namespace OpenSim.Framework { request?.Dispose(); responseMessage?.Dispose(); - cancellationToken?.Dispose(); + client?.Dispose(); ticks = Util.EnvironmentTickCountSubtract(ticks); if (ticks > LongCallTime) @@ -549,10 +543,10 @@ namespace OpenSim.Framework HttpResponseMessage responseMessage = null; HttpRequestMessage request = null; - CancellationTokenSource cancellationToken = null; + HttpClient client = null; try { - HttpClient client = WebUtil.SharedHttpClientWithRedir; + client = GetNewGlobalHttpClient(timeout); request = new(HttpMethod.Post, url); @@ -568,9 +562,6 @@ namespace OpenSim.Framework //else request.Headers.TryAddWithoutValidation("Connection", "close"); - if (timeout > 0) - cancellationToken = new CancellationTokenSource(TimeSpan.FromMilliseconds(timeout)); - request.Headers.TryAddWithoutValidation(OSHeaderRequestID, reqnum.ToString()); if (data is not null) @@ -596,10 +587,7 @@ namespace OpenSim.Framework request.Content.Headers.TryAddWithoutValidation("Content-Length", "0"); } - if (cancellationToken is null) - responseMessage = client.Send(request, HttpCompletionOption.ResponseHeadersRead); - else - responseMessage = client.Send(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken.Token); + responseMessage = client.Send(request, HttpCompletionOption.ResponseHeadersRead); responseMessage.EnsureSuccessStatusCode(); using StreamReader reader = new(responseMessage.Content.ReadAsStream()); @@ -627,7 +615,7 @@ namespace OpenSim.Framework { request?.Dispose(); responseMessage?.Dispose(); - cancellationToken?.Dispose(); + client?.Dispose(); ticks = Util.EnvironmentTickCountSubtract(ticks); if (ticks > LongCallTime) @@ -1160,13 +1148,13 @@ namespace OpenSim.Framework int ticks = Util.EnvironmentTickCount(); HttpResponseMessage responseMessage = null; HttpRequestMessage request = null; - CancellationTokenSource cancellationToken = null; + HttpClient client = null; string respstring = String.Empty; int sendlen = 0; int rcvlen = 0; try { - HttpClient client = WebUtil.SharedHttpClientWithRedir; + client = WebUtil.GetNewGlobalHttpClient(timeoutsecs * 1000); request = new(new HttpMethod(method), requestUrl); @@ -1175,9 +1163,6 @@ namespace OpenSim.Framework request.Headers.ExpectContinue = false; request.Headers.TransferEncodingChunked = false; if (timeoutsecs > 0) - if(timeoutsecs > 0) - cancellationToken = new CancellationTokenSource(TimeSpan.FromSeconds(timeoutsecs)); - if (keepalive) { request.Headers.TryAddWithoutValidation("Keep-Alive", "timeout=30, max=10"); @@ -1202,10 +1187,7 @@ namespace OpenSim.Framework request.Content.Headers.TryAddWithoutValidation("Content-Length", sendlen.ToString()); } - if (cancellationToken is null) - responseMessage = client.Send(request, HttpCompletionOption.ResponseHeadersRead); - else - responseMessage = client.Send(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken.Token); + responseMessage = client.Send(request, HttpCompletionOption.ResponseHeadersRead); responseMessage.EnsureSuccessStatusCode(); if ((responseMessage.Content.Headers.ContentLength is long contentLength) && contentLength != 0) @@ -1224,7 +1206,7 @@ namespace OpenSim.Framework { request?.Dispose(); responseMessage?.Dispose(); - cancellationToken?.Dispose(); + client?.Dispose(); } ticks = Util.EnvironmentTickCountSubtract(ticks); @@ -1259,14 +1241,13 @@ namespace OpenSim.Framework int ticks = Util.EnvironmentTickCount(); HttpResponseMessage responseMessage = null; HttpRequestMessage request = null; - CancellationTokenSource cancellationToken = null; + HttpClient client = null; string respstring = String.Empty; int sendlen = 0; int rcvlen = 0; try { - HttpClient client = WebUtil.SharedHttpClientWithRedir; - + client = WebUtil.GetNewGlobalHttpClient(timeoutsecs * 1000); request = new(HttpMethod.Post, requestUrl); auth?.AddAuthorization(request.Headers); @@ -1283,9 +1264,6 @@ namespace OpenSim.Framework else request.Headers.TryAddWithoutValidation("Connection", "close"); - if (timeoutsecs > 0) - cancellationToken = new CancellationTokenSource(TimeSpan.FromSeconds(timeoutsecs)); - byte[] data = Util.UTF8NBGetbytes(obj); sendlen = data.Length; request.Content = new ByteArrayContent(data); @@ -1295,10 +1273,7 @@ namespace OpenSim.Framework if (WebUtil.DebugLevel >= 5) WebUtil.LogOutgoingDetail("SEND", reqnum, System.Text.Encoding.UTF8.GetString(data)); - if (cancellationToken is null) - responseMessage = client.Send(request, HttpCompletionOption.ResponseHeadersRead); - else - responseMessage = client.Send(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken.Token); + responseMessage = client.Send(request, HttpCompletionOption.ResponseHeadersRead); if ((responseMessage.Content.Headers.ContentLength is long contentLength) && contentLength != 0) { @@ -1315,7 +1290,7 @@ namespace OpenSim.Framework { request?.Dispose(); responseMessage?.Dispose(); - cancellationToken?.Dispose(); + client?.Dispose(); } ticks = Util.EnvironmentTickCountSubtract(ticks); @@ -1401,11 +1376,11 @@ namespace OpenSim.Framework TResponse deserial = default; HttpResponseMessage responseMessage = null; HttpRequestMessage request = null; - CancellationTokenSource cancellationToken = null; + HttpClient client = null; try { - HttpClient client = WebUtil.SharedHttpClientWithRedir; + client = WebUtil.GetNewGlobalHttpClient(pTimeout); request = new(new HttpMethod(method), requestUrl); @@ -1423,9 +1398,6 @@ namespace OpenSim.Framework //else // request.Headers.TryAddWithoutValidation("Connection", "close"); - if (pTimeout != 0) - cancellationToken = new CancellationTokenSource(TimeSpan.FromMilliseconds(pTimeout)); - if (method.Equals("POST",StringComparison.OrdinalIgnoreCase) || method.Equals("PUT", StringComparison.OrdinalIgnoreCase)) { byte[] data; @@ -1448,10 +1420,7 @@ namespace OpenSim.Framework request.Content.Headers.TryAddWithoutValidation("Content-Length", sendlen.ToString()); } - if(cancellationToken is null) - responseMessage = client.Send(request, HttpCompletionOption.ResponseHeadersRead); - else - responseMessage = client.Send(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken.Token); + responseMessage = client.Send(request, HttpCompletionOption.ResponseHeadersRead); responseMessage.EnsureSuccessStatusCode(); int rcvlen = 0; @@ -1508,7 +1477,7 @@ namespace OpenSim.Framework { request?.Dispose(); responseMessage?.Dispose(); - cancellationToken?.Dispose(); + client?.Dispose(); } return deserial; @@ -1525,12 +1494,10 @@ namespace OpenSim.Framework TResponse deserial = default; HttpResponseMessage responseMessage = null; HttpRequestMessage request = null; - CancellationTokenSource cancellationToken = null; + HttpClient client = null; try { - HttpClient client = WebUtil.SharedHttpClientWithRedir; - - + client = WebUtil.GetNewGlobalHttpClient(pTimeout); request = new(HttpMethod.Get, requestUrl); auth?.AddAuthorization(request.Headers); @@ -1547,13 +1514,7 @@ namespace OpenSim.Framework //else // request.Headers.TryAddWithoutValidation("Connection", "close"); - if (pTimeout != 0) - cancellationToken = new CancellationTokenSource(TimeSpan.FromMilliseconds(pTimeout)); - - if (cancellationToken is null) - responseMessage = client.Send(request, HttpCompletionOption.ResponseHeadersRead); - else - responseMessage = client.Send(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken.Token); + responseMessage = client.Send(request, HttpCompletionOption.ResponseHeadersRead); responseMessage.EnsureSuccessStatusCode(); int rcvlen = 0; @@ -1608,7 +1569,7 @@ namespace OpenSim.Framework { request?.Dispose(); responseMessage?.Dispose(); - cancellationToken?.Dispose(); + client?.Dispose(); } return deserial; } @@ -1674,7 +1635,7 @@ namespace OpenSim.Framework int tickstart = Util.EnvironmentTickCount(); string responseStr = null; - + HttpClient client = null; try { ArrayList SendParams = new() @@ -1691,7 +1652,8 @@ namespace OpenSim.Framework WebUtil.LogOutgoingDetail("SEND", reqnum, str); } - XmlRpcResponse Resp = Req.Send(url, WebUtil.SharedHttpClientWithRedir, 30000); + client = WebUtil.GetNewGlobalHttpClient(-1); + XmlRpcResponse Resp = Req.Send(url, client); try { @@ -1719,6 +1681,8 @@ namespace OpenSim.Framework } finally { + client?.Dispose(); + int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); if (tickdiff > WebUtil.LongCallTime) { diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs index 558ef4cdb3..5bed9deffe 100644 --- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs @@ -41,6 +41,7 @@ using OpenSim.Region.Framework.Scenes; using GridRegion = OpenSim.Services.Interfaces.GridRegion; using PresenceInfo = OpenSim.Services.Interfaces.PresenceInfo; using OpenSim.Services.Interfaces; +using System.Net.Http; namespace OpenSim.Region.CoreModules.Avatar.InstantMessage { @@ -597,9 +598,11 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage ArrayList SendParams = new ArrayList(); SendParams.Add(xmlrpcdata); XmlRpcRequest GridReq = new XmlRpcRequest("grid_instant_message", SendParams); + HttpClient hclient = null; try { - XmlRpcResponse GridResp = GridReq.Send(reginfo.ServerURI, WebUtil.SharedHttpClientWithRedir, 6000); + hclient = WebUtil.GetNewGlobalHttpClient(10000); + XmlRpcResponse GridResp = GridReq.Send(reginfo.ServerURI, hclient); Hashtable responseData = (Hashtable)GridResp.Value; if (responseData.ContainsKey("success")) { @@ -621,6 +624,10 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage { m_log.ErrorFormat("[GRID INSTANT MESSAGE]: Error sending message to {0} : {1}", reginfo.ServerURI.ToString(), e.Message); } + finally + { + hclient?.Dispose(); + } return false; } diff --git a/OpenSim/Region/CoreModules/Scripting/XMLRPC/XMLRPCModule.cs b/OpenSim/Region/CoreModules/Scripting/XMLRPC/XMLRPCModule.cs index fd7ba447a7..0839ee0910 100644 --- a/OpenSim/Region/CoreModules/Scripting/XMLRPC/XMLRPCModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/XMLRPC/XMLRPCModule.cs @@ -42,6 +42,7 @@ using OpenSim.Framework.Servers.HttpServer; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; using Mono.Addins; +using System.Net.Http; /***************************************************** * @@ -686,9 +687,11 @@ namespace OpenSim.Region.CoreModules.Scripting.XMLRPC ArrayList parameters = new ArrayList(); parameters.Add(param); XmlRpcRequest req = new XmlRpcRequest(mName, parameters); + HttpClient hclient = null; try { - XmlRpcResponse resp = req.Send(DestURL, WebUtil.SharedHttpClientWithRedir, 30000); + hclient = WebUtil.GetNewGlobalHttpClient(-1); + XmlRpcResponse resp = req.Send(DestURL, hclient); if (resp != null) { Hashtable respParms; @@ -733,6 +736,7 @@ namespace OpenSim.Region.CoreModules.Scripting.XMLRPC _finished = true; httpThread = null; Watchdog.RemoveThread(); + hclient?.Dispose(); } } diff --git a/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs b/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs index bb96a7eca0..6e05ef90cb 100755 --- a/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs +++ b/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs @@ -283,9 +283,10 @@ namespace OpenSim.Region.OptionalModules.Scripting.RegionReady HttpResponseMessage responseMessage = null; HttpRequestMessage request = null; + HttpClient client = null; try { - HttpClient client = WebUtil.SharedHttpClientWithRedir; + client = WebUtil.GetNewGlobalHttpClient(-1); request = new(HttpMethod.Post, m_uri); request.Headers.ExpectContinue = false; @@ -307,6 +308,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.RegionReady { request?.Dispose(); responseMessage?.Dispose(); + client?.Dispose(); } } } diff --git a/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs index 66d97cc1a5..05355fb18d 100644 --- a/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs +++ b/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs @@ -42,6 +42,7 @@ using Nwc.XmlRpc; using log4net; using OpenSim.Services.Connectors.Simulation; +using System.Net.Http; namespace OpenSim.Services.Connectors.Hypergrid { @@ -94,7 +95,8 @@ namespace OpenSim.Services.Connectors.Hypergrid XmlRpcResponse response = null; try { - response = request.Send(info.ServerURI, WebUtil.SharedHttpClientWithRedir, 10000); + using HttpClient hclient = WebUtil.GetNewGlobalHttpClient(10000); + response = request.Send(info.ServerURI, hclient); } catch (Exception e) { @@ -230,7 +232,8 @@ namespace OpenSim.Services.Connectors.Hypergrid XmlRpcResponse response = null; try { - response = request.Send(gatekeeper.ServerURI, WebUtil.SharedHttpClientWithRedir, 10000); + using HttpClient hclient = WebUtil.GetNewGlobalHttpClient(10000); + response = request.Send(gatekeeper.ServerURI, hclient); } catch (Exception e) { diff --git a/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs index f7b322e4e9..b7090fcae0 100644 --- a/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs +++ b/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs @@ -41,6 +41,7 @@ using OpenMetaverse.StructuredData; using log4net; using Nwc.XmlRpc; using Nini.Config; +using System.Net.Http; namespace OpenSim.Services.Connectors.Hypergrid { @@ -162,7 +163,8 @@ namespace OpenSim.Services.Connectors.Hypergrid XmlRpcResponse response = null; try { - response = request.Send(m_ServerURL, WebUtil.SharedHttpClientWithRedir, 10000); + using HttpClient hclient = WebUtil.GetNewGlobalHttpClient(10000); + response = request.Send(m_ServerURL, hclient); } catch (Exception e) { @@ -336,7 +338,8 @@ namespace OpenSim.Services.Connectors.Hypergrid XmlRpcResponse response = null; try { - response = request.Send(m_ServerURL, WebUtil.SharedHttpClientWithRedir, 6000); + using HttpClient hclient = WebUtil.GetNewGlobalHttpClient(10000); + response = request.Send(m_ServerURL, hclient); } catch { @@ -408,7 +411,8 @@ namespace OpenSim.Services.Connectors.Hypergrid XmlRpcResponse response = null; try { - response = request.Send(m_ServerURL, WebUtil.SharedHttpClientWithRedir, 10000); + using HttpClient hclient = WebUtil.GetNewGlobalHttpClient(10000); + response = request.Send(m_ServerURL, hclient); } catch { @@ -558,7 +562,8 @@ namespace OpenSim.Services.Connectors.Hypergrid XmlRpcResponse response = null; try { - response = request.Send(m_ServerURL, WebUtil.SharedHttpClientWithRedir, 10000); + using HttpClient hclient = WebUtil.GetNewGlobalHttpClient(10000); + response = request.Send(m_ServerURL, hclient); } catch (Exception e) { diff --git a/OpenSim/Services/Connectors/InstantMessage/InstantMessageServiceConnector.cs b/OpenSim/Services/Connectors/InstantMessage/InstantMessageServiceConnector.cs index 58a16ed36f..08bf11507c 100644 --- a/OpenSim/Services/Connectors/InstantMessage/InstantMessageServiceConnector.cs +++ b/OpenSim/Services/Connectors/InstantMessage/InstantMessageServiceConnector.cs @@ -35,6 +35,7 @@ using Nwc.XmlRpc; using log4net; using OpenSim.Framework; +using System.Net.Http; namespace OpenSim.Services.Connectors.InstantMessage { @@ -60,8 +61,8 @@ namespace OpenSim.Services.Connectors.InstantMessage XmlRpcRequest GridReq = new XmlRpcRequest("grid_instant_message", SendParams); try { - - XmlRpcResponse GridResp = GridReq.Send(url, WebUtil.SharedHttpClientWithRedir, 10000); + using HttpClient hclient = WebUtil.GetNewGlobalHttpClient(10000); + XmlRpcResponse GridResp = GridReq.Send(url, hclient); Hashtable responseData = (Hashtable)GridResp.Value; diff --git a/OpenSim/Services/Connectors/Inventory/XInventoryServicesConnector.cs b/OpenSim/Services/Connectors/Inventory/XInventoryServicesConnector.cs index 5b37f4520e..02679ed599 100644 --- a/OpenSim/Services/Connectors/Inventory/XInventoryServicesConnector.cs +++ b/OpenSim/Services/Connectors/Inventory/XInventoryServicesConnector.cs @@ -62,7 +62,7 @@ namespace OpenSim.Services.Connectors /// /// In this case, -1 is default timeout (100 seconds), not infinite. /// - private int m_requestTimeoutSecs = -1; + private int m_requestTimeout = -1; private readonly string m_configName = "InventoryService"; private const double CACHE_EXPIRATION_SECONDS = 30.0; @@ -114,7 +114,7 @@ namespace OpenSim.Services.Connectors else m_InventoryURL = serviceURI + "/xinventory"; - m_requestTimeoutSecs = config.GetInt("RemoteRequestTimeout", m_requestTimeoutSecs); + m_requestTimeout = 1000 * config.GetInt("RemoteRequestTimeout", -1); StatsManager.RegisterStat( new Stat( @@ -761,10 +761,10 @@ namespace OpenSim.Services.Connectors int rcvlen = 0; HttpResponseMessage responseMessage = null; HttpRequestMessage request = null; - CancellationTokenSource cancellationToken = null; + HttpClient client = null; try { - HttpClient client = WebUtil.SharedHttpClientWithRedir; + client = WebUtil.GetNewGlobalHttpClient(m_requestTimeout); request = new(HttpMethod.Post, m_InventoryURL); @@ -782,9 +782,6 @@ namespace OpenSim.Services.Connectors request.Headers.ExpectContinue = false; request.Headers.TransferEncodingChunked = false; - if (m_requestTimeoutSecs > 0) - cancellationToken = new CancellationTokenSource(TimeSpan.FromSeconds(m_requestTimeoutSecs)); - byte[] data = Util.UTF8NBGetbytes(obj); sendlen = data.Length; @@ -792,10 +789,7 @@ namespace OpenSim.Services.Connectors request.Content.Headers.TryAddWithoutValidation("Content-Type", "application/x-www-form-urlencoded"); request.Content.Headers.TryAddWithoutValidation("Content-Length", sendlen.ToString()); - if (cancellationToken is null) - responseMessage = client.Send(request, HttpCompletionOption.ResponseHeadersRead); - else - responseMessage = client.Send(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken.Token); + responseMessage = client.Send(request, HttpCompletionOption.ResponseHeadersRead); responseMessage.EnsureSuccessStatusCode(); if ((responseMessage.Content.Headers.ContentLength is long contentLength) && contentLength != 0) @@ -813,7 +807,7 @@ namespace OpenSim.Services.Connectors { request?.Dispose(); responseMessage?.Dispose(); - cancellationToken?.Dispose(); + client?.Dispose(); } ticks = Util.EnvironmentTickCountSubtract(ticks); diff --git a/OpenSim/Services/Connectors/Land/LandServicesConnector.cs b/OpenSim/Services/Connectors/Land/LandServicesConnector.cs index 5e5f1fc726..977176f6e8 100644 --- a/OpenSim/Services/Connectors/Land/LandServicesConnector.cs +++ b/OpenSim/Services/Connectors/Land/LandServicesConnector.cs @@ -38,6 +38,7 @@ using OpenSim.Services.Interfaces; using OpenMetaverse; using Nwc.XmlRpc; using GridRegion = OpenSim.Services.Interfaces.GridRegion; +using System.Net.Http; namespace OpenSim.Services.Connectors { @@ -92,7 +93,8 @@ namespace OpenSim.Services.Connectors paramList.Add(hash); XmlRpcRequest request = new XmlRpcRequest("land_data", paramList); - XmlRpcResponse response = request.Send(info.ServerURI, WebUtil.SharedHttpClientWithRedir, 10000); + using HttpClient hclient = WebUtil.GetNewGlobalHttpClient(10000); + XmlRpcResponse response = request.Send(info.ServerURI, hclient); if (response.IsFault) { m_log.ErrorFormat("[LAND CONNECTOR]: remote call returned an error: {0}", response.FaultString); diff --git a/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs b/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs index 8fc7fe90ab..30411111db 100644 --- a/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs +++ b/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs @@ -108,10 +108,10 @@ namespace OpenSim.Services.Connectors HttpResponseMessage responseMessage = null; HttpRequestMessage request = null; - CancellationTokenSource cancellationToken = null; + HttpClient client = null; try { - HttpClient client = WebUtil.SharedHttpClientWithRedir; + client = WebUtil.GetNewGlobalHttpClient(10000); request = new(HttpMethod.Post, uri); request.Headers.ExpectContinue = false; request.Headers.TransferEncodingChunked = false; @@ -127,10 +127,9 @@ namespace OpenSim.Services.Connectors request.Content.Headers.TryAddWithoutValidation("Content-Type", "application/json"); request.Content.Headers.TryAddWithoutValidation("Content-Length", buffer.Length.ToString()); - cancellationToken = new CancellationTokenSource(TimeSpan.FromSeconds(10)); //m_log.InfoFormat("[REST COMMS]: Posted HelloNeighbour request to remote sim {0}", uri); - responseMessage = client.Send(request, HttpCompletionOption.ResponseContentRead, cancellationToken.Token); + responseMessage = client.Send(request, HttpCompletionOption.ResponseContentRead); responseMessage.EnsureSuccessStatusCode(); //using StreamReader sr = new(responseMessage.Content.ReadAsStream()); @@ -149,7 +148,7 @@ namespace OpenSim.Services.Connectors { request?.Dispose(); responseMessage?.Dispose(); - cancellationToken?.Dispose(); + client?.Dispose(); } return false; } diff --git a/bin/XMLRPC.dll b/bin/XMLRPC.dll index bc7c01a8dc..1800342e51 100755 Binary files a/bin/XMLRPC.dll and b/bin/XMLRPC.dll differ