diff --git a/LibreMetaverse.Voice/VoiceControl.cs b/LibreMetaverse.Voice/VoiceControl.cs index feadbf0c..198cb5b6 100644 --- a/LibreMetaverse.Voice/VoiceControl.cs +++ b/LibreMetaverse.Voice/VoiceControl.cs @@ -35,6 +35,7 @@ using OpenMetaverse; using OpenMetaverse.StructuredData; using OpenMetaverse.Http; using System.Net.Http; +using System.Threading.Tasks; namespace LibreMetaverse.Voice { @@ -319,7 +320,7 @@ namespace LibreMetaverse.Voice { Logger.Log("Requesting voice capability", Helpers.LogLevel.Info); _ = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, new OSD(), - cClient_OnComplete, null, CancellationToken.None); + CancellationToken.None, cClient_OnComplete); } /// @@ -838,8 +839,8 @@ namespace LibreMetaverse.Voice Logger.Log("Requesting region voice info", Helpers.LogLevel.Info); currentParcelCap = cap; - _ = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, new OSD(), - pCap_OnComplete, null, CancellationToken.None); + Task req = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, new OSD(), + CancellationToken.None, pCap_OnComplete); } /// diff --git a/LibreMetaverse.Voice/VoiceManager.cs b/LibreMetaverse.Voice/VoiceManager.cs index 0786274c..6a1c698a 100644 --- a/LibreMetaverse.Voice/VoiceManager.cs +++ b/LibreMetaverse.Voice/VoiceManager.cs @@ -38,6 +38,7 @@ using OpenMetaverse.Http; using OpenMetaverse.Interfaces; using OpenMetaverse.Messages.Linden; using System.Net.Http; +using System.Threading.Tasks; namespace LibreMetaverse.Voice { @@ -315,8 +316,8 @@ namespace LibreMetaverse.Voice if (cap != null) { - _ = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, new OSDMap(), - callback, null, CancellationToken.None); + Task req = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, new OSDMap(), + CancellationToken.None, callback); return true; } diff --git a/LibreMetaverse/AgentManager.cs b/LibreMetaverse/AgentManager.cs index 778f039a..36e4c0b3 100644 --- a/LibreMetaverse/AgentManager.cs +++ b/LibreMetaverse/AgentManager.cs @@ -1621,8 +1621,7 @@ namespace OpenMetaverse return; } - _ = Client.HttpCapsClient.GetRequestAsync(offlineMsgsCap, OfflineMessageHandlerCallback, - null, CancellationToken.None); + Task req = Client.HttpCapsClient.GetRequestAsync(offlineMsgsCap, CancellationToken.None, OfflineMessageHandlerCallback); } /// @@ -1921,7 +1920,7 @@ namespace OpenMetaverse ChatSessionAcceptInvitation acceptInvite = new ChatSessionAcceptInvitation {SessionID = session_id}; Task req = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, acceptInvite.Serialize(), - null, null, CancellationToken.None); + CancellationToken.None, null); req.ContinueWith(t => { lock (GroupChatSessions.Dictionary) @@ -1966,8 +1965,8 @@ namespace OpenMetaverse startConference.SessionID = tmp_session_id; - _ = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, startConference.Serialize(), - null, null, CancellationToken.None); + Task req = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, startConference.Serialize(), + CancellationToken.None, null); } else { @@ -3722,7 +3721,8 @@ namespace OpenMetaverse try { Uri cap = Client.Network.CurrentSim.Caps.CapabilityURI("AttachmentResources"); - _ = Client.HttpCapsClient.GetRequestAsync(cap, (response, data, error) => + Task req = Client.HttpCapsClient.GetRequestAsync(cap, CancellationToken.None, + (response, data, error) => { if (error != null) { @@ -3740,7 +3740,7 @@ namespace OpenMetaverse Logger.Log("Failed fetching AttachmentResources", Helpers.LogLevel.Error, Client, ex); callback(false, null); } - }, null, CancellationToken.None); + }); } catch (Exception ex) { @@ -3777,8 +3777,8 @@ namespace OpenMetaverse NewDisplayName = newName }; - _ = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, msg.Serialize(), - null, null, CancellationToken.None); + Task req = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, msg.Serialize(), + CancellationToken.None, null); } /// @@ -3797,8 +3797,8 @@ namespace OpenMetaverse }; Uri cap = Client.Network.CurrentSim.Caps.CapabilityURI("UpdateAgentLanguage"); - _ = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, msg.Serialize(), - null, null, CancellationToken.None); + Task req = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, msg.Serialize(), + CancellationToken.None, null); } catch (Exception ex) { @@ -3826,14 +3826,15 @@ namespace OpenMetaverse { if (Client == null || !Client.Network.Connected || Client.Network.CurrentSim.Caps == null) { return; } - OSDMap req = new OSDMap + OSDMap payload = new OSDMap { ["access_prefs"] = new OSDMap { ["max"] = access } }; Uri cap = Client.Network.CurrentSim.Caps.CapabilityURI("UpdateAgentInformation"); if (cap == null) { return; } - _ = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, req, (response, data, error) => + Task req = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, payload, CancellationToken.None, + (response, data, error) => { bool success = true; OSD result = OSDParser.Deserialize(data); @@ -3858,7 +3859,7 @@ namespace OpenMetaverse try { callback(new AgentAccessEventArgs(success, AgentAccess)); } catch { } // *TODO: So gross } - }, null, CancellationToken.None); + }); } /// @@ -3874,7 +3875,8 @@ namespace OpenMetaverse Uri cap = Client.Network.CurrentSim.Caps.CapabilityURI("AgentPreferences"); if (cap == null) { return; } - _ = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, postData, (response, data, error) => + Task req = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, postData, CancellationToken.None, + (response, data, error) => { OSD result = OSDParser.Deserialize(data); @@ -3892,7 +3894,7 @@ namespace OpenMetaverse var confirmedHeight = resultMap["hover_height"]; Logger.Log($"Hover height set to {confirmedHeight}", Helpers.LogLevel.Debug, Client); } - }, null, CancellationToken.None); + }); } #endregion Misc @@ -4764,15 +4766,14 @@ namespace OpenMetaverse throw new Exception("ChatSessionRequest capability is not currently available"); } - ChatSessionRequestMuteUpdate req = new ChatSessionRequestMuteUpdate + ChatSessionRequestMuteUpdate payload = new ChatSessionRequestMuteUpdate { RequestKey = key, RequestValue = moderate, SessionID = sessionID, AgentID = memberID }; - _ = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, req.Serialize(), - null, null, CancellationToken.None); + Task req = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, payload.Serialize(), CancellationToken.None, null); } /// Process an incoming packet and raise the appropriate events diff --git a/LibreMetaverse/AppearanceManager.cs b/LibreMetaverse/AppearanceManager.cs index 75840e4c..bde9958e 100644 --- a/LibreMetaverse/AppearanceManager.cs +++ b/LibreMetaverse/AppearanceManager.cs @@ -2097,9 +2097,8 @@ namespace OpenMetaverse OSD res = null; - await Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, request, - (response, data, error) => res = OSDParser.Deserialize(data), - null, cancellationToken); + await Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, request, cancellationToken, + (response, data, error) => res = OSDParser.Deserialize(data)); if (res is OSDMap result) { diff --git a/LibreMetaverse/AssetManager.cs b/LibreMetaverse/AssetManager.cs index 1e679d10..7f51a5e6 100644 --- a/LibreMetaverse/AssetManager.cs +++ b/LibreMetaverse/AssetManager.cs @@ -28,6 +28,7 @@ using System; using System.Collections.Generic; using System.Threading; +using System.Threading.Tasks; using LibreMetaverse; using OpenMetaverse.Packets; using OpenMetaverse.Assets; @@ -1096,7 +1097,8 @@ namespace OpenMetaverse } if (cap != null) { - _ = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, new OSD(), (response, data, error) => + Task req = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, new OSD(), CancellationToken.None, + (response, data, error) => { if (error == null) { @@ -1118,8 +1120,8 @@ namespace OpenMetaverse if (uploadUrl != null) { // POST the asset data - _ = Client.HttpCapsClient.PostRequestAsync(uploadUrl, "application/octet-stream", textureData, - (responseMessage, responseData, except) => + Task req = Client.HttpCapsClient.PostRequestAsync(uploadUrl, "application/octet-stream", textureData, + CancellationToken.None, (responseMessage, responseData, except) => { if (except != null) { @@ -1143,7 +1145,7 @@ namespace OpenMetaverse Logger.Log("Bake upload failed during asset upload", Helpers.LogLevel.Warning, Client); callback(UUID.Zero); - }, null, CancellationToken.None); + }); return; } } @@ -1151,7 +1153,7 @@ namespace OpenMetaverse Logger.Log("Bake upload failed during uploader retrieval", Helpers.LogLevel.Warning, Client); callback(UUID.Zero); - }, null, CancellationToken.None); + }); } else { diff --git a/LibreMetaverse/AvatarManager.cs b/LibreMetaverse/AvatarManager.cs index fb753865..556e9ebb 100644 --- a/LibreMetaverse/AvatarManager.cs +++ b/LibreMetaverse/AvatarManager.cs @@ -30,6 +30,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; +using System.Threading.Tasks; using OpenMetaverse.Http; using OpenMetaverse.Packets; using OpenMetaverse.Interfaces; @@ -717,7 +718,7 @@ namespace OpenMetaverse Uri uri = new Uri(Client.Network.CurrentSim.Caps.CapabilityURI("GetDisplayNames").AbsoluteUri + "/?" + query); - _ = Client.HttpCapsClient.GetRequestAsync(uri, (response, data, error) => + Task req = Client.HttpCapsClient.GetRequestAsync(uri, CancellationToken.None, (response, data, error) => { try { @@ -736,7 +737,7 @@ namespace OpenMetaverse Helpers.LogLevel.Warning, Client, ex); callback(false, null, null); } - }, null, CancellationToken.None); + }); } /// diff --git a/LibreMetaverse/Capabilities/EventQueueClient.cs b/LibreMetaverse/Capabilities/EventQueueClient.cs index 6906598c..10c38f6b 100644 --- a/LibreMetaverse/Capabilities/EventQueueClient.cs +++ b/LibreMetaverse/Capabilities/EventQueueClient.cs @@ -28,18 +28,15 @@ using System; using System.Collections; using System.Net; +using System.Net.Http; using System.Threading; +using System.Threading.Tasks; using OpenMetaverse.StructuredData; namespace OpenMetaverse.Http { public class EventQueueClient { - private const string REQUEST_CONTENT_TYPE = "application/llsd+xml"; - - /// Viewer defauls to 30 for main grid, 60 for others - public const int REQUEST_TIMEOUT = 60 * 1000; - /// For exponential backoff on error. public const int REQUEST_BACKOFF_SECONDS = 15 * 1000; // 15 seconds start public const int REQUEST_BACKOFF_SECONDS_INC = 5 * 1000; // 5 seconds increase @@ -56,27 +53,29 @@ namespace OpenMetaverse.Http protected Uri _Address; protected bool _Dead; protected bool _Running; - protected HttpWebRequest _Request; + private GridClient _Client; + private CancellationTokenSource _HttpCts; /// Number of times we've received an unknown CAPS exception in series. private int _errorCount; - public EventQueueClient(Uri eventQueueLocation) + public EventQueueClient(Uri eventQueueLocation, GridClient client) { _Address = eventQueueLocation; + _Client = client; } public void Start() { _Dead = false; + _Running = true; // Create an EventQueueGet request - OSDMap request = new OSDMap {["ack"] = new OSD(), ["done"] = OSD.FromBoolean(false)}; + OSDMap payload = new OSDMap {["ack"] = new OSD(), ["done"] = OSD.FromBoolean(false)}; - byte[] postData = OSDParser.SerializeLLSDXmlBytes(request); - - _Request = CapsBase.PostDataAsync(_Address, null, REQUEST_CONTENT_TYPE, postData, REQUEST_TIMEOUT, - OpenWriteHandler, null, RequestCompletedHandler); + _HttpCts = new CancellationTokenSource(); + Task req = _Client.HttpCapsClient.PostRequestAsync(_Address, OSDFormat.Xml, payload, _HttpCts.Token, + RequestCompletedHandler, null, ConnectedResponseHandler); } public void Stop(bool immediate) @@ -88,13 +87,14 @@ namespace OpenMetaverse.Http _Running = false; } - _Request?.Abort(); + _HttpCts.Cancel(); } - void OpenWriteHandler(HttpWebRequest request) + void ConnectedResponseHandler(HttpResponseMessage response) { + if (!response.IsSuccessStatusCode) { return; } + _Running = true; - _Request = request; Logger.DebugLog("Capabilities event queue connected"); @@ -106,11 +106,8 @@ namespace OpenMetaverse.Http } } - void RequestCompletedHandler(HttpWebRequest request, HttpWebResponse response, byte[] responseData, Exception error) + void RequestCompletedHandler(HttpResponseMessage response, byte[] responseData, Exception error) { - // We don't care about this request now that it has completed - _Request = null; - OSDArray events = null; int ack = 0; @@ -132,24 +129,8 @@ namespace OpenMetaverse.Http else if (error != null) { #region Error handling - - HttpStatusCode code = HttpStatusCode.OK; - - if (error is WebException webException) - { - // Filter out some of the status requests to skip handling - switch (webException.Status) - { - case WebExceptionStatus.RequestCanceled: - case WebExceptionStatus.KeepAliveFailure: - goto HandlingDone; - } - - if (webException.Response != null) - code = ((HttpWebResponse)webException.Response).StatusCode; - } - - switch (code) + + switch (response.StatusCode) { case HttpStatusCode.NotFound: case HttpStatusCode.Gone: @@ -168,7 +149,7 @@ namespace OpenMetaverse.Http 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); + Logger.Log($"Grid sent a {response.StatusCode} at {_Address}, closing connection", Helpers.LogLevel.Debug); // ... but do we happen to have an InnerException? Log it! if (error.InnerException != null) @@ -212,9 +193,9 @@ namespace OpenMetaverse.Http ++_errorCount; // Try to log a meaningful error message - if (code != HttpStatusCode.OK) + if (response.StatusCode != HttpStatusCode.OK) { - Logger.Log($"Unrecognized caps connection problem from {_Address}: {code}", + Logger.Log($"Unrecognized caps connection problem from {_Address}: {response.StatusCode} {response.ReasonPhrase}", Helpers.LogLevel.Warning); } else if (error.InnerException != null) @@ -231,7 +212,7 @@ namespace OpenMetaverse.Http Logger.Log(" Extra details:", Helpers.LogLevel.Warning); foreach (DictionaryEntry de in error.Data) { - Logger.Log(String.Format(" Key: {0,-20} Value: {1}", + Logger.Log(string.Format(" Key: {0,-20} Value: {1}", "'" + de.Key + "'", de.Value), Helpers.LogLevel.Warning); } @@ -254,26 +235,25 @@ namespace OpenMetaverse.Http Logger.Log("No response from the event queue but no reported error either", Helpers.LogLevel.Warning); } +#pragma warning disable CS0164 // This label has not been referenced HandlingDone: #region Resume the connection if (_Running) { - OSDMap osdRequest = new OSDMap(); - if (ack != 0) osdRequest["ack"] = OSD.FromInteger(ack); - else osdRequest["ack"] = new OSD(); - osdRequest["done"] = OSD.FromBoolean(_Dead); - - byte[] postData = OSDParser.SerializeLLSDXmlBytes(osdRequest); + OSDMap payload = new OSDMap(); + if (ack != 0) payload["ack"] = OSD.FromInteger(ack); + else payload["ack"] = new OSD(); + payload["done"] = OSD.FromBoolean(_Dead); if (_errorCount > 0) // Exponentially back off, so we don't hammer the CPU Thread.Sleep(Math.Min(REQUEST_BACKOFF_SECONDS + _errorCount * REQUEST_BACKOFF_SECONDS_INC, REQUEST_BACKOFF_SECONDS_MAX)); // Resume the connection. The event handler for the connection opening // just sets class _Request variable to the current HttpWebRequest - CapsBase.PostDataAsync(_Address, null, REQUEST_CONTENT_TYPE, postData, REQUEST_TIMEOUT, - (HttpWebRequest newRequest) => { _Request = newRequest; }, null, RequestCompletedHandler); + Task req = _Client.HttpCapsClient.PostRequestAsync(_Address, OSDFormat.Xml, payload, _HttpCts.Token, + RequestCompletedHandler); // If the event queue is dead at this point, turn it off since // that was the last thing we want to do @@ -283,6 +263,7 @@ namespace OpenMetaverse.Http Logger.DebugLog("Sent event queue shutdown message"); } } +#pragma warning restore CS0164 // This label has not been referenced #endregion Resume the connection diff --git a/LibreMetaverse/Capabilities/HttpCapsClient.cs b/LibreMetaverse/Capabilities/HttpCapsClient.cs index a80bbec6..fb3d2f00 100644 --- a/LibreMetaverse/Capabilities/HttpCapsClient.cs +++ b/LibreMetaverse/Capabilities/HttpCapsClient.cs @@ -32,18 +32,19 @@ using System.Threading; using System.Threading.Tasks; using OpenMetaverse.StructuredData; -public static class AsyncHelper -{ - public static void Sync(Func func) => Task.Run(func).ConfigureAwait(false); - - public static T Sync(Func> func) => Task.Run(func).Result; - -} - namespace LibreMetaverse { public delegate void DownloadProgressHandler(long? totalBytes, long totalBytesRead, double? progressPercentage); public delegate void DownloadCompleteHandler(HttpResponseMessage response, byte[] responseData, Exception error); + public delegate void ConnectedHandler(HttpResponseMessage response); + + public static class AsyncHelper + { + public static void Sync(Func func) => Task.Run(func).ConfigureAwait(false); + + public static T Sync(Func> func) => Task.Run(func).Result; + + } public class HttpCapsClient : HttpClient { @@ -53,120 +54,165 @@ namespace LibreMetaverse #region GET requests - public async Task GetRequestAsync(Uri uri, DownloadCompleteHandler completeHandler, - DownloadProgressHandler progressHandler, CancellationToken? cancellationToken) + public async Task GetRequestAsync(Uri uri, CancellationToken? cancellationToken, + DownloadCompleteHandler completeHandler, DownloadProgressHandler progressHandler, ConnectedHandler connectedHandler) { using var request = new HttpRequestMessage(HttpMethod.Get, uri); - await SendRequestAsync(request, completeHandler, progressHandler, cancellationToken); + await SendRequestAsync(request, cancellationToken, completeHandler, progressHandler, connectedHandler); + } + + public async Task GetRequestAsync(Uri uri, CancellationToken? cancellationToken, DownloadCompleteHandler completeHandler) + { + await GetRequestAsync(uri, cancellationToken, completeHandler, null, null); } #endregion GET requests #region POST requests - public async Task PostRequestAsync(Uri uri, string contentType, byte[] payload, - DownloadCompleteHandler completeHandler, DownloadProgressHandler progressHandler, - CancellationToken? cancellationToken) + public async Task PostRequestAsync(Uri uri, string contentType, byte[] payload, CancellationToken? cancellationToken, + DownloadCompleteHandler completeHandler, DownloadProgressHandler progressHandler, ConnectedHandler connectedHandler) { using var request = new HttpRequestMessage(HttpMethod.Post, uri); request.Content = new ByteArrayContent(payload); request.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType); - await SendRequestAsync(request, completeHandler, progressHandler, cancellationToken); + await SendRequestAsync(request, cancellationToken, completeHandler, progressHandler, connectedHandler); } - public async Task PostRequestAsync(Uri uri, OSDFormat format, OSD payload, - DownloadCompleteHandler completeHandler, DownloadProgressHandler progressHandler, - CancellationToken? cancellationToken) + public async Task PostRequestAsync(Uri uri, string contentType, byte[] payload, CancellationToken? cancellationToken, + DownloadCompleteHandler completeHandler) + { + await PostRequestAsync(uri, contentType, payload, cancellationToken, completeHandler, null, null); + } + + public async Task PostRequestAsync(Uri uri, OSDFormat format, OSD payload, CancellationToken? cancellationToken, + DownloadCompleteHandler completeHandler, DownloadProgressHandler progressHandler, ConnectedHandler connectedHandler) { SerializeData(format, payload, out var serialized, out var contentType); using var request = new HttpRequestMessage(HttpMethod.Post, uri); request.Content = new ByteArrayContent(serialized); request.Content.Headers.ContentType = contentType; - await SendRequestAsync(request, completeHandler, progressHandler, cancellationToken); + await SendRequestAsync(request, cancellationToken, completeHandler, progressHandler, connectedHandler); + } + + public async Task PostRequestAsync(Uri uri, OSDFormat format, OSD payload, CancellationToken? cancellationToken, + DownloadCompleteHandler completeHandler) + { + await PostRequestAsync(uri, format, payload, cancellationToken, completeHandler, null, null); } #endregion POST requests #region PUT requests - public async Task PutRequestAsync(Uri uri, string contentType, byte[] payload, - DownloadCompleteHandler completeHandler, DownloadProgressHandler progressHandler, - CancellationToken? cancellationToken) + public async Task PutRequestAsync(Uri uri, string contentType, byte[] payload, CancellationToken? cancellationToken, + DownloadCompleteHandler completeHandler, DownloadProgressHandler progressHandler, ConnectedHandler connectedHandler) { using var request = new HttpRequestMessage(HttpMethod.Put, uri); request.Content = new ByteArrayContent(payload); request.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType); - await SendRequestAsync(request, completeHandler, progressHandler, cancellationToken); + await SendRequestAsync(request, cancellationToken, completeHandler, progressHandler, connectedHandler); } - public async Task PutRequestAsync(Uri uri, OSDFormat format, OSD payload, - DownloadCompleteHandler completeHandler, DownloadProgressHandler progressHandler, - CancellationToken? cancellationToken) + public async Task PutRequestAsync(Uri uri, string contentType, byte[] payload, CancellationToken? cancellationToken, + DownloadCompleteHandler completeHandler) + { + await PutRequestAsync(uri, contentType, payload, cancellationToken, completeHandler, null, null); + } + + public async Task PutRequestAsync(Uri uri, OSDFormat format, OSD payload, CancellationToken? cancellationToken, + DownloadCompleteHandler completeHandler, DownloadProgressHandler progressHandler, ConnectedHandler connectedHandler) { SerializeData(format, payload, out var serialized, out var contentType); using var request = new HttpRequestMessage(HttpMethod.Put, uri); request.Content = new ByteArrayContent(serialized); request.Content.Headers.ContentType = contentType; - await SendRequestAsync(request, completeHandler, progressHandler, cancellationToken); + await SendRequestAsync(request, cancellationToken, completeHandler, progressHandler, connectedHandler); + } + + public async Task PutRequestAsync(Uri uri, OSDFormat format, OSD payload, CancellationToken? cancellationToken, + DownloadCompleteHandler completeHandler) + { + await PutRequestAsync(uri, format, payload, cancellationToken, completeHandler, null, null); } #endregion PUT requests #region PATCH requests - public async Task PatchRequestAsync(Uri uri, string contentType, byte[] payload, - DownloadCompleteHandler completeHandler, DownloadProgressHandler progressHandler, - CancellationToken? cancellationToken) + public async Task PatchRequestAsync(Uri uri, string contentType, byte[] payload, CancellationToken? cancellationToken, + DownloadCompleteHandler completeHandler, DownloadProgressHandler progressHandler, ConnectedHandler connectedHandler) { using var request = new HttpRequestMessage(HttpMethod.Patch, uri); request.Content = new ByteArrayContent(payload); request.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType); - await SendRequestAsync(request, completeHandler, progressHandler, cancellationToken); + await SendRequestAsync(request, cancellationToken, completeHandler, progressHandler, connectedHandler); } - public async Task PatchRequestAsync(Uri uri, OSDFormat format, OSD payload, - DownloadCompleteHandler completeHandler, DownloadProgressHandler progressHandler, - CancellationToken? cancellationToken) + public async Task PatchRequestAsync(Uri uri, string contentType, byte[] payload, CancellationToken? cancellationToken, + DownloadCompleteHandler completeHandler) + { + await PatchRequestAsync(uri, contentType, payload, cancellationToken, completeHandler, null, null); + } + + public async Task PatchRequestAsync(Uri uri, OSDFormat format, OSD payload, CancellationToken? cancellationToken, + DownloadCompleteHandler completeHandler, DownloadProgressHandler progressHandler, ConnectedHandler connectedHandler) { SerializeData(format, payload, out var serialized, out var contentType); using var request = new HttpRequestMessage(HttpMethod.Patch, uri); request.Content = new ByteArrayContent(serialized); request.Content.Headers.ContentType = contentType; - await SendRequestAsync(request, completeHandler, progressHandler, cancellationToken); + await SendRequestAsync(request, cancellationToken, completeHandler, progressHandler, connectedHandler); + } + + public async Task PatchRequestAsync(Uri uri, OSDFormat format, OSD payload, CancellationToken? cancellationToken, + DownloadCompleteHandler completeHandler) + { + await PatchRequestAsync(uri, format, payload, cancellationToken, completeHandler, null, null); } #endregion PATCH requests #region DELETE requests - public async Task DeleteRequestAsync(Uri uri, string contentType, byte[] payload, - DownloadCompleteHandler completeHandler, DownloadProgressHandler progressHandler, - CancellationToken? cancellationToken) + public async Task DeleteRequestAsync(Uri uri, string contentType, byte[] payload, CancellationToken? cancellationToken, + DownloadCompleteHandler completeHandler, DownloadProgressHandler progressHandler, ConnectedHandler connectedHandler) { using var request = new HttpRequestMessage(HttpMethod.Delete, uri); request.Content = new ByteArrayContent(payload); request.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType); - await SendRequestAsync(request, completeHandler, progressHandler, cancellationToken); + await SendRequestAsync(request, cancellationToken, completeHandler, progressHandler, connectedHandler); } - public async Task DeleteRequestAsync(Uri uri, OSDFormat format, OSD payload, - DownloadCompleteHandler completeHandler, DownloadProgressHandler progressHandler, - CancellationToken? cancellationToken) + public async Task DeleteRequestAsync(Uri uri, string contentType, byte[] payload, + CancellationToken? cancellationToken, + DownloadCompleteHandler completeHandler) + { + await DeleteRequestAsync(uri, contentType, payload, cancellationToken, completeHandler, null, null); + } + + public async Task DeleteRequestAsync(Uri uri, OSDFormat format, OSD payload, CancellationToken? cancellationToken, + DownloadCompleteHandler completeHandler, DownloadProgressHandler progressHandler, ConnectedHandler connectedHandler) { SerializeData(format, payload, out var serialized, out var contentType); using var request = new HttpRequestMessage(HttpMethod.Delete, uri); request.Content = new ByteArrayContent(serialized); request.Content.Headers.ContentType = contentType; - await SendRequestAsync(request, completeHandler, progressHandler, cancellationToken); + await SendRequestAsync(request, cancellationToken, completeHandler, progressHandler, connectedHandler); + } + + public async Task DeleteRequestAsync(Uri uri, OSDFormat format, OSD payload, CancellationToken? cancellationToken, + DownloadCompleteHandler completeHandler) + { + await DeleteRequestAsync(uri, format, payload, cancellationToken, completeHandler, null, null); } #endregion DELETE requests /// /// /// /// /// /// /// /// /// /// /// /// - private async Task SendRequestAsync(HttpRequestMessage request, - DownloadCompleteHandler completeHandler, DownloadProgressHandler progressHandler, - CancellationToken? cancellationToken) + private async Task SendRequestAsync(HttpRequestMessage request, CancellationToken? cancellationToken, + DownloadCompleteHandler completeHandler, DownloadProgressHandler progressHandler, ConnectedHandler connectedHandler) { using var response = (cancellationToken.HasValue) ? await SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken.Value) @@ -176,13 +222,13 @@ namespace LibreMetaverse completeHandler?.Invoke(response, null, new HttpRequestException(response.StatusCode + " " + response.ReasonPhrase)); } + connectedHandler?.Invoke(response); - await ProcessResponseAsync(response, completeHandler, progressHandler, cancellationToken); + await ProcessResponseAsync(response, cancellationToken, completeHandler, progressHandler); } - private static async Task ProcessResponseAsync(HttpResponseMessage response, - DownloadCompleteHandler completeHandler, DownloadProgressHandler progressHandler, - CancellationToken? cancellationToken) + private static async Task ProcessResponseAsync(HttpResponseMessage response, CancellationToken? cancellationToken, + DownloadCompleteHandler completeHandler, DownloadProgressHandler progressHandler) { var totalBytes = response.Content.Headers.ContentLength; await using var contentStream = await response.Content.ReadAsStreamAsync(); diff --git a/LibreMetaverse/Caps.cs b/LibreMetaverse/Caps.cs index 6c8bce67..ed3de3c2 100644 --- a/LibreMetaverse/Caps.cs +++ b/LibreMetaverse/Caps.cs @@ -63,7 +63,7 @@ namespace OpenMetaverse internal Uri _SeedCapsURI; internal Dictionary _Caps = new Dictionary(); - private CapsClient _SeedRequest; + private CancellationTokenSource _HttpCts = new CancellationTokenSource(); private EventQueueClient _EventQueueCap = null; /// Capabilities URI this system was initialized with @@ -91,7 +91,7 @@ namespace OpenMetaverse Logger.Log($"Caps system for {Simulator} is {(immediate ? "aborting" : "disconnecting")}", Helpers.LogLevel.Info, Simulator.Client); - _SeedRequest?.Cancel(); + _HttpCts.Cancel(); _EventQueueCap?.Stop(immediate); } @@ -111,6 +111,7 @@ namespace OpenMetaverse /// /// Capability name /// Newly created CapsClient or null of capability does not exist + [Obsolete("CapsClient is obsolete. Use HttpCapsClient instead.")] public CapsClient CreateCapsClient(string capability) { return _Caps.TryGetValue(capability, out var uri) ? new CapsClient(uri, capability) : null; @@ -154,7 +155,7 @@ namespace OpenMetaverse if (Simulator == null || !Simulator.Client.Network.Connected) { return; } // Create a request list - OSDArray req = new OSDArray + OSDArray payload = new OSDArray { "AbuseCategories", "AcceptFriendship", @@ -259,8 +260,8 @@ namespace OpenMetaverse "LibraryAPIv3" }; - Task loginReq = Simulator.Client.HttpCapsClient.PostRequestAsync(_SeedCapsURI, OSDFormat.Xml, req, - SeedRequestCompleteHandler, null, CancellationToken.None); + Task loginReq = Simulator.Client.HttpCapsClient.PostRequestAsync(_SeedCapsURI, OSDFormat.Xml, payload, + _HttpCts.Token, SeedRequestCompleteHandler); } private void SeedRequestCompleteHandler(HttpResponseMessage response, byte[] responseData, Exception error) @@ -291,9 +292,9 @@ namespace OpenMetaverse if (_Caps.ContainsKey("EventQueueGet")) { - Logger.DebugLog("Starting event queue for " + Simulator, Simulator.Client); + Logger.DebugLog($"Starting event queue for {Simulator}", Simulator.Client); - _EventQueueCap = new EventQueueClient(_Caps["EventQueueGet"]); + _EventQueueCap = new EventQueueClient(_Caps["EventQueueGet"], Simulator.Client); _EventQueueCap.OnConnected += EventQueueConnectedHandler; _EventQueueCap.OnEvent += EventQueueEventHandler; _EventQueueCap.Start(); @@ -329,7 +330,7 @@ namespace OpenMetaverse } else { - Logger.Log("No Message handler exists for event " + eventName + ". Unable to decode. Will try Generic Handler next", + Logger.Log($"No Message handler exists for event {eventName}. Unable to decode. Will try Generic Handler next", Helpers.LogLevel.Warning); Logger.Log("Please report this information at https://radegast.life/bugs/issue-entry/: " + Environment.NewLine + body, Helpers.LogLevel.Debug); @@ -347,14 +348,14 @@ namespace OpenMetaverse Packet = packet }; - Logger.DebugLog("Serializing " + packet.Type + " capability with generic handler", + Logger.DebugLog($"Serializing {packet.Type} capability with generic handler", Simulator.Client); Simulator.Client.Network.EnqueueIncoming(incomingPacket); } else { - Logger.Log("No Packet or Message handler exists for " + eventName, + Logger.Log($"No Packet or Message handler exists for {eventName}", Helpers.LogLevel.Warning); } } diff --git a/LibreMetaverse/DownloadManager.cs b/LibreMetaverse/DownloadManager.cs index 52b2ccec..20b35bbd 100644 --- a/LibreMetaverse/DownloadManager.cs +++ b/LibreMetaverse/DownloadManager.cs @@ -136,7 +136,7 @@ namespace OpenMetaverse.Http Logger.DebugLog($"Requesting {item.Address}"); activeDownload.cancellationToken = new CancellationTokenSource(); - _ = Client.HttpCapsClient.GetRequestAsync(item.Address, + _ = Client.HttpCapsClient.GetRequestAsync(item.Address, activeDownload.cancellationToken.Token, (response, responseData, error) => { activeDownloads.TryRemove(addr, out activeDownload); @@ -162,7 +162,7 @@ namespace OpenMetaverse.Http { handler(totalBytes, totalReceived, progressPercent); } - }, activeDownload.cancellationToken.Token); + }, null); activeDownloads[addr] = activeDownload; } } diff --git a/LibreMetaverse/FriendsManager.cs b/LibreMetaverse/FriendsManager.cs index 8e1f5f01..f9ddfd9e 100644 --- a/LibreMetaverse/FriendsManager.cs +++ b/LibreMetaverse/FriendsManager.cs @@ -529,7 +529,7 @@ namespace OpenMetaverse }; acceptFriendshipCap = builder.Uri; - _ = Client.HttpCapsClient.PostRequestAsync(acceptFriendshipCap, OSDFormat.Xml, new OSD(), + _ = Client.HttpCapsClient.PostRequestAsync(acceptFriendshipCap, OSDFormat.Xml, new OSD(), CancellationToken.None, (response, data, error) => { if (error != null) @@ -553,7 +553,7 @@ namespace OpenMetaverse } Client.Avatars.RequestAvatarName(fromAgentID); } - }, null, CancellationToken.None); + }); } /// @@ -603,7 +603,7 @@ namespace OpenMetaverse }; declineFriendshipCap = builder.Uri; - _ = Client.HttpCapsClient.DeleteRequestAsync(declineFriendshipCap, OSDFormat.Xml, new OSD(), + _ = Client.HttpCapsClient.DeleteRequestAsync(declineFriendshipCap, OSDFormat.Xml, new OSD(), CancellationToken.None, (response, data, error) => { if (error != null) @@ -621,7 +621,7 @@ namespace OpenMetaverse FriendRequests.Remove(fromAgentID); } } - }, null, CancellationToken.None); + }); } /// diff --git a/LibreMetaverse/GridManager.cs b/LibreMetaverse/GridManager.cs index 0f0b2ec0..42a274a8 100644 --- a/LibreMetaverse/GridManager.cs +++ b/LibreMetaverse/GridManager.cs @@ -31,6 +31,7 @@ using System.Threading; using OpenMetaverse.StructuredData; using OpenMetaverse.Packets; using System.Net.Http; +using System.Threading.Tasks; namespace OpenMetaverse { @@ -418,7 +419,7 @@ namespace OpenMetaverse } /// - /// + /// Request a map layer /// /// public void RequestMapLayer(GridLayerType layer) @@ -426,9 +427,9 @@ namespace OpenMetaverse Uri cap = Client.Network.CurrentSim.Caps.CapabilityURI("MapLayer"); if (cap != null) { - OSDMap body = new OSDMap {["Flags"] = OSD.FromInteger((int) layer)}; - _ = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, body, MapLayerResponseHandler, - null, CancellationToken.None); + OSDMap payload = new OSDMap {["Flags"] = OSD.FromInteger((int) layer)}; + Task req = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, payload, + CancellationToken.None, MapLayerResponseHandler); } } diff --git a/LibreMetaverse/GroupManager.cs b/LibreMetaverse/GroupManager.cs index 84c8cf3d..8ef83dd2 100644 --- a/LibreMetaverse/GroupManager.cs +++ b/LibreMetaverse/GroupManager.cs @@ -28,6 +28,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading; +using System.Threading.Tasks; using OpenMetaverse.Packets; using OpenMetaverse.StructuredData; using OpenMetaverse.Messages.Linden; @@ -1050,14 +1051,15 @@ namespace OpenMetaverse && Client.Network.CurrentSim.Caps != null && (cap = Client.Network.CurrentSim.Caps.CapabilityURI("GroupMemberData")) != null) { - OSDMap requestData = new OSDMap(1) { ["group_id"] = @group }; - _ = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, requestData, (response, data, error) => + OSDMap payload = new OSDMap(1) { ["group_id"] = @group }; + Task req = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, payload, CancellationToken.None, + (response, data, error) => { if (error != null) { return; } OSD result = OSDParser.Deserialize(data); GroupMembersHandlerCaps(requestID, result); - }, null, CancellationToken.None); + }); } else { @@ -1662,7 +1664,7 @@ namespace OpenMetaverse if (uri == null) { return; } Uri cap = Client.Network.CurrentSim.Caps.CapabilityURI("GroupReqBanned"); - _ = Client.HttpCapsClient.GetRequestAsync(cap, (response, data, error) => + _ = Client.HttpCapsClient.GetRequestAsync(cap, CancellationToken.None, (response, data, error) => { try { @@ -1698,7 +1700,7 @@ namespace OpenMetaverse catch { } } } - }, null, CancellationToken.None); + }); } /// @@ -1735,7 +1737,8 @@ namespace OpenMetaverse } payload["ban_ids"] = banIDs; - _ = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, payload, (response, data, error) => + Task req = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, payload, CancellationToken.None, + (response, data, error) => { if (error != null) { return; } if (callback != null) @@ -1743,7 +1746,7 @@ namespace OpenMetaverse try { callback(this, EventArgs.Empty); } catch { } } - }, null, CancellationToken.None); + }); } #endregion diff --git a/LibreMetaverse/ImportExport/ModelUploader.cs b/LibreMetaverse/ImportExport/ModelUploader.cs index 51a33c75..a487448f 100644 --- a/LibreMetaverse/ImportExport/ModelUploader.cs +++ b/LibreMetaverse/ImportExport/ModelUploader.cs @@ -27,6 +27,7 @@ using System; using System.Collections.Generic; using System.Threading; +using System.Threading.Tasks; using OpenMetaverse.Assets; using OpenMetaverse.StructuredData; using OpenMetaverse.Http; @@ -221,7 +222,7 @@ namespace OpenMetaverse.ImportExport Images = new List(); ImgIndex = new Dictionary(); - OSDMap req = new OSDMap + OSDMap payload = new OSDMap { ["name"] = InvName, ["description"] = InvDescription, @@ -235,7 +236,8 @@ namespace OpenMetaverse.ImportExport ["next_owner_mask"] = (int) PermissionMask.All }; - _ = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, req, (response, data, error) => + Task req = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, payload, CancellationToken.None, + (response, data, error) => { if (error != null) { @@ -265,9 +267,7 @@ namespace OpenMetaverse.ImportExport callback?.Invoke(null); return; } - - - }, null, CancellationToken.None); + }); } /// @@ -279,8 +279,8 @@ namespace OpenMetaverse.ImportExport { Uri cap = Client.Network.CurrentSim.Caps.CapabilityURI("MeshUploader"); - _ = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, AssetResources(true), - (response, data, error) => + _ = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, AssetResources(true), + CancellationToken.None, (response, data, error) => { if (error != null) { @@ -305,7 +305,7 @@ namespace OpenMetaverse.ImportExport callback?.Invoke(null); return; } - }, null, CancellationToken.None); + }); } } } \ No newline at end of file diff --git a/LibreMetaverse/Login.cs b/LibreMetaverse/Login.cs index 1c8183f8..dd65e1db 100644 --- a/LibreMetaverse/Login.cs +++ b/LibreMetaverse/Login.cs @@ -1434,8 +1434,8 @@ namespace OpenMetaverse UpdateLoginStatus(LoginStatus.ConnectingToLogin, $"Logging in as {loginParams.FirstName} {loginParams.LastName}..."); - Task loginReq = Client.HttpCapsClient.PostRequestAsync(loginUri, OSDFormat.Xml, loginLLSD, - LoginReplyLLSDHandler, null, CancellationToken.None); + Task loginReq = Client.HttpCapsClient.PostRequestAsync(loginUri, OSDFormat.Xml, loginLLSD, + CancellationToken.None, LoginReplyLLSDHandler); #endregion } diff --git a/LibreMetaverse/ObjectManager.cs b/LibreMetaverse/ObjectManager.cs index b4603da4..b797fd22 100644 --- a/LibreMetaverse/ObjectManager.cs +++ b/LibreMetaverse/ObjectManager.cs @@ -28,6 +28,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading; +using System.Threading.Tasks; using OpenMetaverse.Packets; using OpenMetaverse.Http; using OpenMetaverse.StructuredData; @@ -1688,18 +1689,19 @@ namespace OpenMetaverse return; } - ObjectMediaNavigateMessage req = new ObjectMediaNavigateMessage + ObjectMediaNavigateMessage payload = new ObjectMediaNavigateMessage { PrimID = primID, URL = newURL, Face = face }; - _ = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, req.Serialize(), (response, data, error) => + Task req = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, payload.Serialize(), + CancellationToken.None, (response, data, error) => { if (error != null) { Logger.Log($"ObjectMediaNavigate: {error.Message}", Helpers.LogLevel.Error, Client, error); } - }, null, CancellationToken.None); + }); } /// @@ -1718,15 +1720,16 @@ namespace OpenMetaverse return; } - ObjectMediaUpdate req = new ObjectMediaUpdate {PrimID = primID, FaceMedia = faceMedia, Verb = "UPDATE"}; + ObjectMediaUpdate payload = new ObjectMediaUpdate {PrimID = primID, FaceMedia = faceMedia, Verb = "UPDATE"}; - _ = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, req.Serialize(), (response, data, error) => + Task req = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, payload.Serialize(), + CancellationToken.None, (response, data, error) => { if (error != null) { Logger.Log($"ObjectMediaUpdate: {error.Message}", Helpers.LogLevel.Error, Client, error); } - }, null, CancellationToken.None); + }); } @@ -1741,10 +1744,10 @@ namespace OpenMetaverse Uri cap; if (sim.Caps != null && (cap = Client.Network.CurrentSim.Caps.CapabilityURI("ObjectMedia")) != null) { - ObjectMediaRequest req = new ObjectMediaRequest {PrimID = primID, Verb = "GET"}; + ObjectMediaRequest payload = new ObjectMediaRequest {PrimID = primID, Verb = "GET"}; - _ = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, req.Serialize(), - (httpResponse, data, error) => + Task req = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, payload.Serialize(), + CancellationToken.None, (httpResponse, data, error) => { if (error != null) { @@ -1778,7 +1781,7 @@ namespace OpenMetaverse try { callback(false, string.Empty, null); } catch (Exception ex) { Logger.Log(ex.Message, Helpers.LogLevel.Error, Client); } } - }, null, CancellationToken.None); + }); } else { diff --git a/LibreMetaverse/ParcelManager.cs b/LibreMetaverse/ParcelManager.cs index 9977c7f9..75eafdc6 100644 --- a/LibreMetaverse/ParcelManager.cs +++ b/LibreMetaverse/ParcelManager.cs @@ -30,12 +30,12 @@ using System.Threading; using System.Reflection; using System.Collections.Generic; using System.Linq; -using OpenMetaverse.Http; using OpenMetaverse.Packets; using OpenMetaverse.Interfaces; using OpenMetaverse.StructuredData; using OpenMetaverse.Messages.Linden; using System.Threading.Tasks; +using LibreMetaverse; namespace OpenMetaverse { @@ -618,7 +618,7 @@ namespace OpenMetaverse Uri cap = simulator.Caps.CapabilityURI("ParcelPropertiesUpdate"); if (cap != null) { - ParcelPropertiesUpdateMessage req = new ParcelPropertiesUpdateMessage + ParcelPropertiesUpdateMessage payload = new ParcelPropertiesUpdateMessage { AuthBuyerID = AuthBuyerID, Category = Category, @@ -649,10 +649,9 @@ namespace OpenMetaverse AnyAVSounds = AnyAVSounds, GroupAVSounds = GroupAVSounds }; - OSDMap body = req.Serialize(); - _ = client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, req.Serialize(), - null, null, CancellationToken.None); + Task req = client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, payload.Serialize(), + CancellationToken.None, null); } else // lludp fallback { @@ -1677,9 +1676,8 @@ namespace OpenMetaverse try { OSD res = null; - await Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, msg.Serialize(), - (response, data, error) => res = OSDParser.Deserialize(data), - null, CancellationToken.None); + await Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, msg.Serialize(), CancellationToken.None, + (response, data, error) => res = OSDParser.Deserialize(data)); if (res is OSDMap result) { @@ -1711,7 +1709,7 @@ namespace OpenMetaverse LandResourcesRequest req = new LandResourcesRequest { ParcelID = parcelID }; Uri cap = Client.Network.CurrentSim.Caps.CapabilityURI("LandResources"); Task httpReq = Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, req.Serialize(), - (httpResponse, data, error) => + CancellationToken.None, (httpResponse, data, error) => { try { @@ -1727,8 +1725,8 @@ namespace OpenMetaverse OSD summaryResponse = null; AsyncHelper.Sync(() => Client.HttpCapsClient.GetRequestAsync( Client.Network.CurrentSim.Caps.CapabilityURI("ScriptResourceSummary"), - (response, data, err) => summaryResponse = OSDParser.Deserialize(data), - null, CancellationToken.None)); + CancellationToken.None, + (response, data, err) => summaryResponse = OSDParser.Deserialize(data))); LandResourcesInfo resInfo = new LandResourcesInfo(); resInfo.Deserialize((OSDMap)summaryResponse); @@ -1738,8 +1736,8 @@ namespace OpenMetaverse OSD detailResponse = null; AsyncHelper.Sync(() => Client.HttpCapsClient.GetRequestAsync( Client.Network.CurrentSim.Caps.CapabilityURI("ScriptResourceDetails"), - (response, data, err) => detailResponse = OSDParser.Deserialize(data), - null, CancellationToken.None)); + CancellationToken.None, + (response, data, err) => detailResponse = OSDParser.Deserialize(data))); resInfo.Deserialize((OSDMap)detailResponse); } @@ -1751,7 +1749,7 @@ namespace OpenMetaverse Logger.Log("Failed fetching land resources", Helpers.LogLevel.Error, Client, ex); callback(false, null); } - }, null, CancellationToken.None); + }); } catch (Exception ex) { diff --git a/LibreMetaverse/UserReport.cs b/LibreMetaverse/UserReport.cs index bb67d531..1de927a5 100644 --- a/LibreMetaverse/UserReport.cs +++ b/LibreMetaverse/UserReport.cs @@ -92,7 +92,7 @@ namespace LibreMetaverse abuseCategoriesCap = builder.Uri; } - await Client.HttpCapsClient.GetRequestAsync(abuseCategoriesCap, + await Client.HttpCapsClient.GetRequestAsync(abuseCategoriesCap, CancellationToken.None, (response, data, error) => { if (error != null) @@ -112,7 +112,7 @@ namespace LibreMetaverse row => row["category"].AsString()); } } - }, null, CancellationToken.None); + }); return reportCategories; } @@ -156,7 +156,7 @@ namespace LibreMetaverse : Client.Network.CurrentSim.Caps.CapabilityURI("SendUserReport"); if (userReportCap != null) { - _ = Client.HttpCapsClient.PostRequestAsync(userReportCap, OSDFormat.Xml, report, + _ = Client.HttpCapsClient.PostRequestAsync(userReportCap, OSDFormat.Xml, report, CancellationToken.None, (response, data, error) => { if (error != null) @@ -167,7 +167,7 @@ namespace LibreMetaverse SendUserReportLegacy(reportType, category, screenshotId, objectId, abuserId, abuseRegionName, abuseRegionId, pos, summary, details); } - }, null, CancellationToken.None); + }); } else {