diff --git a/CHANGELOG.md b/CHANGELOG.md index 68d69e6..57fd1f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [2.6.3] - 2025-11-22 + +### Fixed +- Fixed **ArgumentNullException** when calling `Abort()` or accessing properties on completed requests ([#103](https://github.com/proyecto26/RestClient/issues/103)). +- Enhanced disposal detection for UnityWebRequest objects to prevent crashes during cleanup scenarios. +- Added proper exception handling for all RequestHelper properties that access disposed UnityWebRequest instances. +- Improved thread safety for request cancellation in Unity's OnDestroy patterns. + ## [2.6.2] - 2021-12-26 ### Added diff --git a/src/Proyecto26.RestClient/Helpers/RequestHelperExtension.cs b/src/Proyecto26.RestClient/Helpers/RequestHelperExtension.cs index 7017a74..fadc6c3 100644 --- a/src/Proyecto26.RestClient/Helpers/RequestHelperExtension.cs +++ b/src/Proyecto26.RestClient/Helpers/RequestHelperExtension.cs @@ -20,7 +20,15 @@ public float UploadProgress float progress = 0; if (this.Request != null) { - progress = this.Request.uploadProgress; + try + { + progress = this.Request.uploadProgress; + } + catch (ArgumentNullException) + { + // Request was disposed - return 0 progress + progress = 0; + } } return progress; } @@ -36,7 +44,15 @@ public ulong UploadedBytes ulong bytes = 0; if (this.Request != null) { - bytes = this.Request.uploadedBytes; + try + { + bytes = this.Request.uploadedBytes; + } + catch (ArgumentNullException) + { + // Request was disposed - return 0 bytes + bytes = 0; + } } return bytes; } @@ -52,7 +68,15 @@ public float DownloadProgress float progress = 0; if (this.Request != null) { - progress = this.Request.downloadProgress; + try + { + progress = this.Request.downloadProgress; + } + catch (ArgumentNullException) + { + // Request was disposed - return 0 progress + progress = 0; + } } return progress; } @@ -68,7 +92,15 @@ public ulong DownloadedBytes ulong bytes = 0; if (this.Request != null) { - bytes = this.Request.downloadedBytes; + try + { + bytes = this.Request.downloadedBytes; + } + catch (ArgumentNullException) + { + // Request was disposed - return 0 bytes + bytes = 0; + } } return bytes; } @@ -81,10 +113,18 @@ public ulong DownloadedBytes /// The name of the header. public string GetHeader(string name) { - string headerValue; + string headerValue = null; if (this.Request != null) { - headerValue = this.Request.GetRequestHeader(name); + try + { + headerValue = this.Request.GetRequestHeader(name); + } + catch (ArgumentNullException) + { + // Request was disposed - fall back to headers dictionary + this.Headers.TryGetValue(name, out headerValue); + } } else { @@ -131,6 +171,12 @@ public void Abort() this.Request.Abort(); } } + catch (ArgumentNullException) + { + // Request was already disposed by UnityWebRequest's using block - this is expected behavior + // No need to log this as it's a normal part of the request lifecycle + HttpBase.DebugLog(this.EnableDebug, "Request was already disposed; abort skipped.", true); + } catch (Exception error) { HttpBase.DebugLog(this.EnableDebug, error.Message, true); } diff --git a/src/Proyecto26.RestClient/Proyecto26.RestClient.csproj b/src/Proyecto26.RestClient/Proyecto26.RestClient.csproj index 9c255c1..edecf9f 100644 --- a/src/Proyecto26.RestClient/Proyecto26.RestClient.csproj +++ b/src/Proyecto26.RestClient/Proyecto26.RestClient.csproj @@ -9,7 +9,7 @@ Proyecto26.RestClient v3.5 Proyecto26.RestClient - 2.6.2 + 2.6.3 jdnichollsc https://github.com/proyecto26/RestClient/blob/master/img/icono.png?raw=true https://github.com/proyecto26/RestClient/blob/master/LICENSE diff --git a/src/Proyecto26.RestClient/RestClient.cs b/src/Proyecto26.RestClient/RestClient.cs index 82b0da5..2fbdd04 100644 --- a/src/Proyecto26.RestClient/RestClient.cs +++ b/src/Proyecto26.RestClient/RestClient.cs @@ -23,7 +23,7 @@ public static System.Version Version get { if (_version == null) { - _version = new System.Version("2.6.2"); + _version = new System.Version("2.6.3"); } return _version; } diff --git a/src/Proyecto26.RestClient/package.json b/src/Proyecto26.RestClient/package.json index 29f6577..e71dc6f 100644 --- a/src/Proyecto26.RestClient/package.json +++ b/src/Proyecto26.RestClient/package.json @@ -1,6 +1,6 @@ { "name": "com.proyecto26.restclient", - "version": "2.6.2", + "version": "2.6.3", "displayName": "RestClient for Unity", "description": "Simple HTTP and REST client for Unity based on Promises, also support Callbacks!", "unity": "2017.1",