From abc791a051d721ea7ff3370ce3fe53d3a4b37b03 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 9 Jul 2026 18:48:28 +0200 Subject: [PATCH 01/16] [Foundation] Implement NSUrlSessionHandler proxy support The Proxy setter previously threw PlatformNotSupportedException, and UseProxy/SupportsProxy didn't allow any custom proxy configuration. Implement custom proxy support: * Proxy is now a real IWebProxy property. Since NSUrlSession applies proxy settings per-session (not per-request), the proxy returned by IWebProxy.GetProxy for the first request is translated into the session's ConnectionProxyDictionary and the session is recreated before the first request is sent (mirroring the UseCookies pattern). * UseProxy is now a real settable bool. Setting it to false applies an empty connection proxy dictionary, which overrides any proxy configured in the OS. * SupportsProxy now returns true. * Proxy authentication is wired up: DefaultProxyCredentials is a real property, and proxy authentication challenges (IsProxy protection spaces) use Proxy.Credentials ?? DefaultProxyCredentials. Added an in-process HTTP forwarding proxy test server and tests covering proxy routing, proxy authentication (via Proxy.Credentials and DefaultProxyCredentials) and the proxy-related property behavior. Fixes #14632 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- src/Foundation/NSUrlSessionHandler.cs | 160 ++++++++-- .../NSUrlSessionHandlerTest.cs | 108 +++++++ .../System.Net.Http/ProxyTestServer.cs | 285 ++++++++++++++++++ 3 files changed, 524 insertions(+), 29 deletions(-) create mode 100644 tests/monotouch-test/System.Net.Http/ProxyTestServer.cs diff --git a/src/Foundation/NSUrlSessionHandler.cs b/src/Foundation/NSUrlSessionHandler.cs index 2db105e4eb85..e5dd08863240 100644 --- a/src/Foundation/NSUrlSessionHandler.cs +++ b/src/Foundation/NSUrlSessionHandler.cs @@ -449,6 +449,74 @@ async Task CreateRequest (HttpRequestMessage request) return nsrequest; } + readonly object proxyConfigurationLock = new object (); + bool proxyConfigured; + + // NSUrlSession applies proxy settings per-session (via the configuration's connection proxy dictionary), + // not per-request, so we compute the proxy configuration once (using the first request's destination) and + // recreate the session with it before the first request is sent. + void ConfigureSessionProxy (HttpRequestMessage request) + { + lock (proxyConfigurationLock) { + if (proxyConfigured) + return; + proxyConfigured = true; + + if (!TryGetProxyDictionary (request.RequestUri, out var proxyDictionary)) + return; + + var oldSession = session; + var configuration = session.Configuration; + configuration.ConnectionProxyDictionary = proxyDictionary; + session = NSUrlSession.FromConfiguration (configuration, (INSUrlSessionDelegate) new NSUrlSessionHandlerDelegate (this), null); + oldSession.Dispose (); + } + } + + // Computes the connection proxy dictionary to apply to the session. + // Returns false (and a null dictionary) when the session's default proxy behavior (use the OS-configured proxies) should be used. + bool TryGetProxyDictionary (Uri? destination, out NSDictionary? proxyDictionary) + { + proxyDictionary = null; + + // The developer explicitly asked us to not use any proxy: apply an empty dictionary to + // override any proxy configured in the OS. + if (!useProxy) { + proxyDictionary = new NSDictionary (); + return true; + } + + // No custom proxy: let NSUrlSession use the OS-configured proxies (the default behavior). + if (proxy is null || destination is null) + return false; + + // The proxy says this destination should not be proxied: override any OS-configured proxy. + if (proxy.IsBypassed (destination)) { + proxyDictionary = new NSDictionary (); + return true; + } + + var proxyUri = proxy.GetProxy (destination); + // A null proxy uri (or one that points back at the destination) means "no proxy for this destination". + if (proxyUri is null || proxyUri == destination) { + proxyDictionary = new NSDictionary (); + return true; + } + + var strongProxy = new ProxyConfigurationDictionary { + HttpEnable = true, + HttpProxyHost = proxyUri.Host, + HttpProxyPort = proxyUri.Port, + HttpsProxyHost = proxyUri.Host, + HttpsProxyPort = proxyUri.Port, +#if MONOMAC + HttpsEnable = true, +#endif + }; + proxyDictionary = strongProxy.GetDictionary (); + return true; + } + /// To be added. /// To be added. /// To be added. @@ -456,6 +524,8 @@ async Task CreateRequest (HttpRequestMessage request) /// To be added. protected override async Task SendAsync (HttpRequestMessage request, CancellationToken cancellationToken) { + ConfigureSessionProxy (request); + Volatile.Write (ref sentRequest, true); var nsrequest = await CreateRequest (request).ConfigureAwait (false); @@ -558,14 +628,20 @@ public X509CertificateCollection ClientCertificates { public ClientCertificateOption ClientCertificateOptions { get; set; } - // We're ignoring this property, just like Xamarin.Android does: - // https://github.com/xamarin/xamarin-android/blob/09e8cb5c07ea6c39383185a3f90e53186749b802/src/Mono.Android/Xamarin.Android.Net/AndroidMessageHandler.cs#L152 - [UnsupportedOSPlatform ("ios")] - [UnsupportedOSPlatform ("maccatalyst")] - [UnsupportedOSPlatform ("tvos")] - [UnsupportedOSPlatform ("macos")] - [EditorBrowsable (EditorBrowsableState.Never)] - public ICredentials? DefaultProxyCredentials { get; set; } + ICredentials? defaultProxyCredentials; + + /// The credentials to submit to the proxy server for authentication. + /// The credentials to use to authenticate with the proxy, or to not provide any proxy credentials. + /// These credentials are only used when the proxy itself () doesn't provide its own credentials. + public ICredentials? DefaultProxyCredentials { + get { + return defaultProxyCredentials; + } + set { + EnsureModifiability (); + defaultProxyCredentials = value; + } + } public int MaxAutomaticRedirections { get => int.MaxValue; @@ -614,18 +690,21 @@ public bool PreAuthenticate { [EditorBrowsable (EditorBrowsableState.Never)] public IDictionary? Properties { get { return null; } } - // We dont support any custom proxies, and don't let anybody wonder why their proxy isn't - // being used if they try to assign one (in any case we also return false from 'SupportsProxy'). - [UnsupportedOSPlatform ("ios")] - [UnsupportedOSPlatform ("maccatalyst")] - [UnsupportedOSPlatform ("tvos")] - [UnsupportedOSPlatform ("macos")] - [EditorBrowsable (EditorBrowsableState.Never)] + IWebProxy? proxy; + + /// The proxy to use for requests. + /// The custom proxy to use, or to use the proxies configured in the operating system. + /// + /// Setting this property only has an effect if is (which is the default value). + /// NSUrlSession applies proxy settings per-session, not per-request, so the proxy returned by for the first request is applied to every request made by this handler. + /// public IWebProxy? Proxy { - get => null; + get { + return proxy; + } set { - if (value is not null) - throw new PlatformNotSupportedException (); + EnsureModifiability (); + proxy = value; } } @@ -743,9 +822,10 @@ public bool SupportsAutomaticDecompression { get => true; } - // We don't support using custom proxies, but NSUrlSession will automatically use any proxies configured in the OS. + // We support custom proxies (applied per-session via the connection proxy dictionary), and + // NSUrlSession will also automatically use any proxies configured in the OS. public bool SupportsProxy { - get => false; + get => true; } // We support the AllowAutoRedirect property, but we don't support changing the MaxAutomaticRedirections value, @@ -754,13 +834,15 @@ public bool SupportsRedirectConfiguration { get => false; } - // NSUrlSession will automatically use any proxies configured in the OS (so always return true in the getter). - // There doesn't seem to be a way to turn this off, so throw if someone attempts to disable this. + bool useProxy = true; + + // When true (the default), NSUrlSession uses either the custom 'Proxy' (if set) or the proxies configured in the OS. + // When false, no proxy is used (this overrides any proxy configured in the OS). public bool UseProxy { - get => true; + get => useProxy; set { - if (!value) - ObjCRuntime.ThrowHelper.ThrowArgumentOutOfRangeException (nameof (value), value, "It's not possible to disable the use of system proxies."); ; + EnsureModifiability (); + useProxy = value; } } @@ -1175,7 +1257,15 @@ void DidReceiveChallengeImpl (NSUrlSession session, NSUrlSessionTask task, NSUrl } } - if (sessionHandler.Credentials is not null && TryGetAuthenticationType (challenge.ProtectionSpace, out var authType)) { + // Proxy authentication challenges use the proxy credentials (either the proxy's own credentials or + // the DefaultProxyCredentials), and look up credentials using the proxy's URI. Server authentication + // challenges use the regular Credentials and look up credentials using the request's URI. + var isProxyChallenge = challenge.ProtectionSpace.IsProxy; + var challengeCredentials = isProxyChallenge + ? (sessionHandler.Proxy?.Credentials ?? sessionHandler.DefaultProxyCredentials) + : sessionHandler.Credentials; + + if (challengeCredentials is not null && TryGetAuthenticationType (challenge.ProtectionSpace, out var authType)) { NetworkCredential? credentialsToUse = null; if (authType != RejectProtectionSpaceAuthType) { // interesting situation, when we use a credential that we created that is empty, we are not getting the RejectProtectionSpaceAuthType, @@ -1195,9 +1285,14 @@ void DidReceiveChallengeImpl (NSUrlSession session, NSUrlSessionTask task, NSUrl var nsurlRespose = challenge.FailureResponse as NSHttpUrlResponse; var responseIsUnauthorized = (nsurlRespose is null) ? false : nsurlRespose.StatusCode == (int) HttpStatusCode.Unauthorized && challenge.PreviousFailureCount > 0; if (!responseIsUnauthorized) { - var uri = GetCredentialLookupUri (task, inflight); - if (ShouldLookupCredentials (sessionHandler.Credentials, inflight)) - credentialsToUse = sessionHandler.Credentials.GetCredential (uri, authType); + if (isProxyChallenge) { + var uri = GetProxyLookupUri (challenge.ProtectionSpace); + credentialsToUse = challengeCredentials.GetCredential (uri, authType); + } else { + var uri = GetCredentialLookupUri (task, inflight); + if (ShouldLookupCredentials (challengeCredentials, inflight)) + credentialsToUse = challengeCredentials.GetCredential (uri, authType); + } } } @@ -1214,6 +1309,13 @@ void DidReceiveChallengeImpl (NSUrlSession session, NSUrlSessionTask task, NSUrl } } + static Uri GetProxyLookupUri (NSUrlProtectionSpace protectionSpace) + { + var scheme = protectionSpace.ReceivesCredentialSecurely ? "https" : "http"; + var builder = new UriBuilder (scheme, protectionSpace.Host, (int) protectionSpace.Port); + return builder.Uri; + } + static Uri GetCredentialLookupUri (NSUrlSessionTask task, InflightData inflight) { var currentRequestUrl = task.CurrentRequest?.Url?.AbsoluteString; diff --git a/tests/monotouch-test/System.Net.Http/NSUrlSessionHandlerTest.cs b/tests/monotouch-test/System.Net.Http/NSUrlSessionHandlerTest.cs index 23ccf987229b..8a3141b28f63 100644 --- a/tests/monotouch-test/System.Net.Http/NSUrlSessionHandlerTest.cs +++ b/tests/monotouch-test/System.Net.Http/NSUrlSessionHandlerTest.cs @@ -399,6 +399,114 @@ public void StreamReadAsyncCallerCancellationThrowsOperationCanceledException () } } + [Test] + public void ProxyRoutesRequestsThroughProxy () + { + using var proxy = new ProxyTestServer (); + + HttpStatusCode? statusCode = null; + bool viaProxy = false; + + var done = TestRuntime.TryRunAsync (TimeSpan.FromSeconds (30), async () => { + using var handler = new NSUrlSessionHandler (); + handler.Proxy = new WebProxy (proxy.Url); + Assert.That (handler.UseProxy, Is.True, "UseProxy default"); + Assert.That (handler.SupportsProxy, Is.True, "SupportsProxy"); + using var client = new HttpClient (handler); + var response = await client.GetAsync (NetworkResources.Httpbin.GetUrl).ConfigureAwait (false); + statusCode = response.StatusCode; + viaProxy = response.Headers.Contains ("Via-Test-Proxy"); + }, out var ex); + + if (!done) { + TestRuntime.IgnoreInCI ("Transient localhost server failure - ignore in CI"); + Assert.Inconclusive ("Request timed out."); + } + TestRuntime.IgnoreInCIIfBadNetwork (ex); + Assert.That (ex, Is.Null, $"Exception: {ex}"); + Assert.That (statusCode, Is.EqualTo (HttpStatusCode.OK), "Status code"); + Assert.That (viaProxy, Is.True, "Response should have gone through the test proxy"); + Assert.That (proxy.AuthenticatedRequestCount, Is.GreaterThan (0), "Proxy should have forwarded at least one request"); + } + + [Test] + public void ProxyWithCredentialsAuthenticatesWithProxy () + { + const string proxyUser = "proxyuser"; + const string proxyPass = "proxypass"; + using var proxy = new ProxyTestServer (proxyUser, proxyPass); + + HttpStatusCode? statusCode = null; + + var done = TestRuntime.TryRunAsync (TimeSpan.FromSeconds (30), async () => { + using var handler = new NSUrlSessionHandler (); + handler.Proxy = new WebProxy (proxy.Url) { + Credentials = new NetworkCredential (proxyUser, proxyPass), + }; + using var client = new HttpClient (handler); + var response = await client.GetAsync (NetworkResources.Httpbin.GetUrl).ConfigureAwait (false); + statusCode = response.StatusCode; + }, out var ex); + + if (!done) { + TestRuntime.IgnoreInCI ("Transient localhost server failure - ignore in CI"); + Assert.Inconclusive ("Request timed out."); + } + TestRuntime.IgnoreInCIIfBadNetwork (ex); + Assert.That (ex, Is.Null, $"Exception: {ex}"); + Assert.That (statusCode, Is.EqualTo (HttpStatusCode.OK), "Status code (proxy credentials should have been used)"); + Assert.That (proxy.AuthenticatedRequestCount, Is.GreaterThan (0), "Proxy should have forwarded an authenticated request"); + } + + [Test] + public void ProxyWithDefaultProxyCredentialsAuthenticatesWithProxy () + { + const string proxyUser = "proxyuser"; + const string proxyPass = "proxypass"; + using var proxy = new ProxyTestServer (proxyUser, proxyPass); + + HttpStatusCode? statusCode = null; + + var done = TestRuntime.TryRunAsync (TimeSpan.FromSeconds (30), async () => { + using var handler = new NSUrlSessionHandler (); + handler.Proxy = new WebProxy (proxy.Url); + handler.DefaultProxyCredentials = new NetworkCredential (proxyUser, proxyPass); + using var client = new HttpClient (handler); + var response = await client.GetAsync (NetworkResources.Httpbin.GetUrl).ConfigureAwait (false); + statusCode = response.StatusCode; + }, out var ex); + + if (!done) { + TestRuntime.IgnoreInCI ("Transient localhost server failure - ignore in CI"); + Assert.Inconclusive ("Request timed out."); + } + TestRuntime.IgnoreInCIIfBadNetwork (ex); + Assert.That (ex, Is.Null, $"Exception: {ex}"); + Assert.That (statusCode, Is.EqualTo (HttpStatusCode.OK), "Status code (default proxy credentials should have been used)"); + Assert.That (proxy.AuthenticatedRequestCount, Is.GreaterThan (0), "Proxy should have forwarded an authenticated request"); + } + + [Test] + public void ProxyPropertiesBehaveCorrectly () + { + using var handler = new NSUrlSessionHandler (); + Assert.That (handler.Proxy, Is.Null, "Proxy default"); + Assert.That (handler.UseProxy, Is.True, "UseProxy default"); + Assert.That (handler.SupportsProxy, Is.True, "SupportsProxy"); + Assert.That (handler.DefaultProxyCredentials, Is.Null, "DefaultProxyCredentials default"); + + var proxy = new WebProxy ("http://127.0.0.1:8888"); + handler.Proxy = proxy; + Assert.That (handler.Proxy, Is.SameAs (proxy), "Proxy set"); + + handler.UseProxy = false; + Assert.That (handler.UseProxy, Is.False, "UseProxy set to false"); + + var credentials = new NetworkCredential ("user", "pass"); + handler.DefaultProxyCredentials = credentials; + Assert.That (handler.DefaultProxyCredentials, Is.SameAs (credentials), "DefaultProxyCredentials set"); + } + static HttpListener? StartListenerOnAvailablePort (out int listeningPort) { // IANA suggested range for dynamic or private ports diff --git a/tests/monotouch-test/System.Net.Http/ProxyTestServer.cs b/tests/monotouch-test/System.Net.Http/ProxyTestServer.cs new file mode 100644 index 000000000000..0e4aa07459c0 --- /dev/null +++ b/tests/monotouch-test/System.Net.Http/ProxyTestServer.cs @@ -0,0 +1,285 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +// +// An in-process HTTP forwarding proxy used to test NSUrlSessionHandler's proxy support. +// +// It only handles absolute-form HTTP requests (the form a client sends to an HTTP proxy), +// which is enough to test proxying of the in-process HTTP test server (HttpbinTestServer). +// HTTPS (CONNECT tunneling) is intentionally not supported. +// + +using System; +using System.Collections.Generic; +using System.Net; +using System.Net.Http; +using System.Net.Sockets; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable + +namespace MonoTests.System.Net.Http { + [Preserve (AllMembers = true)] + sealed class ProxyTestServer : IDisposable { + readonly TcpListener listener; + readonly string? requiredUser; + readonly string? requiredPassword; + int requestCount; + int authenticatedRequestCount; + + // The total number of requests received by the proxy (including any that were rejected with a 407). + public int RequestCount => Volatile.Read (ref requestCount); + + // The number of requests that were successfully authenticated and forwarded. + public int AuthenticatedRequestCount => Volatile.Read (ref authenticatedRequestCount); + + public int Port { get; } + + public string Url => $"http://127.0.0.1:{Port}"; + + public ProxyTestServer (string? requiredUser = null, string? requiredPassword = null) + { + this.requiredUser = requiredUser; + this.requiredPassword = requiredPassword; + + listener = new TcpListener (IPAddress.Loopback, 0); + listener.Start (); + Port = ((IPEndPoint) listener.LocalEndpoint).Port; + _ = Task.Run (AcceptLoop); + } + + async Task AcceptLoop () + { + try { + while (true) { + var client = await listener.AcceptTcpClientAsync ().ConfigureAwait (false); + _ = Task.Run (() => HandleClientSafe (client)); + } + } catch (ObjectDisposedException) { + // the listener was stopped + } catch (SocketException) { + // the listener was stopped + } + } + + async Task HandleClientSafe (TcpClient client) + { + try { + using (client) + using (var stream = client.GetStream ()) { + await HandleClient (stream).ConfigureAwait (false); + } + } catch { + // This is a test proxy, so just swallow any errors. + } + } + + async Task HandleClient (NetworkStream stream) + { + var requestLine = await ReadLineAsync (stream).ConfigureAwait (false); + if (string.IsNullOrEmpty (requestLine)) + return; + + var parts = requestLine.Split (' '); + if (parts.Length < 3) + return; + + var method = parts [0]; + var target = parts [1]; + + var headers = new List> (); + string? line; + while (!string.IsNullOrEmpty (line = await ReadLineAsync (stream).ConfigureAwait (false))) { + var idx = line!.IndexOf (':'); + if (idx > 0) + headers.Add (new KeyValuePair (line.Substring (0, idx).Trim (), line.Substring (idx + 1).Trim ())); + } + + var body = await ReadBodyAsync (stream, headers).ConfigureAwait (false); + + Interlocked.Increment (ref requestCount); + + if (requiredUser is not null) { + var proxyAuth = FindHeader (headers, "Proxy-Authorization"); + if (!IsValidProxyAuth (proxyAuth)) { + await WriteResponseAsync (stream, 407, "Proxy Authentication Required", + new List> { + new ("Proxy-Authenticate", "Basic realm=\"Test Proxy\""), + }, + Encoding.UTF8.GetBytes ("Proxy authentication required")).ConfigureAwait (false); + return; + } + } + + if (!Uri.TryCreate (target, UriKind.Absolute, out var targetUri) || targetUri.Scheme != Uri.UriSchemeHttp) { + await WriteResponseAsync (stream, 400, "Bad Request", new List> (), + Encoding.UTF8.GetBytes ("Only absolute-form HTTP requests are supported")).ConfigureAwait (false); + return; + } + + Interlocked.Increment (ref authenticatedRequestCount); + + await ForwardAsync (stream, method, targetUri, headers, body).ConfigureAwait (false); + } + + static async Task ReadBodyAsync (NetworkStream stream, List> headers) + { + var contentLength = FindHeader (headers, "Content-Length"); + if (contentLength is null || !int.TryParse (contentLength, out var length) || length <= 0) + return null; + + var body = new byte [length]; + var read = 0; + while (read < length) { + var r = await stream.ReadAsync (body, read, length - read).ConfigureAwait (false); + if (r <= 0) + break; + read += r; + } + return body; + } + + async Task ForwardAsync (NetworkStream clientStream, string method, Uri targetUri, List> headers, byte []? body) + { + // Explicitly avoid using any proxy for the forwarded request, so we don't accidentally loop back into ourselves. + using var handler = new SocketsHttpHandler { + UseProxy = false, + AllowAutoRedirect = false, + AutomaticDecompression = DecompressionMethods.None, + }; + using var client = new HttpClient (handler); + using var request = new HttpRequestMessage (new HttpMethod (method), targetUri); + + if (body is not null) + request.Content = new ByteArrayContent (body); + + foreach (var header in headers) { + if (IsHopByHopHeader (header.Key)) + continue; + if (string.Equals (header.Key, "Host", StringComparison.OrdinalIgnoreCase)) + continue; + // Content-Length is set automatically by ByteArrayContent. + if (string.Equals (header.Key, "Content-Length", StringComparison.OrdinalIgnoreCase)) + continue; + + if (!request.Headers.TryAddWithoutValidation (header.Key, header.Value)) + request.Content?.Headers.TryAddWithoutValidation (header.Key, header.Value); + } + + using var response = await client.SendAsync (request).ConfigureAwait (false); + + var responseHeaders = new List> { + // A marker header so tests can verify the response actually went through this proxy. + new ("Via-Test-Proxy", "true"), + }; + foreach (var header in response.Headers) { + foreach (var value in header.Value) + responseHeaders.Add (new (header.Key, value)); + } + + var content = await response.Content.ReadAsByteArrayAsync ().ConfigureAwait (false); + + foreach (var header in response.Content.Headers) { + // We compute our own Content-Length below, and Transfer-Encoding is hop-by-hop. + if (string.Equals (header.Key, "Content-Length", StringComparison.OrdinalIgnoreCase)) + continue; + foreach (var value in header.Value) + responseHeaders.Add (new (header.Key, value)); + } + + await WriteResponseAsync (clientStream, (int) response.StatusCode, response.ReasonPhrase ?? "", responseHeaders, content).ConfigureAwait (false); + } + + bool IsValidProxyAuth (string? proxyAuthorization) + { + if (proxyAuthorization is null || !proxyAuthorization.StartsWith ("Basic ", StringComparison.Ordinal)) + return false; + + try { + var credentials = Encoding.UTF8.GetString (Convert.FromBase64String (proxyAuthorization.Substring ("Basic ".Length))); + var colonIdx = credentials.IndexOf (':'); + if (colonIdx <= 0) + return false; + + var user = credentials.Substring (0, colonIdx); + var password = credentials.Substring (colonIdx + 1); + return user == requiredUser && password == requiredPassword; + } catch { + return false; + } + } + + static string? FindHeader (List> headers, string name) + { + foreach (var header in headers) { + if (string.Equals (header.Key, name, StringComparison.OrdinalIgnoreCase)) + return header.Value; + } + return null; + } + + static bool IsHopByHopHeader (string name) + { + switch (name.ToLowerInvariant ()) { + case "connection": + case "keep-alive": + case "proxy-authenticate": + case "proxy-authorization": + case "te": + case "trailer": + case "transfer-encoding": + case "upgrade": + return true; + default: + return false; + } + } + + static async Task ReadLineAsync (NetworkStream stream) + { + var builder = new StringBuilder (); + var buffer = new byte [1]; + while (true) { + var read = await stream.ReadAsync (buffer, 0, 1).ConfigureAwait (false); + if (read <= 0) + return builder.Length == 0 ? null : builder.ToString (); + + var c = (char) buffer [0]; + if (c == '\n') + break; + if (c != '\r') + builder.Append (c); + } + return builder.ToString (); + } + + static async Task WriteResponseAsync (NetworkStream stream, int statusCode, string reasonPhrase, List> headers, byte [] content) + { + var builder = new StringBuilder (); + builder.Append ("HTTP/1.1 ").Append (statusCode).Append (' ').Append (reasonPhrase).Append ("\r\n"); + foreach (var header in headers) + builder.Append (header.Key).Append (": ").Append (header.Value).Append ("\r\n"); + builder.Append ("Content-Length: ").Append (content.Length).Append ("\r\n"); + // Force the connection closed so we don't have to deal with keep-alive framing. + builder.Append ("Connection: close\r\n"); + builder.Append ("\r\n"); + + var headerBytes = Encoding.ASCII.GetBytes (builder.ToString ()); + await stream.WriteAsync (headerBytes, 0, headerBytes.Length).ConfigureAwait (false); + if (content.Length > 0) + await stream.WriteAsync (content, 0, content.Length).ConfigureAwait (false); + await stream.FlushAsync ().ConfigureAwait (false); + } + + public void Dispose () + { + try { + listener.Stop (); + } catch { + // ignore + } + } + } +} From 3430bf66b89a4066e2d73bac0ad02faa5b2b4097 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 9 Jul 2026 21:03:19 +0200 Subject: [PATCH 02/16] [Foundation] Fix NSUrlSessionHandler proxy authentication challenge handling Proxy authentication challenges report a proxy authentication method (NSURLAuthenticationMethodHTTPProxy / NSURLAuthenticationMethodHTTPSProxy) rather than a specific scheme like Basic. TryGetAuthenticationType didn't recognize those methods and rejected the protection space, so the proxy credentials were never applied and requests failed with a 407. Handle proxy authentication challenges separately, using the proxy credentials (Proxy.Credentials or DefaultProxyCredentials) directly. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- src/Foundation/NSUrlSessionHandler.cs | 37 +++++++++++++++++---------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/src/Foundation/NSUrlSessionHandler.cs b/src/Foundation/NSUrlSessionHandler.cs index e5dd08863240..a883836e7a11 100644 --- a/src/Foundation/NSUrlSessionHandler.cs +++ b/src/Foundation/NSUrlSessionHandler.cs @@ -1257,14 +1257,28 @@ void DidReceiveChallengeImpl (NSUrlSession session, NSUrlSessionTask task, NSUrl } } - // Proxy authentication challenges use the proxy credentials (either the proxy's own credentials or - // the DefaultProxyCredentials), and look up credentials using the proxy's URI. Server authentication - // challenges use the regular Credentials and look up credentials using the request's URI. - var isProxyChallenge = challenge.ProtectionSpace.IsProxy; - var challengeCredentials = isProxyChallenge - ? (sessionHandler.Proxy?.Credentials ?? sessionHandler.DefaultProxyCredentials) - : sessionHandler.Credentials; + // Proxy authentication challenges are handled separately from server authentication challenges: + // for a proxy the protection space reports a proxy authentication method (HTTPProxy/HTTPSProxy) + // rather than a specific scheme like Basic, and the credentials come from the proxy configuration + // (the proxy's own credentials or the DefaultProxyCredentials). + if (challenge.ProtectionSpace.IsProxy) { + var proxyCredentials = sessionHandler.Proxy?.Credentials ?? sessionHandler.DefaultProxyCredentials; + // Only provide the credentials for the first challenge; if they were rejected we let the request + // fail instead of retrying the same (bad) credentials indefinitely. + if (proxyCredentials is not null && challenge.PreviousFailureCount == 0) { + var proxyUri = GetProxyLookupUri (challenge.ProtectionSpace); + var proxyCredential = proxyCredentials.GetCredential (proxyUri, "Basic"); + if (proxyCredential is not null) { + var proxyNSCredential = new NSUrlCredential (proxyCredential.UserName, proxyCredential.Password, NSUrlCredentialPersistence.ForSession); + completionHandler (NSUrlSessionAuthChallengeDisposition.UseCredential, proxyNSCredential); + return; + } + } + completionHandler (NSUrlSessionAuthChallengeDisposition.PerformDefaultHandling, challenge.ProposedCredential); + return; + } + var challengeCredentials = sessionHandler.Credentials; if (challengeCredentials is not null && TryGetAuthenticationType (challenge.ProtectionSpace, out var authType)) { NetworkCredential? credentialsToUse = null; if (authType != RejectProtectionSpaceAuthType) { @@ -1285,14 +1299,9 @@ void DidReceiveChallengeImpl (NSUrlSession session, NSUrlSessionTask task, NSUrl var nsurlRespose = challenge.FailureResponse as NSHttpUrlResponse; var responseIsUnauthorized = (nsurlRespose is null) ? false : nsurlRespose.StatusCode == (int) HttpStatusCode.Unauthorized && challenge.PreviousFailureCount > 0; if (!responseIsUnauthorized) { - if (isProxyChallenge) { - var uri = GetProxyLookupUri (challenge.ProtectionSpace); + var uri = GetCredentialLookupUri (task, inflight); + if (ShouldLookupCredentials (challengeCredentials, inflight)) credentialsToUse = challengeCredentials.GetCredential (uri, authType); - } else { - var uri = GetCredentialLookupUri (task, inflight); - if (ShouldLookupCredentials (challengeCredentials, inflight)) - credentialsToUse = challengeCredentials.GetCredential (uri, authType); - } } } From cfef97104ebd7d5d955f54a765e8ca49ec7938ff Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 9 Jul 2026 22:00:05 +0200 Subject: [PATCH 03/16] [tests] Update expected app size files for NSUrlSessionHandler proxy support Implementing custom proxy support in NSUrlSessionHandler adds a small amount of reachable code, which increases the NativeAOT (TrimmableStatic) app size beyond the test tolerance on all platforms. Update the expected app size files accordingly. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../expected/MacCatalyst-NativeAOT-TrimmableStatic-size.txt | 6 +++--- .../expected/MacOSX-NativeAOT-TrimmableStatic-size.txt | 6 +++--- .../expected/TVOS-NativeAOT-TrimmableStatic-size.txt | 6 +++--- .../expected/iOS-NativeAOT-TrimmableStatic-size.txt | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-TrimmableStatic-size.txt b/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-TrimmableStatic-size.txt index df4cc5baa1f8..38bfcfd1250d 100644 --- a/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-TrimmableStatic-size.txt +++ b/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-TrimmableStatic-size.txt @@ -1,9 +1,9 @@ -AppBundleSize: 13,916,973 bytes (13,590.8 KB = 13.3 MB) +AppBundleSize: 13,933,496 bytes (13,606.9 KB = 13.3 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/Info.plist: - 1,109 bytes (1.1 KB = 0.0 MB) + 1,040 bytes (1.0 KB = 0.0 MB) Contents/MacOS/SizeTestApp: - 13,913,960 bytes (13,587.9 KB = 13.3 MB) + 13,930,552 bytes (13,604.1 KB = 13.3 MB) Contents/MonoBundle/runtimeconfig.bin: 1,896 bytes (1.9 KB = 0.0 MB) Contents/PkgInfo: diff --git a/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-TrimmableStatic-size.txt b/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-TrimmableStatic-size.txt index 34ab85e9a4f0..2cbde8e19965 100644 --- a/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-TrimmableStatic-size.txt +++ b/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-TrimmableStatic-size.txt @@ -1,9 +1,9 @@ -AppBundleSize: 32,590,412 bytes (31,826.6 KB = 31.1 MB) +AppBundleSize: 32,623,366 bytes (31,858.8 KB = 31.1 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/Info.plist: - 740 bytes (0.7 KB = 0.0 MB) + 718 bytes (0.7 KB = 0.0 MB) Contents/MacOS/SizeTestApp: - 29,501,112 bytes (28,809.7 KB = 28.1 MB) + 29,534,088 bytes (28,841.9 KB = 28.2 MB) Contents/MonoBundle/libSystem.Globalization.Native.dylib: 267,872 bytes (261.6 KB = 0.3 MB) Contents/MonoBundle/libSystem.IO.Compression.Native.dylib: diff --git a/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-TrimmableStatic-size.txt b/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-TrimmableStatic-size.txt index 78c16ab717b9..2f06e9bec565 100644 --- a/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-TrimmableStatic-size.txt +++ b/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-TrimmableStatic-size.txt @@ -1,10 +1,10 @@ -AppBundleSize: 12,531,409 bytes (12,237.7 KB = 12.0 MB) +AppBundleSize: 12,564,243 bytes (12,269.8 KB = 12.0 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Info.plist: - 1,128 bytes (1.1 KB = 0.0 MB) + 1,106 bytes (1.1 KB = 0.0 MB) PkgInfo: 8 bytes (0.0 KB = 0.0 MB) runtimeconfig.bin: 1,889 bytes (1.8 KB = 0.0 MB) SizeTestApp: - 12,528,384 bytes (12,234.8 KB = 11.9 MB) + 12,561,240 bytes (12,266.8 KB = 12.0 MB) diff --git a/tests/dotnet/UnitTests/expected/iOS-NativeAOT-TrimmableStatic-size.txt b/tests/dotnet/UnitTests/expected/iOS-NativeAOT-TrimmableStatic-size.txt index d778506aa7a3..a179a43d6222 100644 --- a/tests/dotnet/UnitTests/expected/iOS-NativeAOT-TrimmableStatic-size.txt +++ b/tests/dotnet/UnitTests/expected/iOS-NativeAOT-TrimmableStatic-size.txt @@ -1,10 +1,10 @@ -AppBundleSize: 14,136,248 bytes (13,804.9 KB = 13.5 MB) +AppBundleSize: 14,152,698 bytes (13,821.0 KB = 13.5 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Info.plist: - 1,152 bytes (1.1 KB = 0.0 MB) + 1,130 bytes (1.1 KB = 0.0 MB) PkgInfo: 8 bytes (0.0 KB = 0.0 MB) runtimeconfig.bin: 1,888 bytes (1.8 KB = 0.0 MB) SizeTestApp: - 14,133,200 bytes (13,802.0 KB = 13.5 MB) + 14,149,672 bytes (13,818.0 KB = 13.5 MB) From 28dfc099539cc233de504c2d693a6af2b82e11b8 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Fri, 10 Jul 2026 01:02:16 +0200 Subject: [PATCH 04/16] [Foundation] Send proxy credentials via the connection proxy dictionary For a plain HTTP proxy using Basic authentication, NSUrlSession doesn't surface the proxy's 407 challenge to our session delegate, so the delegate-based credential flow never runs. Instead, embed the proxy credentials (kCFProxyUsernameKey/kCFProxyPasswordKey) directly in the connection proxy dictionary; NSUrlSession/CFNetwork then sends the Proxy-Authorization header automatically. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- src/Foundation/NSUrlSessionHandler.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/Foundation/NSUrlSessionHandler.cs b/src/Foundation/NSUrlSessionHandler.cs index a883836e7a11..c67784aff3da 100644 --- a/src/Foundation/NSUrlSessionHandler.cs +++ b/src/Foundation/NSUrlSessionHandler.cs @@ -513,6 +513,21 @@ bool TryGetProxyDictionary (Uri? destination, out NSDictionary? proxyDictionary) HttpsEnable = true, #endif }; + + // If the proxy requires authentication, embed the credentials directly in the proxy dictionary. + // For plain HTTP proxies using Basic authentication NSUrlSession/CFNetwork won't surface the + // proxy authentication challenge to our session delegate, but it will use these credentials to + // send the Proxy-Authorization header automatically. + var proxyCredentials = proxy.Credentials ?? defaultProxyCredentials; + var proxyCredential = proxyCredentials?.GetCredential (proxyUri, "Basic"); + if (proxyCredential is not null && !string.IsNullOrEmpty (proxyCredential.UserName)) { + var mutableProxy = new NSMutableDictionary (strongProxy.GetDictionary ()); + mutableProxy [CFProxy.UsernameKey] = new NSString (proxyCredential.UserName); + mutableProxy [CFProxy.PasswordKey] = new NSString (proxyCredential.Password ?? ""); + proxyDictionary = mutableProxy; + return true; + } + proxyDictionary = strongProxy.GetDictionary (); return true; } From a0b5eb51fe4628ff72b1f3cac925438815962ade Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Fri, 10 Jul 2026 02:16:46 +0200 Subject: [PATCH 05/16] [Foundation] Revert ineffective proxy-dict credentials; add proxy test diagnostics The kCFProxyUsernameKey/kCFProxyPasswordKey keys belong to the proxy entries returned by CFNetworkCopyProxiesForURL, not to the session's connectionProxyDictionary (which uses the kCFNetworkProxies* SystemConfiguration keys), so NSUrlSession ignored them. Revert that change. Add diagnostics (status code + proxy request counts) to the proxy authentication test assertion messages so the CI TestSummary reveals the actual runtime behavior (whether the proxy 407 triggers a delegate challenge/retry at all). Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- src/Foundation/NSUrlSessionHandler.cs | 15 --------------- .../System.Net.Http/NSUrlSessionHandlerTest.cs | 4 ++-- 2 files changed, 2 insertions(+), 17 deletions(-) diff --git a/src/Foundation/NSUrlSessionHandler.cs b/src/Foundation/NSUrlSessionHandler.cs index c67784aff3da..a883836e7a11 100644 --- a/src/Foundation/NSUrlSessionHandler.cs +++ b/src/Foundation/NSUrlSessionHandler.cs @@ -513,21 +513,6 @@ bool TryGetProxyDictionary (Uri? destination, out NSDictionary? proxyDictionary) HttpsEnable = true, #endif }; - - // If the proxy requires authentication, embed the credentials directly in the proxy dictionary. - // For plain HTTP proxies using Basic authentication NSUrlSession/CFNetwork won't surface the - // proxy authentication challenge to our session delegate, but it will use these credentials to - // send the Proxy-Authorization header automatically. - var proxyCredentials = proxy.Credentials ?? defaultProxyCredentials; - var proxyCredential = proxyCredentials?.GetCredential (proxyUri, "Basic"); - if (proxyCredential is not null && !string.IsNullOrEmpty (proxyCredential.UserName)) { - var mutableProxy = new NSMutableDictionary (strongProxy.GetDictionary ()); - mutableProxy [CFProxy.UsernameKey] = new NSString (proxyCredential.UserName); - mutableProxy [CFProxy.PasswordKey] = new NSString (proxyCredential.Password ?? ""); - proxyDictionary = mutableProxy; - return true; - } - proxyDictionary = strongProxy.GetDictionary (); return true; } diff --git a/tests/monotouch-test/System.Net.Http/NSUrlSessionHandlerTest.cs b/tests/monotouch-test/System.Net.Http/NSUrlSessionHandlerTest.cs index 8a3141b28f63..142ee9297609 100644 --- a/tests/monotouch-test/System.Net.Http/NSUrlSessionHandlerTest.cs +++ b/tests/monotouch-test/System.Net.Http/NSUrlSessionHandlerTest.cs @@ -454,7 +454,7 @@ public void ProxyWithCredentialsAuthenticatesWithProxy () } TestRuntime.IgnoreInCIIfBadNetwork (ex); Assert.That (ex, Is.Null, $"Exception: {ex}"); - Assert.That (statusCode, Is.EqualTo (HttpStatusCode.OK), "Status code (proxy credentials should have been used)"); + Assert.That (statusCode, Is.EqualTo (HttpStatusCode.OK), $"Status code (proxy credentials should have been used); status={statusCode}, requestCount={proxy.RequestCount}, authRequestCount={proxy.AuthenticatedRequestCount}"); Assert.That (proxy.AuthenticatedRequestCount, Is.GreaterThan (0), "Proxy should have forwarded an authenticated request"); } @@ -482,7 +482,7 @@ public void ProxyWithDefaultProxyCredentialsAuthenticatesWithProxy () } TestRuntime.IgnoreInCIIfBadNetwork (ex); Assert.That (ex, Is.Null, $"Exception: {ex}"); - Assert.That (statusCode, Is.EqualTo (HttpStatusCode.OK), "Status code (default proxy credentials should have been used)"); + Assert.That (statusCode, Is.EqualTo (HttpStatusCode.OK), $"Status code (default proxy credentials should have been used); status={statusCode}, requestCount={proxy.RequestCount}, authRequestCount={proxy.AuthenticatedRequestCount}"); Assert.That (proxy.AuthenticatedRequestCount, Is.GreaterThan (0), "Proxy should have forwarded an authenticated request"); } From 86dda0d8a19e0f83eedf2427c55fd313d0875129 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Fri, 10 Jul 2026 12:04:22 +0200 Subject: [PATCH 06/16] [Foundation] Test proxy authentication via HTTPS CONNECT tunnel NSUrlSession only delivers a proxy authentication challenge to the delegate for CONNECT tunnels (HTTPS destinations); for a plain HTTP forward proxy it returns the 407 directly to the caller without a delegate challenge. So the proxy-auth tests must exercise an HTTPS destination through the proxy's CONNECT support. - Add CONNECT tunneling to ProxyTestServer (validate Proxy-Authorization, then 200 Connection Established + raw byte pipe to the target). - Extract the reusable in-proc TLS server (NWListener + self-signed cert) from MessageHandlers into a shared TlsTestServer helper. - Convert the two proxy-auth tests to GET an https:// TLS destination through the authenticating proxy. - Enable HTTPS proxying on non-macOS platforms via the literal "HTTPSEnable" key (the strongly-typed HttpsEnable property is macOS-only), required for CONNECT tunneling to work there. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- src/Foundation/NSUrlSessionHandler.cs | 10 ++ .../System.Net.Http/MessageHandlers.cs | 77 +-------------- .../NSUrlSessionHandlerTest.cs | 86 +++++++++++------ .../System.Net.Http/ProxyTestServer.cs | 55 ++++++++++- .../System.Net.Http/TlsTestServer.cs | 96 +++++++++++++++++++ 5 files changed, 216 insertions(+), 108 deletions(-) create mode 100644 tests/monotouch-test/System.Net.Http/TlsTestServer.cs diff --git a/src/Foundation/NSUrlSessionHandler.cs b/src/Foundation/NSUrlSessionHandler.cs index a883836e7a11..46b3af4f96b3 100644 --- a/src/Foundation/NSUrlSessionHandler.cs +++ b/src/Foundation/NSUrlSessionHandler.cs @@ -514,6 +514,16 @@ bool TryGetProxyDictionary (Uri? destination, out NSDictionary? proxyDictionary) #endif }; proxyDictionary = strongProxy.GetDictionary (); +#if !MONOMAC + // The strongly-typed HttpsEnable property (kCFNetworkProxiesHTTPSEnable) is only exposed on + // macOS, but CFNetwork honors the same "HTTPSEnable" key on the other platforms too, and it's + // required for HTTPS proxying (CONNECT tunneling) to work. Add it via the literal key. + if (proxyDictionary is not null) { + var mutableProxyDictionary = new NSMutableDictionary (proxyDictionary); + mutableProxyDictionary ["HTTPSEnable"] = NSNumber.FromBoolean (true); + proxyDictionary = mutableProxyDictionary; + } +#endif return true; } diff --git a/tests/monotouch-test/System.Net.Http/MessageHandlers.cs b/tests/monotouch-test/System.Net.Http/MessageHandlers.cs index 75cf7a9b6125..07a5f02d336b 100644 --- a/tests/monotouch-test/System.Net.Http/MessageHandlers.cs +++ b/tests/monotouch-test/System.Net.Http/MessageHandlers.cs @@ -838,7 +838,7 @@ public void TestNSUrlSessionHandlerOptionalClientCertificate () { NWListener? listener = null; try { - listener = CreateNWTlsListener (requireClientCert: false); + listener = TlsTestServer.CreateNWTlsListener (requireClientCert: false); var port = listener.Port; var done = TestRuntime.TryRunAsync (TimeSpan.FromSeconds (30), async () => { @@ -861,7 +861,7 @@ public void TestNSUrlSessionHandlerDetectMissingClientCertificate () { NWListener? listener = null; try { - listener = CreateNWTlsListener (requireClientCert: true); + listener = TlsTestServer.CreateNWTlsListener (requireClientCert: true); var port = listener.Port; var done = TestRuntime.TryRunAsync (TimeSpan.FromSeconds (30), async () => { @@ -889,7 +889,7 @@ public void TestNSUrlSessionHandlerDetectMissingClientCertificateOptOut () NWListener? listener = null; try { AppContext.SetSwitch ("Foundation.NSUrlSessionHandler.NoMissingCertificateHandling", true); - listener = CreateNWTlsListener (requireClientCert: true); + listener = TlsTestServer.CreateNWTlsListener (requireClientCert: true); var port = listener.Port; var done = TestRuntime.TryRunAsync (TimeSpan.FromSeconds (30), async () => { @@ -912,77 +912,6 @@ public void TestNSUrlSessionHandlerDetectMissingClientCertificateOptOut () } } - static NWListener CreateNWTlsListener (bool requireClientCert) - { - var (pfxData, pfxPassword) = CreateSelfSignedServerCertificatePfx (); - using var secIdentity = SecIdentity.Import (pfxData, pfxPassword); - using var secIdentity2 = new SecIdentity2 (secIdentity); - using var readyEvent = new ManualResetEventSlim (false); - NWError? listenerError = null; - - var parameters = NWParameters.CreateSecureTcp ( - configureTls: tlsOptions => { - var tls = (NWProtocolTlsOptions) tlsOptions; - var secOptions = tls.ProtocolOptions; - secOptions.SetLocalIdentity (secIdentity2); - secOptions.SetPeerAuthenticationRequired (requireClientCert); - }); - using var localEndpoint = NWEndpoint.Create ("127.0.0.1", "0"); - parameters.LocalEndpoint = localEndpoint; - - var listener = NWListener.Create (parameters); - parameters.Dispose (); - - listener.SetQueue (CoreFoundation.DispatchQueue.DefaultGlobalQueue); - - listener.SetStateChangedHandler ((state, error) => { - if (state == NWListenerState.Failed) - listenerError = error; - if (state == NWListenerState.Ready || state == NWListenerState.Failed) - readyEvent.Set (); - }); - - listener.SetNewConnectionHandler (connection => { - connection.SetQueue (CoreFoundation.DispatchQueue.DefaultGlobalQueue); - connection.SetStateChangeHandler ((connState, connError) => { - if (connState == NWConnectionState.Ready) { - // Read the HTTP request (just consume it), then send a response - connection.ReceiveReadOnlyData (1, 4096, (data, context, isComplete, error) => { - var response = Encoding.UTF8.GetBytes ("HTTP/1.1 200 OK\r\nContent-Length: 2\r\nConnection: close\r\n\r\nOK"); - connection.Send (response, NWContentContext.FinalMessage, true, sendError => { - connection.Cancel (); - }); - }); - } - }); - connection.Start (); - }); - - listener.Start (); - - if (!readyEvent.Wait (TimeSpan.FromSeconds (10))) - throw new TimeoutException ("NWListener did not become ready in time."); - - if (listenerError is not null) - throw new InvalidOperationException ($"NWListener failed to start: {listenerError}"); - - return listener; - } - - static (byte [] Data, string Password) CreateSelfSignedServerCertificatePfx () - { - using var rsa = RSA.Create (2048); - var certRequest = new CertificateRequest ( - "CN=localhost", rsa, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); - var sanBuilder = new SubjectAlternativeNameBuilder (); - sanBuilder.AddIpAddress (IPAddress.Loopback); - sanBuilder.AddDnsName ("localhost"); - certRequest.CertificateExtensions.Add (sanBuilder.Build ()); - var cert = certRequest.CreateSelfSigned (DateTimeOffset.UtcNow.AddDays (-1), DateTimeOffset.UtcNow.AddYears (1)); - var password = Guid.NewGuid ().ToString (); - return (cert.Export (X509ContentType.Pfx, password), password); - } - sealed class RedirectBasicAuthServer : IDisposable { readonly bool crossOrigin; readonly HttpListener originListener; diff --git a/tests/monotouch-test/System.Net.Http/NSUrlSessionHandlerTest.cs b/tests/monotouch-test/System.Net.Http/NSUrlSessionHandlerTest.cs index 142ee9297609..ffce3ced8a92 100644 --- a/tests/monotouch-test/System.Net.Http/NSUrlSessionHandlerTest.cs +++ b/tests/monotouch-test/System.Net.Http/NSUrlSessionHandlerTest.cs @@ -436,26 +436,39 @@ public void ProxyWithCredentialsAuthenticatesWithProxy () const string proxyPass = "proxypass"; using var proxy = new ProxyTestServer (proxyUser, proxyPass); + // NSUrlSession only delivers a proxy authentication challenge to the delegate for CONNECT + // tunnels (i.e. HTTPS destinations); for a plain HTTP forward proxy it returns the 407 + // directly to the caller. So we route an HTTPS request through the proxy's CONNECT support. + Network.NWListener? destination = null; HttpStatusCode? statusCode = null; - var done = TestRuntime.TryRunAsync (TimeSpan.FromSeconds (30), async () => { - using var handler = new NSUrlSessionHandler (); - handler.Proxy = new WebProxy (proxy.Url) { - Credentials = new NetworkCredential (proxyUser, proxyPass), - }; - using var client = new HttpClient (handler); - var response = await client.GetAsync (NetworkResources.Httpbin.GetUrl).ConfigureAwait (false); - statusCode = response.StatusCode; - }, out var ex); + try { + destination = TlsTestServer.CreateNWTlsListener (requireClientCert: false); + var destinationPort = destination.Port; - if (!done) { - TestRuntime.IgnoreInCI ("Transient localhost server failure - ignore in CI"); - Assert.Inconclusive ("Request timed out."); + var done = TestRuntime.TryRunAsync (TimeSpan.FromSeconds (30), async () => { + using var handler = new NSUrlSessionHandler (); + handler.Proxy = new WebProxy (proxy.Url) { + Credentials = new NetworkCredential (proxyUser, proxyPass), + }; + handler.TrustOverrideForUrl = (sender, url, trust) => true; + using var client = new HttpClient (handler); + var response = await client.GetAsync ($"https://localhost:{destinationPort}/").ConfigureAwait (false); + statusCode = response.StatusCode; + }, out var ex); + + if (!done) { + TestRuntime.IgnoreInCI ("Transient localhost server failure - ignore in CI"); + Assert.Inconclusive ("Request timed out."); + } + TestRuntime.IgnoreInCIIfBadNetwork (ex); + Assert.That (ex, Is.Null, $"Exception: {ex}"); + Assert.That (statusCode, Is.EqualTo (HttpStatusCode.OK), $"Status code (proxy credentials should have been used); status={statusCode}, requestCount={proxy.RequestCount}, authRequestCount={proxy.AuthenticatedRequestCount}"); + Assert.That (proxy.AuthenticatedRequestCount, Is.GreaterThan (0), "Proxy should have established an authenticated tunnel"); + } finally { + destination?.Cancel (); + destination?.Dispose (); } - TestRuntime.IgnoreInCIIfBadNetwork (ex); - Assert.That (ex, Is.Null, $"Exception: {ex}"); - Assert.That (statusCode, Is.EqualTo (HttpStatusCode.OK), $"Status code (proxy credentials should have been used); status={statusCode}, requestCount={proxy.RequestCount}, authRequestCount={proxy.AuthenticatedRequestCount}"); - Assert.That (proxy.AuthenticatedRequestCount, Is.GreaterThan (0), "Proxy should have forwarded an authenticated request"); } [Test] @@ -465,25 +478,36 @@ public void ProxyWithDefaultProxyCredentialsAuthenticatesWithProxy () const string proxyPass = "proxypass"; using var proxy = new ProxyTestServer (proxyUser, proxyPass); + // See ProxyWithCredentialsAuthenticatesWithProxy for why we use an HTTPS (CONNECT) request. + Network.NWListener? destination = null; HttpStatusCode? statusCode = null; - var done = TestRuntime.TryRunAsync (TimeSpan.FromSeconds (30), async () => { - using var handler = new NSUrlSessionHandler (); - handler.Proxy = new WebProxy (proxy.Url); - handler.DefaultProxyCredentials = new NetworkCredential (proxyUser, proxyPass); - using var client = new HttpClient (handler); - var response = await client.GetAsync (NetworkResources.Httpbin.GetUrl).ConfigureAwait (false); - statusCode = response.StatusCode; - }, out var ex); + try { + destination = TlsTestServer.CreateNWTlsListener (requireClientCert: false); + var destinationPort = destination.Port; - if (!done) { - TestRuntime.IgnoreInCI ("Transient localhost server failure - ignore in CI"); - Assert.Inconclusive ("Request timed out."); + var done = TestRuntime.TryRunAsync (TimeSpan.FromSeconds (30), async () => { + using var handler = new NSUrlSessionHandler (); + handler.Proxy = new WebProxy (proxy.Url); + handler.DefaultProxyCredentials = new NetworkCredential (proxyUser, proxyPass); + handler.TrustOverrideForUrl = (sender, url, trust) => true; + using var client = new HttpClient (handler); + var response = await client.GetAsync ($"https://localhost:{destinationPort}/").ConfigureAwait (false); + statusCode = response.StatusCode; + }, out var ex); + + if (!done) { + TestRuntime.IgnoreInCI ("Transient localhost server failure - ignore in CI"); + Assert.Inconclusive ("Request timed out."); + } + TestRuntime.IgnoreInCIIfBadNetwork (ex); + Assert.That (ex, Is.Null, $"Exception: {ex}"); + Assert.That (statusCode, Is.EqualTo (HttpStatusCode.OK), $"Status code (default proxy credentials should have been used); status={statusCode}, requestCount={proxy.RequestCount}, authRequestCount={proxy.AuthenticatedRequestCount}"); + Assert.That (proxy.AuthenticatedRequestCount, Is.GreaterThan (0), "Proxy should have established an authenticated tunnel"); + } finally { + destination?.Cancel (); + destination?.Dispose (); } - TestRuntime.IgnoreInCIIfBadNetwork (ex); - Assert.That (ex, Is.Null, $"Exception: {ex}"); - Assert.That (statusCode, Is.EqualTo (HttpStatusCode.OK), $"Status code (default proxy credentials should have been used); status={statusCode}, requestCount={proxy.RequestCount}, authRequestCount={proxy.AuthenticatedRequestCount}"); - Assert.That (proxy.AuthenticatedRequestCount, Is.GreaterThan (0), "Proxy should have forwarded an authenticated request"); } [Test] diff --git a/tests/monotouch-test/System.Net.Http/ProxyTestServer.cs b/tests/monotouch-test/System.Net.Http/ProxyTestServer.cs index 0e4aa07459c0..480e19141255 100644 --- a/tests/monotouch-test/System.Net.Http/ProxyTestServer.cs +++ b/tests/monotouch-test/System.Net.Http/ProxyTestServer.cs @@ -4,9 +4,10 @@ // // An in-process HTTP forwarding proxy used to test NSUrlSessionHandler's proxy support. // -// It only handles absolute-form HTTP requests (the form a client sends to an HTTP proxy), -// which is enough to test proxying of the in-process HTTP test server (HttpbinTestServer). -// HTTPS (CONNECT tunneling) is intentionally not supported. +// It handles absolute-form HTTP requests (the form a client sends to an HTTP proxy) to test +// proxying of the in-process HTTP test server (HttpbinTestServer), and it handles the CONNECT +// method to tunnel HTTPS requests (which is the only way NSUrlSession delivers proxy +// authentication challenges to the delegate). // using System; @@ -97,6 +98,12 @@ async Task HandleClient (NetworkStream stream) headers.Add (new KeyValuePair (line.Substring (0, idx).Trim (), line.Substring (idx + 1).Trim ())); } + if (string.Equals (method, "CONNECT", StringComparison.OrdinalIgnoreCase)) { + Interlocked.Increment (ref requestCount); + await HandleConnect (stream, target, headers).ConfigureAwait (false); + return; + } + var body = await ReadBodyAsync (stream, headers).ConfigureAwait (false); Interlocked.Increment (ref requestCount); @@ -124,6 +131,48 @@ await WriteResponseAsync (stream, 407, "Proxy Authentication Required", await ForwardAsync (stream, method, targetUri, headers, body).ConfigureAwait (false); } + // Handles the CONNECT method: validate proxy authentication (if required), then establish a + // raw TCP tunnel to the requested host:port and pipe bytes back and forth. This is what lets + // an HTTPS request flow through the proxy while exercising proxy authentication. + async Task HandleConnect (NetworkStream clientStream, string target, List> headers) + { + if (requiredUser is not null) { + var proxyAuth = FindHeader (headers, "Proxy-Authorization"); + if (!IsValidProxyAuth (proxyAuth)) { + await WriteResponseAsync (clientStream, 407, "Proxy Authentication Required", + new List> { + new ("Proxy-Authenticate", "Basic realm=\"Test Proxy\""), + }, + Encoding.UTF8.GetBytes ("Proxy authentication required")).ConfigureAwait (false); + return; + } + } + + var host = target; + var port = 443; + var colonIdx = target.LastIndexOf (':'); + if (colonIdx > 0) { + host = target.Substring (0, colonIdx); + int.TryParse (target.Substring (colonIdx + 1), out port); + } + // The TLS test server binds to 127.0.0.1, so make sure we connect there (and not ::1). + if (string.Equals (host, "localhost", StringComparison.OrdinalIgnoreCase)) + host = "127.0.0.1"; + + using var upstream = new TcpClient (); + await upstream.ConnectAsync (host, port).ConfigureAwait (false); + + Interlocked.Increment (ref authenticatedRequestCount); + + var established = Encoding.ASCII.GetBytes ("HTTP/1.1 200 Connection Established\r\n\r\n"); + await clientStream.WriteAsync (established, 0, established.Length).ConfigureAwait (false); + await clientStream.FlushAsync ().ConfigureAwait (false); + + using var upstreamStream = upstream.GetStream (); + var clientToUpstream = clientStream.CopyToAsync (upstreamStream); + var upstreamToClient = upstreamStream.CopyToAsync (clientStream); + await Task.WhenAny (clientToUpstream, upstreamToClient).ConfigureAwait (false); + static async Task ReadBodyAsync (NetworkStream stream, List> headers) { var contentLength = FindHeader (headers, "Content-Length"); diff --git a/tests/monotouch-test/System.Net.Http/TlsTestServer.cs b/tests/monotouch-test/System.Net.Http/TlsTestServer.cs new file mode 100644 index 000000000000..2d4b673030cd --- /dev/null +++ b/tests/monotouch-test/System.Net.Http/TlsTestServer.cs @@ -0,0 +1,96 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +// +// An in-process TLS (HTTPS) server used by the networking tests. It uses a self-signed +// certificate and returns a minimal "200 OK" response to any request, which is enough to +// exercise the client's TLS handling (server trust, client certificates, proxy tunneling, ...). +// + +using System; +using System.Net; +using System.Security.Cryptography; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading; + +using CoreFoundation; +using Network; +using Security; + +namespace MonoTests.System.Net.Http { + static class TlsTestServer { + // Creates a secure (TLS) NWListener bound to 127.0.0.1 on an available port. The listener + // answers every connection with a minimal "HTTP/1.1 200 OK" response and then closes it. + public static NWListener CreateNWTlsListener (bool requireClientCert) + { + var (pfxData, pfxPassword) = CreateSelfSignedServerCertificatePfx (); + using var secIdentity = SecIdentity.Import (pfxData, pfxPassword); + using var secIdentity2 = new SecIdentity2 (secIdentity); + using var readyEvent = new ManualResetEventSlim (false); + NWError? listenerError = null; + + var parameters = NWParameters.CreateSecureTcp ( + configureTls: tlsOptions => { + var tls = (NWProtocolTlsOptions) tlsOptions; + var secOptions = tls.ProtocolOptions; + secOptions.SetLocalIdentity (secIdentity2); + secOptions.SetPeerAuthenticationRequired (requireClientCert); + }); + using var localEndpoint = NWEndpoint.Create ("127.0.0.1", "0"); + parameters.LocalEndpoint = localEndpoint; + + var listener = NWListener.Create (parameters); + parameters.Dispose (); + + listener.SetQueue (DispatchQueue.DefaultGlobalQueue); + + listener.SetStateChangedHandler ((state, error) => { + if (state == NWListenerState.Failed) + listenerError = error; + if (state == NWListenerState.Ready || state == NWListenerState.Failed) + readyEvent.Set (); + }); + + listener.SetNewConnectionHandler (connection => { + connection.SetQueue (DispatchQueue.DefaultGlobalQueue); + connection.SetStateChangeHandler ((connState, connError) => { + if (connState == NWConnectionState.Ready) { + // Read the HTTP request (just consume it), then send a response + connection.ReceiveReadOnlyData (1, 4096, (data, context, isComplete, error) => { + var response = Encoding.UTF8.GetBytes ("HTTP/1.1 200 OK\r\nContent-Length: 2\r\nConnection: close\r\n\r\nOK"); + connection.Send (response, NWContentContext.FinalMessage, true, sendError => { + connection.Cancel (); + }); + }); + } + }); + connection.Start (); + }); + + listener.Start (); + + if (!readyEvent.Wait (TimeSpan.FromSeconds (10))) + throw new TimeoutException ("NWListener did not become ready in time."); + + if (listenerError is not null) + throw new InvalidOperationException ($"NWListener failed to start: {listenerError}"); + + return listener; + } + + public static (byte [] Data, string Password) CreateSelfSignedServerCertificatePfx () + { + using var rsa = RSA.Create (2048); + var certRequest = new CertificateRequest ( + "CN=localhost", rsa, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); + var sanBuilder = new SubjectAlternativeNameBuilder (); + sanBuilder.AddIpAddress (IPAddress.Loopback); + sanBuilder.AddDnsName ("localhost"); + certRequest.CertificateExtensions.Add (sanBuilder.Build ()); + var cert = certRequest.CreateSelfSigned (DateTimeOffset.UtcNow.AddDays (-1), DateTimeOffset.UtcNow.AddYears (1)); + var password = Guid.NewGuid ().ToString (); + return (cert.Export (X509ContentType.Pfx, password), password); + } + } +} From 12e3605768a2142d448c40eb76c43a30abebb07a Mon Sep 17 00:00:00 2001 From: GitHub Actions Autoformatter Date: Fri, 10 Jul 2026 10:11:41 +0000 Subject: [PATCH 07/16] Auto-format source code --- .../System.Net.Http/ProxyTestServer.cs | 252 +++++++++--------- 1 file changed, 126 insertions(+), 126 deletions(-) diff --git a/tests/monotouch-test/System.Net.Http/ProxyTestServer.cs b/tests/monotouch-test/System.Net.Http/ProxyTestServer.cs index 480e19141255..1ad6998bfa27 100644 --- a/tests/monotouch-test/System.Net.Http/ProxyTestServer.cs +++ b/tests/monotouch-test/System.Net.Http/ProxyTestServer.cs @@ -173,154 +173,154 @@ await WriteResponseAsync (clientStream, 407, "Proxy Authentication Required", var upstreamToClient = upstreamStream.CopyToAsync (clientStream); await Task.WhenAny (clientToUpstream, upstreamToClient).ConfigureAwait (false); - static async Task ReadBodyAsync (NetworkStream stream, List> headers) - { - var contentLength = FindHeader (headers, "Content-Length"); - if (contentLength is null || !int.TryParse (contentLength, out var length) || length <= 0) - return null; - - var body = new byte [length]; - var read = 0; - while (read < length) { - var r = await stream.ReadAsync (body, read, length - read).ConfigureAwait (false); - if (r <= 0) - break; - read += r; + static async Task ReadBodyAsync (NetworkStream stream, List> headers) + { + var contentLength = FindHeader (headers, "Content-Length"); + if (contentLength is null || !int.TryParse (contentLength, out var length) || length <= 0) + return null; + + var body = new byte [length]; + var read = 0; + while (read < length) { + var r = await stream.ReadAsync (body, read, length - read).ConfigureAwait (false); + if (r <= 0) + break; + read += r; + } + return body; } - return body; - } - async Task ForwardAsync (NetworkStream clientStream, string method, Uri targetUri, List> headers, byte []? body) - { - // Explicitly avoid using any proxy for the forwarded request, so we don't accidentally loop back into ourselves. - using var handler = new SocketsHttpHandler { - UseProxy = false, - AllowAutoRedirect = false, - AutomaticDecompression = DecompressionMethods.None, - }; - using var client = new HttpClient (handler); - using var request = new HttpRequestMessage (new HttpMethod (method), targetUri); - - if (body is not null) - request.Content = new ByteArrayContent (body); - - foreach (var header in headers) { - if (IsHopByHopHeader (header.Key)) - continue; - if (string.Equals (header.Key, "Host", StringComparison.OrdinalIgnoreCase)) - continue; - // Content-Length is set automatically by ByteArrayContent. - if (string.Equals (header.Key, "Content-Length", StringComparison.OrdinalIgnoreCase)) - continue; - - if (!request.Headers.TryAddWithoutValidation (header.Key, header.Value)) - request.Content?.Headers.TryAddWithoutValidation (header.Key, header.Value); - } + async Task ForwardAsync (NetworkStream clientStream, string method, Uri targetUri, List> headers, byte []? body) + { + // Explicitly avoid using any proxy for the forwarded request, so we don't accidentally loop back into ourselves. + using var handler = new SocketsHttpHandler { + UseProxy = false, + AllowAutoRedirect = false, + AutomaticDecompression = DecompressionMethods.None, + }; + using var client = new HttpClient (handler); + using var request = new HttpRequestMessage (new HttpMethod (method), targetUri); + + if (body is not null) + request.Content = new ByteArrayContent (body); + + foreach (var header in headers) { + if (IsHopByHopHeader (header.Key)) + continue; + if (string.Equals (header.Key, "Host", StringComparison.OrdinalIgnoreCase)) + continue; + // Content-Length is set automatically by ByteArrayContent. + if (string.Equals (header.Key, "Content-Length", StringComparison.OrdinalIgnoreCase)) + continue; + + if (!request.Headers.TryAddWithoutValidation (header.Key, header.Value)) + request.Content?.Headers.TryAddWithoutValidation (header.Key, header.Value); + } - using var response = await client.SendAsync (request).ConfigureAwait (false); + using var response = await client.SendAsync (request).ConfigureAwait (false); - var responseHeaders = new List> { + var responseHeaders = new List> { // A marker header so tests can verify the response actually went through this proxy. new ("Via-Test-Proxy", "true"), }; - foreach (var header in response.Headers) { - foreach (var value in header.Value) - responseHeaders.Add (new (header.Key, value)); - } + foreach (var header in response.Headers) { + foreach (var value in header.Value) + responseHeaders.Add (new (header.Key, value)); + } - var content = await response.Content.ReadAsByteArrayAsync ().ConfigureAwait (false); + var content = await response.Content.ReadAsByteArrayAsync ().ConfigureAwait (false); - foreach (var header in response.Content.Headers) { - // We compute our own Content-Length below, and Transfer-Encoding is hop-by-hop. - if (string.Equals (header.Key, "Content-Length", StringComparison.OrdinalIgnoreCase)) - continue; - foreach (var value in header.Value) - responseHeaders.Add (new (header.Key, value)); + foreach (var header in response.Content.Headers) { + // We compute our own Content-Length below, and Transfer-Encoding is hop-by-hop. + if (string.Equals (header.Key, "Content-Length", StringComparison.OrdinalIgnoreCase)) + continue; + foreach (var value in header.Value) + responseHeaders.Add (new (header.Key, value)); + } + + await WriteResponseAsync (clientStream, (int) response.StatusCode, response.ReasonPhrase ?? "", responseHeaders, content).ConfigureAwait (false); } - await WriteResponseAsync (clientStream, (int) response.StatusCode, response.ReasonPhrase ?? "", responseHeaders, content).ConfigureAwait (false); - } + bool IsValidProxyAuth (string? proxyAuthorization) + { + if (proxyAuthorization is null || !proxyAuthorization.StartsWith ("Basic ", StringComparison.Ordinal)) + return false; - bool IsValidProxyAuth (string? proxyAuthorization) - { - if (proxyAuthorization is null || !proxyAuthorization.StartsWith ("Basic ", StringComparison.Ordinal)) - return false; + try { + var credentials = Encoding.UTF8.GetString (Convert.FromBase64String (proxyAuthorization.Substring ("Basic ".Length))); + var colonIdx = credentials.IndexOf (':'); + if (colonIdx <= 0) + return false; - try { - var credentials = Encoding.UTF8.GetString (Convert.FromBase64String (proxyAuthorization.Substring ("Basic ".Length))); - var colonIdx = credentials.IndexOf (':'); - if (colonIdx <= 0) + var user = credentials.Substring (0, colonIdx); + var password = credentials.Substring (colonIdx + 1); + return user == requiredUser && password == requiredPassword; + } catch { return false; - - var user = credentials.Substring (0, colonIdx); - var password = credentials.Substring (colonIdx + 1); - return user == requiredUser && password == requiredPassword; - } catch { - return false; + } } - } - static string? FindHeader (List> headers, string name) - { - foreach (var header in headers) { - if (string.Equals (header.Key, name, StringComparison.OrdinalIgnoreCase)) - return header.Value; + static string? FindHeader (List> headers, string name) + { + foreach (var header in headers) { + if (string.Equals (header.Key, name, StringComparison.OrdinalIgnoreCase)) + return header.Value; + } + return null; } - return null; - } - static bool IsHopByHopHeader (string name) - { - switch (name.ToLowerInvariant ()) { - case "connection": - case "keep-alive": - case "proxy-authenticate": - case "proxy-authorization": - case "te": - case "trailer": - case "transfer-encoding": - case "upgrade": - return true; - default: - return false; + static bool IsHopByHopHeader (string name) + { + switch (name.ToLowerInvariant ()) { + case "connection": + case "keep-alive": + case "proxy-authenticate": + case "proxy-authorization": + case "te": + case "trailer": + case "transfer-encoding": + case "upgrade": + return true; + default: + return false; + } } - } - static async Task ReadLineAsync (NetworkStream stream) - { - var builder = new StringBuilder (); - var buffer = new byte [1]; - while (true) { - var read = await stream.ReadAsync (buffer, 0, 1).ConfigureAwait (false); - if (read <= 0) - return builder.Length == 0 ? null : builder.ToString (); - - var c = (char) buffer [0]; - if (c == '\n') - break; - if (c != '\r') - builder.Append (c); + static async Task ReadLineAsync (NetworkStream stream) + { + var builder = new StringBuilder (); + var buffer = new byte [1]; + while (true) { + var read = await stream.ReadAsync (buffer, 0, 1).ConfigureAwait (false); + if (read <= 0) + return builder.Length == 0 ? null : builder.ToString (); + + var c = (char) buffer [0]; + if (c == '\n') + break; + if (c != '\r') + builder.Append (c); + } + return builder.ToString (); } - return builder.ToString (); - } - static async Task WriteResponseAsync (NetworkStream stream, int statusCode, string reasonPhrase, List> headers, byte [] content) - { - var builder = new StringBuilder (); - builder.Append ("HTTP/1.1 ").Append (statusCode).Append (' ').Append (reasonPhrase).Append ("\r\n"); - foreach (var header in headers) - builder.Append (header.Key).Append (": ").Append (header.Value).Append ("\r\n"); - builder.Append ("Content-Length: ").Append (content.Length).Append ("\r\n"); - // Force the connection closed so we don't have to deal with keep-alive framing. - builder.Append ("Connection: close\r\n"); - builder.Append ("\r\n"); - - var headerBytes = Encoding.ASCII.GetBytes (builder.ToString ()); - await stream.WriteAsync (headerBytes, 0, headerBytes.Length).ConfigureAwait (false); - if (content.Length > 0) - await stream.WriteAsync (content, 0, content.Length).ConfigureAwait (false); - await stream.FlushAsync ().ConfigureAwait (false); - } + static async Task WriteResponseAsync (NetworkStream stream, int statusCode, string reasonPhrase, List> headers, byte [] content) + { + var builder = new StringBuilder (); + builder.Append ("HTTP/1.1 ").Append (statusCode).Append (' ').Append (reasonPhrase).Append ("\r\n"); + foreach (var header in headers) + builder.Append (header.Key).Append (": ").Append (header.Value).Append ("\r\n"); + builder.Append ("Content-Length: ").Append (content.Length).Append ("\r\n"); + // Force the connection closed so we don't have to deal with keep-alive framing. + builder.Append ("Connection: close\r\n"); + builder.Append ("\r\n"); + + var headerBytes = Encoding.ASCII.GetBytes (builder.ToString ()); + await stream.WriteAsync (headerBytes, 0, headerBytes.Length).ConfigureAwait (false); + if (content.Length > 0) + await stream.WriteAsync (content, 0, content.Length).ConfigureAwait (false); + await stream.FlushAsync ().ConfigureAwait (false); + } public void Dispose () { From 71319b49b2f6eeebe56a158c41f90f9ea18e8915 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Fri, 10 Jul 2026 14:17:52 +0200 Subject: [PATCH 08/16] [tests] Fix missing closing brace in ProxyTestServer.HandleConnect The CONNECT tunnel method was missing its closing brace, causing a CS1513 build failure in monotouch-test (and the autoformatter then over-indented the rest of the file). Restore the correct structure and indentation. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../System.Net.Http/ProxyTestServer.cs | 253 +++++++++--------- 1 file changed, 127 insertions(+), 126 deletions(-) diff --git a/tests/monotouch-test/System.Net.Http/ProxyTestServer.cs b/tests/monotouch-test/System.Net.Http/ProxyTestServer.cs index 1ad6998bfa27..0943befd0c8d 100644 --- a/tests/monotouch-test/System.Net.Http/ProxyTestServer.cs +++ b/tests/monotouch-test/System.Net.Http/ProxyTestServer.cs @@ -172,155 +172,156 @@ await WriteResponseAsync (clientStream, 407, "Proxy Authentication Required", var clientToUpstream = clientStream.CopyToAsync (upstreamStream); var upstreamToClient = upstreamStream.CopyToAsync (clientStream); await Task.WhenAny (clientToUpstream, upstreamToClient).ConfigureAwait (false); + } - static async Task ReadBodyAsync (NetworkStream stream, List> headers) - { - var contentLength = FindHeader (headers, "Content-Length"); - if (contentLength is null || !int.TryParse (contentLength, out var length) || length <= 0) - return null; - - var body = new byte [length]; - var read = 0; - while (read < length) { - var r = await stream.ReadAsync (body, read, length - read).ConfigureAwait (false); - if (r <= 0) - break; - read += r; - } - return body; + static async Task ReadBodyAsync (NetworkStream stream, List> headers) + { + var contentLength = FindHeader (headers, "Content-Length"); + if (contentLength is null || !int.TryParse (contentLength, out var length) || length <= 0) + return null; + + var body = new byte [length]; + var read = 0; + while (read < length) { + var r = await stream.ReadAsync (body, read, length - read).ConfigureAwait (false); + if (r <= 0) + break; + read += r; } + return body; + } - async Task ForwardAsync (NetworkStream clientStream, string method, Uri targetUri, List> headers, byte []? body) - { - // Explicitly avoid using any proxy for the forwarded request, so we don't accidentally loop back into ourselves. - using var handler = new SocketsHttpHandler { - UseProxy = false, - AllowAutoRedirect = false, - AutomaticDecompression = DecompressionMethods.None, - }; - using var client = new HttpClient (handler); - using var request = new HttpRequestMessage (new HttpMethod (method), targetUri); - - if (body is not null) - request.Content = new ByteArrayContent (body); - - foreach (var header in headers) { - if (IsHopByHopHeader (header.Key)) - continue; - if (string.Equals (header.Key, "Host", StringComparison.OrdinalIgnoreCase)) - continue; - // Content-Length is set automatically by ByteArrayContent. - if (string.Equals (header.Key, "Content-Length", StringComparison.OrdinalIgnoreCase)) - continue; - - if (!request.Headers.TryAddWithoutValidation (header.Key, header.Value)) - request.Content?.Headers.TryAddWithoutValidation (header.Key, header.Value); - } + async Task ForwardAsync (NetworkStream clientStream, string method, Uri targetUri, List> headers, byte []? body) + { + // Explicitly avoid using any proxy for the forwarded request, so we don't accidentally loop back into ourselves. + using var handler = new SocketsHttpHandler { + UseProxy = false, + AllowAutoRedirect = false, + AutomaticDecompression = DecompressionMethods.None, + }; + using var client = new HttpClient (handler); + using var request = new HttpRequestMessage (new HttpMethod (method), targetUri); + + if (body is not null) + request.Content = new ByteArrayContent (body); + + foreach (var header in headers) { + if (IsHopByHopHeader (header.Key)) + continue; + if (string.Equals (header.Key, "Host", StringComparison.OrdinalIgnoreCase)) + continue; + // Content-Length is set automatically by ByteArrayContent. + if (string.Equals (header.Key, "Content-Length", StringComparison.OrdinalIgnoreCase)) + continue; + + if (!request.Headers.TryAddWithoutValidation (header.Key, header.Value)) + request.Content?.Headers.TryAddWithoutValidation (header.Key, header.Value); + } - using var response = await client.SendAsync (request).ConfigureAwait (false); + using var response = await client.SendAsync (request).ConfigureAwait (false); - var responseHeaders = new List> { + var responseHeaders = new List> { // A marker header so tests can verify the response actually went through this proxy. new ("Via-Test-Proxy", "true"), }; - foreach (var header in response.Headers) { - foreach (var value in header.Value) - responseHeaders.Add (new (header.Key, value)); - } + foreach (var header in response.Headers) { + foreach (var value in header.Value) + responseHeaders.Add (new (header.Key, value)); + } - var content = await response.Content.ReadAsByteArrayAsync ().ConfigureAwait (false); + var content = await response.Content.ReadAsByteArrayAsync ().ConfigureAwait (false); - foreach (var header in response.Content.Headers) { - // We compute our own Content-Length below, and Transfer-Encoding is hop-by-hop. - if (string.Equals (header.Key, "Content-Length", StringComparison.OrdinalIgnoreCase)) - continue; - foreach (var value in header.Value) - responseHeaders.Add (new (header.Key, value)); - } - - await WriteResponseAsync (clientStream, (int) response.StatusCode, response.ReasonPhrase ?? "", responseHeaders, content).ConfigureAwait (false); + foreach (var header in response.Content.Headers) { + // We compute our own Content-Length below, and Transfer-Encoding is hop-by-hop. + if (string.Equals (header.Key, "Content-Length", StringComparison.OrdinalIgnoreCase)) + continue; + foreach (var value in header.Value) + responseHeaders.Add (new (header.Key, value)); } - bool IsValidProxyAuth (string? proxyAuthorization) - { - if (proxyAuthorization is null || !proxyAuthorization.StartsWith ("Basic ", StringComparison.Ordinal)) - return false; + await WriteResponseAsync (clientStream, (int) response.StatusCode, response.ReasonPhrase ?? "", responseHeaders, content).ConfigureAwait (false); + } - try { - var credentials = Encoding.UTF8.GetString (Convert.FromBase64String (proxyAuthorization.Substring ("Basic ".Length))); - var colonIdx = credentials.IndexOf (':'); - if (colonIdx <= 0) - return false; + bool IsValidProxyAuth (string? proxyAuthorization) + { + if (proxyAuthorization is null || !proxyAuthorization.StartsWith ("Basic ", StringComparison.Ordinal)) + return false; - var user = credentials.Substring (0, colonIdx); - var password = credentials.Substring (colonIdx + 1); - return user == requiredUser && password == requiredPassword; - } catch { + try { + var credentials = Encoding.UTF8.GetString (Convert.FromBase64String (proxyAuthorization.Substring ("Basic ".Length))); + var colonIdx = credentials.IndexOf (':'); + if (colonIdx <= 0) return false; - } - } - static string? FindHeader (List> headers, string name) - { - foreach (var header in headers) { - if (string.Equals (header.Key, name, StringComparison.OrdinalIgnoreCase)) - return header.Value; - } - return null; + var user = credentials.Substring (0, colonIdx); + var password = credentials.Substring (colonIdx + 1); + return user == requiredUser && password == requiredPassword; + } catch { + return false; } + } - static bool IsHopByHopHeader (string name) - { - switch (name.ToLowerInvariant ()) { - case "connection": - case "keep-alive": - case "proxy-authenticate": - case "proxy-authorization": - case "te": - case "trailer": - case "transfer-encoding": - case "upgrade": - return true; - default: - return false; - } + static string? FindHeader (List> headers, string name) + { + foreach (var header in headers) { + if (string.Equals (header.Key, name, StringComparison.OrdinalIgnoreCase)) + return header.Value; } + return null; + } - static async Task ReadLineAsync (NetworkStream stream) - { - var builder = new StringBuilder (); - var buffer = new byte [1]; - while (true) { - var read = await stream.ReadAsync (buffer, 0, 1).ConfigureAwait (false); - if (read <= 0) - return builder.Length == 0 ? null : builder.ToString (); - - var c = (char) buffer [0]; - if (c == '\n') - break; - if (c != '\r') - builder.Append (c); - } - return builder.ToString (); + static bool IsHopByHopHeader (string name) + { + switch (name.ToLowerInvariant ()) { + case "connection": + case "keep-alive": + case "proxy-authenticate": + case "proxy-authorization": + case "te": + case "trailer": + case "transfer-encoding": + case "upgrade": + return true; + default: + return false; } + } - static async Task WriteResponseAsync (NetworkStream stream, int statusCode, string reasonPhrase, List> headers, byte [] content) - { - var builder = new StringBuilder (); - builder.Append ("HTTP/1.1 ").Append (statusCode).Append (' ').Append (reasonPhrase).Append ("\r\n"); - foreach (var header in headers) - builder.Append (header.Key).Append (": ").Append (header.Value).Append ("\r\n"); - builder.Append ("Content-Length: ").Append (content.Length).Append ("\r\n"); - // Force the connection closed so we don't have to deal with keep-alive framing. - builder.Append ("Connection: close\r\n"); - builder.Append ("\r\n"); - - var headerBytes = Encoding.ASCII.GetBytes (builder.ToString ()); - await stream.WriteAsync (headerBytes, 0, headerBytes.Length).ConfigureAwait (false); - if (content.Length > 0) - await stream.WriteAsync (content, 0, content.Length).ConfigureAwait (false); - await stream.FlushAsync ().ConfigureAwait (false); + static async Task ReadLineAsync (NetworkStream stream) + { + var builder = new StringBuilder (); + var buffer = new byte [1]; + while (true) { + var read = await stream.ReadAsync (buffer, 0, 1).ConfigureAwait (false); + if (read <= 0) + return builder.Length == 0 ? null : builder.ToString (); + + var c = (char) buffer [0]; + if (c == '\n') + break; + if (c != '\r') + builder.Append (c); } + return builder.ToString (); + } + + static async Task WriteResponseAsync (NetworkStream stream, int statusCode, string reasonPhrase, List> headers, byte [] content) + { + var builder = new StringBuilder (); + builder.Append ("HTTP/1.1 ").Append (statusCode).Append (' ').Append (reasonPhrase).Append ("\r\n"); + foreach (var header in headers) + builder.Append (header.Key).Append (": ").Append (header.Value).Append ("\r\n"); + builder.Append ("Content-Length: ").Append (content.Length).Append ("\r\n"); + // Force the connection closed so we don't have to deal with keep-alive framing. + builder.Append ("Connection: close\r\n"); + builder.Append ("\r\n"); + + var headerBytes = Encoding.ASCII.GetBytes (builder.ToString ()); + await stream.WriteAsync (headerBytes, 0, headerBytes.Length).ConfigureAwait (false); + if (content.Length > 0) + await stream.WriteAsync (content, 0, content.Length).ConfigureAwait (false); + await stream.FlushAsync ().ConfigureAwait (false); + } public void Dispose () { From beec85501567548e31bc9a9b5ccbd8d4f70373df Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Fri, 10 Jul 2026 17:00:03 +0200 Subject: [PATCH 09/16] [tests] Fix proxy-auth tests: avoid CFNetwork localhost proxy bypass CFNetwork bypasses the configured proxy for HTTPS (CONNECT) requests to localhost destinations, so the proxy never saw the request and AuthenticatedRequestCount stayed 0 on macOS and Mac Catalyst. Request a non-local hostname instead (so CFNetwork routes the CONNECT through the proxy) and have the test proxy tunnel every CONNECT to the local TLS test server via a new forceTunnelPort option. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../System.Net.Http/NSUrlSessionHandlerTest.cs | 14 +++++++++----- .../System.Net.Http/ProxyTestServer.cs | 17 ++++++++++++++--- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/tests/monotouch-test/System.Net.Http/NSUrlSessionHandlerTest.cs b/tests/monotouch-test/System.Net.Http/NSUrlSessionHandlerTest.cs index ffce3ced8a92..77fd6c2168fa 100644 --- a/tests/monotouch-test/System.Net.Http/NSUrlSessionHandlerTest.cs +++ b/tests/monotouch-test/System.Net.Http/NSUrlSessionHandlerTest.cs @@ -434,17 +434,20 @@ public void ProxyWithCredentialsAuthenticatesWithProxy () { const string proxyUser = "proxyuser"; const string proxyPass = "proxypass"; - using var proxy = new ProxyTestServer (proxyUser, proxyPass); // NSUrlSession only delivers a proxy authentication challenge to the delegate for CONNECT // tunnels (i.e. HTTPS destinations); for a plain HTTP forward proxy it returns the 407 // directly to the caller. So we route an HTTPS request through the proxy's CONNECT support. + // We also request a non-local hostname: CFNetwork bypasses the proxy for localhost HTTPS + // destinations, so we must use a hostname that isn't local. The proxy tunnels every CONNECT + // to our local TLS test server regardless of the requested host. Network.NWListener? destination = null; HttpStatusCode? statusCode = null; try { destination = TlsTestServer.CreateNWTlsListener (requireClientCert: false); var destinationPort = destination.Port; + using var proxy = new ProxyTestServer (proxyUser, proxyPass, forceTunnelPort: (int) destinationPort); var done = TestRuntime.TryRunAsync (TimeSpan.FromSeconds (30), async () => { using var handler = new NSUrlSessionHandler (); @@ -453,7 +456,7 @@ public void ProxyWithCredentialsAuthenticatesWithProxy () }; handler.TrustOverrideForUrl = (sender, url, trust) => true; using var client = new HttpClient (handler); - var response = await client.GetAsync ($"https://localhost:{destinationPort}/").ConfigureAwait (false); + var response = await client.GetAsync ("https://proxy-tunnel-target.example/").ConfigureAwait (false); statusCode = response.StatusCode; }, out var ex); @@ -476,15 +479,16 @@ public void ProxyWithDefaultProxyCredentialsAuthenticatesWithProxy () { const string proxyUser = "proxyuser"; const string proxyPass = "proxypass"; - using var proxy = new ProxyTestServer (proxyUser, proxyPass); - // See ProxyWithCredentialsAuthenticatesWithProxy for why we use an HTTPS (CONNECT) request. + // See ProxyWithCredentialsAuthenticatesWithProxy for why we use an HTTPS (CONNECT) request + // with a non-local hostname and tunnel every CONNECT to a local TLS test server. Network.NWListener? destination = null; HttpStatusCode? statusCode = null; try { destination = TlsTestServer.CreateNWTlsListener (requireClientCert: false); var destinationPort = destination.Port; + using var proxy = new ProxyTestServer (proxyUser, proxyPass, forceTunnelPort: (int) destinationPort); var done = TestRuntime.TryRunAsync (TimeSpan.FromSeconds (30), async () => { using var handler = new NSUrlSessionHandler (); @@ -492,7 +496,7 @@ public void ProxyWithDefaultProxyCredentialsAuthenticatesWithProxy () handler.DefaultProxyCredentials = new NetworkCredential (proxyUser, proxyPass); handler.TrustOverrideForUrl = (sender, url, trust) => true; using var client = new HttpClient (handler); - var response = await client.GetAsync ($"https://localhost:{destinationPort}/").ConfigureAwait (false); + var response = await client.GetAsync ("https://proxy-tunnel-target.example/").ConfigureAwait (false); statusCode = response.StatusCode; }, out var ex); diff --git a/tests/monotouch-test/System.Net.Http/ProxyTestServer.cs b/tests/monotouch-test/System.Net.Http/ProxyTestServer.cs index 0943befd0c8d..7d7d0c42f5bb 100644 --- a/tests/monotouch-test/System.Net.Http/ProxyTestServer.cs +++ b/tests/monotouch-test/System.Net.Http/ProxyTestServer.cs @@ -27,6 +27,7 @@ sealed class ProxyTestServer : IDisposable { readonly TcpListener listener; readonly string? requiredUser; readonly string? requiredPassword; + readonly int forceTunnelPort; int requestCount; int authenticatedRequestCount; @@ -40,10 +41,15 @@ sealed class ProxyTestServer : IDisposable { public string Url => $"http://127.0.0.1:{Port}"; - public ProxyTestServer (string? requiredUser = null, string? requiredPassword = null) + // forceTunnelPort: when non-zero, every CONNECT request is tunneled to 127.0.0.1:forceTunnelPort + // regardless of the requested target host. This lets a test request an HTTPS URL with a non-local + // hostname (so CFNetwork actually routes it through the proxy instead of bypassing the proxy for + // localhost destinations) while still tunneling to a local TLS test server. + public ProxyTestServer (string? requiredUser = null, string? requiredPassword = null, int forceTunnelPort = 0) { this.requiredUser = requiredUser; this.requiredPassword = requiredPassword; + this.forceTunnelPort = forceTunnelPort; listener = new TcpListener (IPAddress.Loopback, 0); listener.Start (); @@ -155,9 +161,14 @@ await WriteResponseAsync (clientStream, 407, "Proxy Authentication Required", host = target.Substring (0, colonIdx); int.TryParse (target.Substring (colonIdx + 1), out port); } - // The TLS test server binds to 127.0.0.1, so make sure we connect there (and not ::1). - if (string.Equals (host, "localhost", StringComparison.OrdinalIgnoreCase)) + if (forceTunnelPort != 0) { + // Ignore the requested target and always tunnel to the local TLS test server. host = "127.0.0.1"; + port = forceTunnelPort; + } else if (string.Equals (host, "localhost", StringComparison.OrdinalIgnoreCase)) { + // The TLS test server binds to 127.0.0.1, so make sure we connect there (and not ::1). + host = "127.0.0.1"; + } using var upstream = new TcpClient (); await upstream.ConnectAsync (host, port).ConfigureAwait (false); From 91e707811cfdbcdc76cf09f82839d6597a36e5ee Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 14 Jul 2026 15:29:22 +0200 Subject: [PATCH 10/16] Address PR review comments - NSUrlSessionHandler.SendAsync: mark the handler non-modifiable (set sentRequest) before configuring the session proxy, so handler properties can't be mutated once the first request has started. - ProxyTestServer.ReadBodyAsync: if the client disconnects early, return only the bytes actually read instead of a buffer padded with trailing zero bytes. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- src/Foundation/NSUrlSessionHandler.cs | 7 +++++-- tests/monotouch-test/System.Net.Http/ProxyTestServer.cs | 4 ++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/Foundation/NSUrlSessionHandler.cs b/src/Foundation/NSUrlSessionHandler.cs index 46b3af4f96b3..87a993cce670 100644 --- a/src/Foundation/NSUrlSessionHandler.cs +++ b/src/Foundation/NSUrlSessionHandler.cs @@ -534,10 +534,13 @@ bool TryGetProxyDictionary (Uri? destination, out NSDictionary? proxyDictionary) /// To be added. protected override async Task SendAsync (HttpRequestMessage request, CancellationToken cancellationToken) { - ConfigureSessionProxy (request); - + // Mark the handler as non-modifiable before any per-first-request initialization (such as + // configuring the session proxy), so other threads can't mutate handler properties once the + // first request has started being processed. Volatile.Write (ref sentRequest, true); + ConfigureSessionProxy (request); + var nsrequest = await CreateRequest (request).ConfigureAwait (false); var dataTask = session.CreateDataTask (nsrequest); diff --git a/tests/monotouch-test/System.Net.Http/ProxyTestServer.cs b/tests/monotouch-test/System.Net.Http/ProxyTestServer.cs index 7d7d0c42f5bb..31400d0e4502 100644 --- a/tests/monotouch-test/System.Net.Http/ProxyTestServer.cs +++ b/tests/monotouch-test/System.Net.Http/ProxyTestServer.cs @@ -199,6 +199,10 @@ await WriteResponseAsync (clientStream, 407, "Proxy Authentication Required", break; read += r; } + // If the client disconnected early, return only the bytes we actually read (rather than a + // buffer padded with trailing zero bytes). + if (read < length) + Array.Resize (ref body, read); return body; } From 6027f05942c9b9e2b98ca4e1dfc73ba6c0fe6cb9 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 14 Jul 2026 19:20:46 +0200 Subject: [PATCH 11/16] Address PR review comments (round 2) - NSUrlSessionHandler: look up proxy credentials with the lowercase "basic" auth type to match the casing used elsewhere in the handler (TryGetAuthenticationType) so CredentialCache proxy credentials are found; cache the Proxy accessor. - ProxyTestServer: avoid the banned null-forgiving operator in the header parsing loop; log (instead of silently swallowing) errors while handling a client; narrow the broad catch clauses in IsValidProxyAuth and Dispose to the specific expected exception types. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- src/Foundation/NSUrlSessionHandler.cs | 5 ++-- .../System.Net.Http/ProxyTestServer.cs | 23 ++++++++++++------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/Foundation/NSUrlSessionHandler.cs b/src/Foundation/NSUrlSessionHandler.cs index 87a993cce670..cfa8e4b44571 100644 --- a/src/Foundation/NSUrlSessionHandler.cs +++ b/src/Foundation/NSUrlSessionHandler.cs @@ -1275,12 +1275,13 @@ void DidReceiveChallengeImpl (NSUrlSession session, NSUrlSessionTask task, NSUrl // rather than a specific scheme like Basic, and the credentials come from the proxy configuration // (the proxy's own credentials or the DefaultProxyCredentials). if (challenge.ProtectionSpace.IsProxy) { - var proxyCredentials = sessionHandler.Proxy?.Credentials ?? sessionHandler.DefaultProxyCredentials; + var proxy = sessionHandler.Proxy; + var proxyCredentials = proxy?.Credentials ?? sessionHandler.DefaultProxyCredentials; // Only provide the credentials for the first challenge; if they were rejected we let the request // fail instead of retrying the same (bad) credentials indefinitely. if (proxyCredentials is not null && challenge.PreviousFailureCount == 0) { var proxyUri = GetProxyLookupUri (challenge.ProtectionSpace); - var proxyCredential = proxyCredentials.GetCredential (proxyUri, "Basic"); + var proxyCredential = proxyCredentials.GetCredential (proxyUri, "basic"); if (proxyCredential is not null) { var proxyNSCredential = new NSUrlCredential (proxyCredential.UserName, proxyCredential.Password, NSUrlCredentialPersistence.ForSession); completionHandler (NSUrlSessionAuthChallengeDisposition.UseCredential, proxyNSCredential); diff --git a/tests/monotouch-test/System.Net.Http/ProxyTestServer.cs b/tests/monotouch-test/System.Net.Http/ProxyTestServer.cs index 31400d0e4502..e9ee3b818c21 100644 --- a/tests/monotouch-test/System.Net.Http/ProxyTestServer.cs +++ b/tests/monotouch-test/System.Net.Http/ProxyTestServer.cs @@ -78,8 +78,10 @@ async Task HandleClientSafe (TcpClient client) using (var stream = client.GetStream ()) { await HandleClient (stream).ConfigureAwait (false); } - } catch { - // This is a test proxy, so just swallow any errors. + } catch (Exception e) { + // This is a test proxy, so don't let errors bring down the process, but log them so + // test failures (which often manifest as timeouts) are actionable. + Console.WriteLine ($"ProxyTestServer: error handling client: {e}"); } } @@ -97,9 +99,11 @@ async Task HandleClient (NetworkStream stream) var target = parts [1]; var headers = new List> (); - string? line; - while (!string.IsNullOrEmpty (line = await ReadLineAsync (stream).ConfigureAwait (false))) { - var idx = line!.IndexOf (':'); + while (true) { + var line = await ReadLineAsync (stream).ConfigureAwait (false); + if (string.IsNullOrEmpty (line)) + break; + var idx = line.IndexOf (':'); if (idx > 0) headers.Add (new KeyValuePair (line.Substring (0, idx).Trim (), line.Substring (idx + 1).Trim ())); } @@ -271,7 +275,8 @@ bool IsValidProxyAuth (string? proxyAuthorization) var user = credentials.Substring (0, colonIdx); var password = credentials.Substring (colonIdx + 1); return user == requiredUser && password == requiredPassword; - } catch { + } catch (FormatException) { + // Invalid base64. return false; } } @@ -342,8 +347,10 @@ public void Dispose () { try { listener.Stop (); - } catch { - // ignore + } catch (SocketException) { + // ignore errors during cleanup + } catch (ObjectDisposedException) { + // already disposed } } } From d2aeaa45265dae863cdd146ef79efb02606d761f Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Wed, 15 Jul 2026 13:30:19 +0200 Subject: [PATCH 12/16] [tests] Don't ignore CI failures for the local-only proxy tests The new proxy tests use in-process servers bound to 127.0.0.1, so local network connections should be reliable and we don't want to hide any failures by ignoring them in CI. Gate the IgnoreInCI/IgnoreInCIIfBadNetwork calls in the new proxy tests behind a new ignoreLocalOnlyCIFailures field (default false) so the ignoring can be re-enabled easily if needed. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../NSUrlSessionHandlerTest.cs | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/tests/monotouch-test/System.Net.Http/NSUrlSessionHandlerTest.cs b/tests/monotouch-test/System.Net.Http/NSUrlSessionHandlerTest.cs index 77fd6c2168fa..d8f46183913b 100644 --- a/tests/monotouch-test/System.Net.Http/NSUrlSessionHandlerTest.cs +++ b/tests/monotouch-test/System.Net.Http/NSUrlSessionHandlerTest.cs @@ -18,6 +18,12 @@ namespace MonoTests.System.Net.Http { [Preserve (AllMembers = true)] public class NSUrlSessionHandlerTest { + // The proxy tests below use in-process servers bound to 127.0.0.1, so local network + // connections should be reliable and we don't want to hide any failures by ignoring them + // in CI. Set this to true to restore the usual "ignore transient network failures in CI" + // behavior if these tests ever turn out to be flaky on the bots. + bool ignoreLocalOnlyCIFailures = false; + // https://github.com/dotnet/macios/issues/23958 [Test] public void DecompressedResponseDoesNotHaveContentEncodingOrContentLength () @@ -419,10 +425,12 @@ public void ProxyRoutesRequestsThroughProxy () }, out var ex); if (!done) { - TestRuntime.IgnoreInCI ("Transient localhost server failure - ignore in CI"); + if (ignoreLocalOnlyCIFailures) + TestRuntime.IgnoreInCI ("Transient localhost server failure - ignore in CI"); Assert.Inconclusive ("Request timed out."); } - TestRuntime.IgnoreInCIIfBadNetwork (ex); + if (ignoreLocalOnlyCIFailures) + TestRuntime.IgnoreInCIIfBadNetwork (ex); Assert.That (ex, Is.Null, $"Exception: {ex}"); Assert.That (statusCode, Is.EqualTo (HttpStatusCode.OK), "Status code"); Assert.That (viaProxy, Is.True, "Response should have gone through the test proxy"); @@ -461,10 +469,12 @@ public void ProxyWithCredentialsAuthenticatesWithProxy () }, out var ex); if (!done) { - TestRuntime.IgnoreInCI ("Transient localhost server failure - ignore in CI"); + if (ignoreLocalOnlyCIFailures) + TestRuntime.IgnoreInCI ("Transient localhost server failure - ignore in CI"); Assert.Inconclusive ("Request timed out."); } - TestRuntime.IgnoreInCIIfBadNetwork (ex); + if (ignoreLocalOnlyCIFailures) + TestRuntime.IgnoreInCIIfBadNetwork (ex); Assert.That (ex, Is.Null, $"Exception: {ex}"); Assert.That (statusCode, Is.EqualTo (HttpStatusCode.OK), $"Status code (proxy credentials should have been used); status={statusCode}, requestCount={proxy.RequestCount}, authRequestCount={proxy.AuthenticatedRequestCount}"); Assert.That (proxy.AuthenticatedRequestCount, Is.GreaterThan (0), "Proxy should have established an authenticated tunnel"); @@ -501,10 +511,12 @@ public void ProxyWithDefaultProxyCredentialsAuthenticatesWithProxy () }, out var ex); if (!done) { - TestRuntime.IgnoreInCI ("Transient localhost server failure - ignore in CI"); + if (ignoreLocalOnlyCIFailures) + TestRuntime.IgnoreInCI ("Transient localhost server failure - ignore in CI"); Assert.Inconclusive ("Request timed out."); } - TestRuntime.IgnoreInCIIfBadNetwork (ex); + if (ignoreLocalOnlyCIFailures) + TestRuntime.IgnoreInCIIfBadNetwork (ex); Assert.That (ex, Is.Null, $"Exception: {ex}"); Assert.That (statusCode, Is.EqualTo (HttpStatusCode.OK), $"Status code (default proxy credentials should have been used); status={statusCode}, requestCount={proxy.RequestCount}, authRequestCount={proxy.AuthenticatedRequestCount}"); Assert.That (proxy.AuthenticatedRequestCount, Is.GreaterThan (0), "Proxy should have established an authenticated tunnel"); From 127b6ade29dac07f168858a6d95fe8dac49c8e9e Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 16 Jul 2026 17:43:31 +0200 Subject: [PATCH 13/16] [Foundation] Address proxy-support review feedback Follow-up fixes to the NSUrlSessionHandler proxy support based on a multi-model review: * Proxy authentication now looks up credentials using the proxy's actual authentication method (Basic/Digest/NTLM) instead of a hardcoded "basic", falling back to "basic" for unrecognized methods. This lets a CredentialCache keyed by a specific scheme resolve correctly while preserving the behavior for a plain NetworkCredential. * GetProxyLookupUri now derives the scheme from the protection space's proxy type (HTTP vs HTTPS proxy) instead of ReceivesCredentialSecurely (which describes whether the auth method protects credentials, not the proxy protocol). * A proxy authentication challenge is no longer short-circuited by the request's server-targeted Authorization header (the origin Authorization check now excludes proxy protection spaces). * IPv6 proxy hosts are now passed to CFNetwork via Uri.DnsSafeHost instead of Uri.Host, which would include the surrounding brackets. * Dispose and ConfigureSessionProxy are now synchronized via the proxy configuration lock (plus a 'disposed' flag), so a session recreated for proxy configuration can't escape invalidation on Dispose. * proxyConfigured is only set after the configuration has been applied, so a throwing IWebProxy doesn't permanently leave the session unconfigured. * Documented (in xml docs) that the proxy is evaluated once (using the first request's destination) with the resulting per-destination consequences, and that proxy authentication is only supported for HTTPS destinations (CONNECT tunnels). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: b8526289-aa4e-4ee5-bb43-174fda6f0c41 --- src/Foundation/NSUrlSessionHandler.cs | 69 ++++++++++++++++++++------- 1 file changed, 51 insertions(+), 18 deletions(-) diff --git a/src/Foundation/NSUrlSessionHandler.cs b/src/Foundation/NSUrlSessionHandler.cs index cfa8e4b44571..c09d4417c1bd 100644 --- a/src/Foundation/NSUrlSessionHandler.cs +++ b/src/Foundation/NSUrlSessionHandler.cs @@ -210,7 +210,13 @@ protected override void Dispose (bool disposing) task.Dispose (); } - session.InvalidateAndCancel (); + // Take the proxy configuration lock so we don't race with ConfigureSessionProxy: either we + // invalidate the session it created (if it ran first), or it observes 'disposed' and doesn't + // create a new session that would never be invalidated (if we ran first). + lock (proxyConfigurationLock) { + disposed = true; + session.InvalidateAndCancel (); + } base.Dispose (disposing); } @@ -451,6 +457,7 @@ async Task CreateRequest (HttpRequestMessage request) readonly object proxyConfigurationLock = new object (); bool proxyConfigured; + bool disposed; // NSUrlSession applies proxy settings per-session (via the configuration's connection proxy dictionary), // not per-request, so we compute the proxy configuration once (using the first request's destination) and @@ -460,16 +467,24 @@ void ConfigureSessionProxy (HttpRequestMessage request) lock (proxyConfigurationLock) { if (proxyConfigured) return; - proxyConfigured = true; - if (!TryGetProxyDictionary (request.RequestUri, out var proxyDictionary)) + // The handler has been disposed (and the session already invalidated); don't create a new + // session, since it would never be invalidated. + if (disposed) return; - var oldSession = session; - var configuration = session.Configuration; - configuration.ConnectionProxyDictionary = proxyDictionary; - session = NSUrlSession.FromConfiguration (configuration, (INSUrlSessionDelegate) new NSUrlSessionHandlerDelegate (this), null); - oldSession.Dispose (); + if (TryGetProxyDictionary (request.RequestUri, out var proxyDictionary)) { + var oldSession = session; + var configuration = session.Configuration; + configuration.ConnectionProxyDictionary = proxyDictionary; + session = NSUrlSession.FromConfiguration (configuration, (INSUrlSessionDelegate) new NSUrlSessionHandlerDelegate (this), null); + oldSession.Dispose (); + } + + // Only mark the proxy as configured once we've successfully computed and applied the + // configuration, so that a failure (e.g. a throwing IWebProxy) doesn't permanently leave the + // session unconfigured while pretending otherwise (the next request will try again). + proxyConfigured = true; } } @@ -505,9 +520,9 @@ bool TryGetProxyDictionary (Uri? destination, out NSDictionary? proxyDictionary) var strongProxy = new ProxyConfigurationDictionary { HttpEnable = true, - HttpProxyHost = proxyUri.Host, + HttpProxyHost = proxyUri.DnsSafeHost, HttpProxyPort = proxyUri.Port, - HttpsProxyHost = proxyUri.Host, + HttpsProxyHost = proxyUri.DnsSafeHost, HttpsProxyPort = proxyUri.Port, #if MONOMAC HttpsEnable = true, @@ -645,7 +660,10 @@ public X509CertificateCollection ClientCertificates { /// The credentials to submit to the proxy server for authentication. /// The credentials to use to authenticate with the proxy, or to not provide any proxy credentials. - /// These credentials are only used when the proxy itself () doesn't provide its own credentials. + /// + /// These credentials are only used when the proxy itself () doesn't provide its own credentials. + /// Proxy authentication is only supported for HTTPS destinations (which are proxied using a CONNECT tunnel). For plain HTTP destinations NSUrlSession doesn't deliver a proxy authentication challenge, so these credentials aren't applied and an authenticating proxy will return an HTTP 407 response instead. + /// public ICredentials? DefaultProxyCredentials { get { return defaultProxyCredentials; @@ -709,7 +727,13 @@ public bool PreAuthenticate { /// The custom proxy to use, or to use the proxies configured in the operating system. /// /// Setting this property only has an effect if is (which is the default value). - /// NSUrlSession applies proxy settings per-session, not per-request, so the proxy returned by for the first request is applied to every request made by this handler. + /// NSUrlSession applies proxy settings per-session, not per-request, so the proxy is evaluated only once, using the destination of the first request sent by this handler, and the result is applied to every subsequent request made by this handler. + /// + /// This has important consequences when a single handler is reused for requests to multiple destinations: the proxy's per-destination decisions ( and the proxy returned by ) are computed from the first request's destination only. + /// As a result a proxy's bypass list and any destination-dependent proxy selection are not honored for later requests to other destinations: requests that should have been proxied might be sent directly (or through the wrong proxy), and requests that should have bypassed the proxy might be sent through it. + /// + /// If per-destination proxy behavior is required, use a separate (and thus a separate ) for each destination or proxy configuration. + /// Proxy authentication (using 's own credentials or ) is only supported for HTTPS destinations (which are proxied using a CONNECT tunnel). For plain HTTP destinations NSUrlSession doesn't deliver a proxy authentication challenge, so proxy credentials aren't applied and an authenticating proxy will return an HTTP 407 response instead. /// public IWebProxy? Proxy { get { @@ -1245,8 +1269,10 @@ void DidReceiveChallengeImpl (NSUrlSession session, NSUrlSessionTask task, NSUrl // but we are hiding such a situation from our users, we can nevertheless know if the header was added and deal with it. The idea is as follows, // check if we are in the first attempt, if we are (PreviousFailureCount == 0), we check the headers of the request and if we do have the Auth // header, it means that we do not have the correct credentials, in any other case just do what it is expected. + // This only applies to server authentication challenges: a proxy authentication challenge is unrelated to + // the request's (server-targeted) Authorization header, so it's handled separately below. - if (challenge.PreviousFailureCount == 0) { + if (challenge.PreviousFailureCount == 0 && !challenge.ProtectionSpace.IsProxy) { var authHeader = inflight.Request.Headers?.Authorization; if (!(string.IsNullOrEmpty (authHeader?.Scheme) && string.IsNullOrEmpty (authHeader?.Parameter))) { completionHandler (NSUrlSessionAuthChallengeDisposition.RejectProtectionSpace, null!); @@ -1271,9 +1297,8 @@ void DidReceiveChallengeImpl (NSUrlSession session, NSUrlSessionTask task, NSUrl } // Proxy authentication challenges are handled separately from server authentication challenges: - // for a proxy the protection space reports a proxy authentication method (HTTPProxy/HTTPSProxy) - // rather than a specific scheme like Basic, and the credentials come from the proxy configuration - // (the proxy's own credentials or the DefaultProxyCredentials). + // the credentials come from the proxy configuration (the proxy's own credentials or the + // DefaultProxyCredentials) rather than from the handler's Credentials property. if (challenge.ProtectionSpace.IsProxy) { var proxy = sessionHandler.Proxy; var proxyCredentials = proxy?.Credentials ?? sessionHandler.DefaultProxyCredentials; @@ -1281,7 +1306,13 @@ void DidReceiveChallengeImpl (NSUrlSession session, NSUrlSessionTask task, NSUrl // fail instead of retrying the same (bad) credentials indefinitely. if (proxyCredentials is not null && challenge.PreviousFailureCount == 0) { var proxyUri = GetProxyLookupUri (challenge.ProtectionSpace); - var proxyCredential = proxyCredentials.GetCredential (proxyUri, "basic"); + // Look up the credentials using the proxy's authentication method (Basic/Digest/NTLM), so + // that a CredentialCache keyed by a specific scheme resolves correctly. Fall back to "basic" + // for any authentication method we don't recognize: a plain NetworkCredential ignores the + // authentication type anyway, so this preserves the behavior for the common case. + if (!TryGetAuthenticationType (challenge.ProtectionSpace, out var proxyAuthType) || proxyAuthType == RejectProtectionSpaceAuthType) + proxyAuthType = "basic"; + var proxyCredential = proxyCredentials.GetCredential (proxyUri, proxyAuthType); if (proxyCredential is not null) { var proxyNSCredential = new NSUrlCredential (proxyCredential.UserName, proxyCredential.Password, NSUrlCredentialPersistence.ForSession); completionHandler (NSUrlSessionAuthChallengeDisposition.UseCredential, proxyNSCredential); @@ -1334,7 +1365,9 @@ void DidReceiveChallengeImpl (NSUrlSession session, NSUrlSessionTask task, NSUrl static Uri GetProxyLookupUri (NSUrlProtectionSpace protectionSpace) { - var scheme = protectionSpace.ReceivesCredentialSecurely ? "https" : "http"; + // Derive the scheme from the proxy type (HTTP vs HTTPS proxy), not from ReceivesCredentialSecurely + // (which describes whether the authentication method protects the credentials, not the proxy protocol). + var scheme = protectionSpace.ProxyType == (string) NSUrlProtectionSpace.HTTPSProxy ? "https" : "http"; var builder = new UriBuilder (scheme, protectionSpace.Host, (int) protectionSpace.Port); return builder.Uri; } From 4ecd0d56487593e2ed440e30105d9f97aedeee61 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Fri, 17 Jul 2026 15:41:10 +0200 Subject: [PATCH 14/16] [tests] Update expected sizes. --- .../expected/MacCatalyst-MonoVM-interpreter-size.txt | 6 +++--- .../UnitTests/expected/MacCatalyst-MonoVM-size.txt | 6 +++--- .../MacCatalyst-NativeAOT-TrimmableStatic-size.txt | 4 ++-- .../UnitTests/expected/MacCatalyst-NativeAOT-size.txt | 4 ++-- ...MacOSX-CoreCLR-Interpreter-TrimmableStatic-size.txt | 10 +++++----- .../expected/MacOSX-CoreCLR-Interpreter-size.txt | 10 +++++----- .../expected/MacOSX-NativeAOT-TrimmableStatic-size.txt | 4 ++-- .../UnitTests/expected/MacOSX-NativeAOT-size.txt | 4 ++-- .../expected/TVOS-MonoVM-interpreter-size.txt | 4 ++-- tests/dotnet/UnitTests/expected/TVOS-MonoVM-size.txt | 4 ++-- .../expected/TVOS-NativeAOT-TrimmableStatic-size.txt | 6 +++--- .../dotnet/UnitTests/expected/TVOS-NativeAOT-size.txt | 4 ++-- .../UnitTests/expected/iOS-MonoVM-interpreter-size.txt | 4 ++-- tests/dotnet/UnitTests/expected/iOS-MonoVM-size.txt | 4 ++-- .../expected/iOS-NativeAOT-TrimmableStatic-size.txt | 6 +++--- tests/dotnet/UnitTests/expected/iOS-NativeAOT-size.txt | 4 ++-- 16 files changed, 42 insertions(+), 42 deletions(-) diff --git a/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-interpreter-size.txt b/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-interpreter-size.txt index 84bbedb60271..3b349e833c8a 100644 --- a/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-interpreter-size.txt +++ b/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-interpreter-size.txt @@ -1,9 +1,9 @@ -AppBundleSize: 5,793,834 bytes (5,658.0 KB = 5.5 MB) +AppBundleSize: 5,793,245 bytes (5,657.5 KB = 5.5 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/Info.plist: - 1,077 bytes (1.1 KB = 0.0 MB) + 1,096 bytes (1.1 KB = 0.0 MB) Contents/MacOS/SizeTestApp: - 4,573,528 bytes (4,466.3 KB = 4.4 MB) + 4,572,920 bytes (4,465.7 KB = 4.4 MB) Contents/MonoBundle/Microsoft.MacCatalyst.dll: 157,696 bytes (154.0 KB = 0.2 MB) Contents/MonoBundle/runtimeconfig.bin: diff --git a/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-size.txt b/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-size.txt index 7fe6d26e0dfd..2179a507afd8 100644 --- a/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-size.txt +++ b/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-size.txt @@ -1,9 +1,9 @@ -AppBundleSize: 16,383,926 bytes (15,999.9 KB = 15.6 MB) +AppBundleSize: 16,383,321 bytes (15,999.3 KB = 15.6 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/Info.plist: - 1,077 bytes (1.1 KB = 0.0 MB) + 1,096 bytes (1.1 KB = 0.0 MB) Contents/MacOS/SizeTestApp: - 13,876,856 bytes (13,551.6 KB = 13.2 MB) + 13,876,232 bytes (13,551.0 KB = 13.2 MB) Contents/MonoBundle/aot-instances.aotdata.arm64: 1,045,352 bytes (1,020.9 KB = 1.0 MB) Contents/MonoBundle/Microsoft.MacCatalyst.aotdata.arm64: diff --git a/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-TrimmableStatic-size.txt b/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-TrimmableStatic-size.txt index 38bfcfd1250d..aa4cc923901c 100644 --- a/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-TrimmableStatic-size.txt +++ b/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-TrimmableStatic-size.txt @@ -1,7 +1,7 @@ -AppBundleSize: 13,933,496 bytes (13,606.9 KB = 13.3 MB) +AppBundleSize: 13,933,552 bytes (13,607.0 KB = 13.3 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/Info.plist: - 1,040 bytes (1.0 KB = 0.0 MB) + 1,096 bytes (1.1 KB = 0.0 MB) Contents/MacOS/SizeTestApp: 13,930,552 bytes (13,604.1 KB = 13.3 MB) Contents/MonoBundle/runtimeconfig.bin: diff --git a/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-size.txt b/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-size.txt index 64e0eaf11b70..73a3f5ae23e8 100644 --- a/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-size.txt +++ b/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-size.txt @@ -1,7 +1,7 @@ -AppBundleSize: 6,144,965 bytes (6,000.9 KB = 5.9 MB) +AppBundleSize: 6,144,984 bytes (6,001.0 KB = 5.9 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/Info.plist: - 1,077 bytes (1.1 KB = 0.0 MB) + 1,096 bytes (1.1 KB = 0.0 MB) Contents/MacOS/SizeTestApp: 6,142,072 bytes (5,998.1 KB = 5.9 MB) Contents/MonoBundle/runtimeconfig.bin: diff --git a/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-TrimmableStatic-size.txt b/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-TrimmableStatic-size.txt index b9c184de1784..c0ee3af28881 100644 --- a/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-TrimmableStatic-size.txt +++ b/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-TrimmableStatic-size.txt @@ -1,9 +1,9 @@ -AppBundleSize: 258,030,168 bytes (251,982.6 KB = 246.1 MB) +AppBundleSize: 258,032,411 bytes (251,984.8 KB = 246.1 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/Info.plist: - 755 bytes (0.7 KB = 0.0 MB) + 774 bytes (0.8 KB = 0.0 MB) Contents/MacOS/SizeTestApp: - 7,387,752 bytes (7,214.6 KB = 7.0 MB) + 7,387,928 bytes (7,214.8 KB = 7.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/_Microsoft.macOS.TypeMap.dll: 4,847,616 bytes (4,734.0 KB = 4.6 MB) Contents/MonoBundle/.xamarin/osx-arm64/_SizeTestApp.TypeMap.dll: @@ -11,7 +11,7 @@ Contents/MonoBundle/.xamarin/osx-arm64/_SizeTestApp.TypeMap.dll: Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.CSharp.dll: 892,752 bytes (871.8 KB = 0.9 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.macOS.dll: - 37,448,704 bytes (36,571.0 KB = 35.7 MB) + 37,449,728 bytes (36,572.0 KB = 35.7 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.VisualBasic.Core.dll: 1,334,608 bytes (1,303.3 KB = 1.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.VisualBasic.dll: @@ -363,7 +363,7 @@ Contents/MonoBundle/.xamarin/osx-x64/_SizeTestApp.TypeMap.dll: Contents/MonoBundle/.xamarin/osx-x64/Microsoft.CSharp.dll: 795,984 bytes (777.3 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.macOS.dll: - 37,448,704 bytes (36,571.0 KB = 35.7 MB) + 37,449,728 bytes (36,572.0 KB = 35.7 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.VisualBasic.Core.dll: 1,166,160 bytes (1,138.8 KB = 1.1 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.VisualBasic.dll: diff --git a/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-size.txt b/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-size.txt index 6a51fe5ea262..0dc512a70f7e 100644 --- a/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-size.txt +++ b/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-size.txt @@ -1,13 +1,13 @@ -AppBundleSize: 248,409,350 bytes (242,587.3 KB = 236.9 MB) +AppBundleSize: 248,411,609 bytes (242,589.5 KB = 236.9 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/Info.plist: - 755 bytes (0.7 KB = 0.0 MB) + 774 bytes (0.8 KB = 0.0 MB) Contents/MacOS/SizeTestApp: - 8,029,544 bytes (7,841.4 KB = 7.7 MB) + 8,029,736 bytes (7,841.5 KB = 7.7 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.CSharp.dll: 892,752 bytes (871.8 KB = 0.9 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.macOS.dll: - 37,167,616 bytes (36,296.5 KB = 35.4 MB) + 37,168,640 bytes (36,297.5 KB = 35.4 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.VisualBasic.Core.dll: 1,334,608 bytes (1,303.3 KB = 1.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.VisualBasic.dll: @@ -355,7 +355,7 @@ Contents/MonoBundle/.xamarin/osx-arm64/WindowsBase.dll: Contents/MonoBundle/.xamarin/osx-x64/Microsoft.CSharp.dll: 795,984 bytes (777.3 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.macOS.dll: - 37,167,616 bytes (36,296.5 KB = 35.4 MB) + 37,168,640 bytes (36,297.5 KB = 35.4 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.VisualBasic.Core.dll: 1,166,160 bytes (1,138.8 KB = 1.1 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.VisualBasic.dll: diff --git a/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-TrimmableStatic-size.txt b/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-TrimmableStatic-size.txt index 2cbde8e19965..c8d4b2995f49 100644 --- a/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-TrimmableStatic-size.txt +++ b/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-TrimmableStatic-size.txt @@ -1,7 +1,7 @@ -AppBundleSize: 32,623,366 bytes (31,858.8 KB = 31.1 MB) +AppBundleSize: 32,623,422 bytes (31,858.8 KB = 31.1 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/Info.plist: - 718 bytes (0.7 KB = 0.0 MB) + 774 bytes (0.8 KB = 0.0 MB) Contents/MacOS/SizeTestApp: 29,534,088 bytes (28,841.9 KB = 28.2 MB) Contents/MonoBundle/libSystem.Globalization.Native.dylib: diff --git a/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-size.txt b/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-size.txt index f57c4f238443..97e6175f6919 100644 --- a/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-size.txt +++ b/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-size.txt @@ -1,7 +1,7 @@ -AppBundleSize: 15,885,641 bytes (15,513.3 KB = 15.1 MB) +AppBundleSize: 15,885,660 bytes (15,513.3 KB = 15.1 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/Info.plist: - 755 bytes (0.7 KB = 0.0 MB) + 774 bytes (0.8 KB = 0.0 MB) Contents/MacOS/SizeTestApp: 12,796,408 bytes (12,496.5 KB = 12.2 MB) Contents/MonoBundle/libSystem.Globalization.Native.dylib: diff --git a/tests/dotnet/UnitTests/expected/TVOS-MonoVM-interpreter-size.txt b/tests/dotnet/UnitTests/expected/TVOS-MonoVM-interpreter-size.txt index e31c46292314..c4aaef54895c 100644 --- a/tests/dotnet/UnitTests/expected/TVOS-MonoVM-interpreter-size.txt +++ b/tests/dotnet/UnitTests/expected/TVOS-MonoVM-interpreter-size.txt @@ -1,7 +1,7 @@ -AppBundleSize: 3,571,124 bytes (3,487.4 KB = 3.4 MB) +AppBundleSize: 3,571,143 bytes (3,487.4 KB = 3.4 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Info.plist: - 1,143 bytes (1.1 KB = 0.0 MB) + 1,162 bytes (1.1 KB = 0.0 MB) Microsoft.tvOS.dll: 152,064 bytes (148.5 KB = 0.1 MB) PkgInfo: diff --git a/tests/dotnet/UnitTests/expected/TVOS-MonoVM-size.txt b/tests/dotnet/UnitTests/expected/TVOS-MonoVM-size.txt index f488d29dc707..7d45165d95b8 100644 --- a/tests/dotnet/UnitTests/expected/TVOS-MonoVM-size.txt +++ b/tests/dotnet/UnitTests/expected/TVOS-MonoVM-size.txt @@ -1,9 +1,9 @@ -AppBundleSize: 9,283,136 bytes (9,065.6 KB = 8.9 MB) +AppBundleSize: 9,283,155 bytes (9,065.6 KB = 8.9 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: aot-instances.aotdata.arm64: 827,728 bytes (808.3 KB = 0.8 MB) Info.plist: - 1,143 bytes (1.1 KB = 0.0 MB) + 1,162 bytes (1.1 KB = 0.0 MB) Microsoft.tvOS.aotdata.arm64: 22,872 bytes (22.3 KB = 0.0 MB) Microsoft.tvOS.dll: diff --git a/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-TrimmableStatic-size.txt b/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-TrimmableStatic-size.txt index 2f06e9bec565..a86a76e4f8b3 100644 --- a/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-TrimmableStatic-size.txt +++ b/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-TrimmableStatic-size.txt @@ -1,10 +1,10 @@ -AppBundleSize: 12,564,243 bytes (12,269.8 KB = 12.0 MB) +AppBundleSize: 12,564,307 bytes (12,269.8 KB = 12.0 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Info.plist: - 1,106 bytes (1.1 KB = 0.0 MB) + 1,162 bytes (1.1 KB = 0.0 MB) PkgInfo: 8 bytes (0.0 KB = 0.0 MB) runtimeconfig.bin: 1,889 bytes (1.8 KB = 0.0 MB) SizeTestApp: - 12,561,240 bytes (12,266.8 KB = 12.0 MB) + 12,561,248 bytes (12,266.8 KB = 12.0 MB) diff --git a/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-size.txt b/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-size.txt index af1981a68841..9b4bba4fdae4 100644 --- a/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-size.txt +++ b/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-size.txt @@ -1,7 +1,7 @@ -AppBundleSize: 6,065,687 bytes (5,923.5 KB = 5.8 MB) +AppBundleSize: 6,065,706 bytes (5,923.5 KB = 5.8 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Info.plist: - 1,143 bytes (1.1 KB = 0.0 MB) + 1,162 bytes (1.1 KB = 0.0 MB) PkgInfo: 8 bytes (0.0 KB = 0.0 MB) runtimeconfig.bin: diff --git a/tests/dotnet/UnitTests/expected/iOS-MonoVM-interpreter-size.txt b/tests/dotnet/UnitTests/expected/iOS-MonoVM-interpreter-size.txt index 043d06d53939..b396d2e38eb1 100644 --- a/tests/dotnet/UnitTests/expected/iOS-MonoVM-interpreter-size.txt +++ b/tests/dotnet/UnitTests/expected/iOS-MonoVM-interpreter-size.txt @@ -1,7 +1,7 @@ -AppBundleSize: 3,571,428 bytes (3,487.7 KB = 3.4 MB) +AppBundleSize: 3,571,447 bytes (3,487.7 KB = 3.4 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Info.plist: - 1,167 bytes (1.1 KB = 0.0 MB) + 1,186 bytes (1.2 KB = 0.0 MB) Microsoft.iOS.dll: 152,064 bytes (148.5 KB = 0.1 MB) PkgInfo: diff --git a/tests/dotnet/UnitTests/expected/iOS-MonoVM-size.txt b/tests/dotnet/UnitTests/expected/iOS-MonoVM-size.txt index 39a87f51d150..f2b0c597f890 100644 --- a/tests/dotnet/UnitTests/expected/iOS-MonoVM-size.txt +++ b/tests/dotnet/UnitTests/expected/iOS-MonoVM-size.txt @@ -1,9 +1,9 @@ -AppBundleSize: 9,299,552 bytes (9,081.6 KB = 8.9 MB) +AppBundleSize: 9,299,571 bytes (9,081.6 KB = 8.9 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: aot-instances.aotdata.arm64: 827,728 bytes (808.3 KB = 0.8 MB) Info.plist: - 1,167 bytes (1.1 KB = 0.0 MB) + 1,186 bytes (1.2 KB = 0.0 MB) Microsoft.iOS.aotdata.arm64: 23,216 bytes (22.7 KB = 0.0 MB) Microsoft.iOS.dll: diff --git a/tests/dotnet/UnitTests/expected/iOS-NativeAOT-TrimmableStatic-size.txt b/tests/dotnet/UnitTests/expected/iOS-NativeAOT-TrimmableStatic-size.txt index a179a43d6222..89e1eae952d7 100644 --- a/tests/dotnet/UnitTests/expected/iOS-NativeAOT-TrimmableStatic-size.txt +++ b/tests/dotnet/UnitTests/expected/iOS-NativeAOT-TrimmableStatic-size.txt @@ -1,10 +1,10 @@ -AppBundleSize: 14,152,698 bytes (13,821.0 KB = 13.5 MB) +AppBundleSize: 14,152,762 bytes (13,821.1 KB = 13.5 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Info.plist: - 1,130 bytes (1.1 KB = 0.0 MB) + 1,186 bytes (1.2 KB = 0.0 MB) PkgInfo: 8 bytes (0.0 KB = 0.0 MB) runtimeconfig.bin: 1,888 bytes (1.8 KB = 0.0 MB) SizeTestApp: - 14,149,672 bytes (13,818.0 KB = 13.5 MB) + 14,149,680 bytes (13,818.0 KB = 13.5 MB) diff --git a/tests/dotnet/UnitTests/expected/iOS-NativeAOT-size.txt b/tests/dotnet/UnitTests/expected/iOS-NativeAOT-size.txt index bd42678ecf70..09a00fcc29a7 100644 --- a/tests/dotnet/UnitTests/expected/iOS-NativeAOT-size.txt +++ b/tests/dotnet/UnitTests/expected/iOS-NativeAOT-size.txt @@ -1,7 +1,7 @@ -AppBundleSize: 6,082,415 bytes (5,939.9 KB = 5.8 MB) +AppBundleSize: 6,082,434 bytes (5,939.9 KB = 5.8 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Info.plist: - 1,167 bytes (1.1 KB = 0.0 MB) + 1,186 bytes (1.2 KB = 0.0 MB) PkgInfo: 8 bytes (0.0 KB = 0.0 MB) runtimeconfig.bin: From 6bbee6f2cb771322fa49fa4535354c31ebdcf3d2 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Fri, 17 Jul 2026 15:45:10 +0200 Subject: [PATCH 15/16] [Foundation] Throw for unsupported proxy schemes instead of silently downgrading NSUrlSession's connection proxy dictionary can only describe a plain-HTTP connection to the proxy: the HTTP/HTTPS proxy keys select which destination scheme is proxied, not the protocol used to reach the proxy, and there's no key to connect to the proxy over TLS or via SOCKS. Previously the proxy uri's scheme was ignored (only host and port were used), so a secure ('https') or SOCKS proxy would be silently connected to over plain HTTP -- doing the wrong thing. Throw a NotSupportedException for any proxy scheme other than 'http' so the misconfiguration fails loudly, and add a test. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- src/Foundation/NSUrlSessionHandler.cs | 9 ++++++ .../NSUrlSessionHandlerTest.cs | 29 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/src/Foundation/NSUrlSessionHandler.cs b/src/Foundation/NSUrlSessionHandler.cs index c09d4417c1bd..f286c96583b4 100644 --- a/src/Foundation/NSUrlSessionHandler.cs +++ b/src/Foundation/NSUrlSessionHandler.cs @@ -518,6 +518,15 @@ bool TryGetProxyDictionary (Uri? destination, out NSDictionary? proxyDictionary) return true; } + // The proxy uri's scheme indicates how to connect to the proxy itself (not which requests to + // proxy). NSUrlSession's connection proxy dictionary can only describe a plain-HTTP connection + // to the proxy (the HTTP/HTTPS proxy keys select the destination scheme, not the protocol used + // to reach the proxy, and there's no key to connect to the proxy over TLS or via SOCKS). Rather + // than silently connecting over plain HTTP and doing the wrong thing for a secure ("https") or + // SOCKS proxy, fail loudly for any scheme we can't honor. + if (!string.Equals (proxyUri.Scheme, Uri.UriSchemeHttp, StringComparison.OrdinalIgnoreCase)) + throw new NotSupportedException ($"The proxy scheme '{proxyUri.Scheme}' is not supported. Only 'http' proxies are supported."); + var strongProxy = new ProxyConfigurationDictionary { HttpEnable = true, HttpProxyHost = proxyUri.DnsSafeHost, diff --git a/tests/monotouch-test/System.Net.Http/NSUrlSessionHandlerTest.cs b/tests/monotouch-test/System.Net.Http/NSUrlSessionHandlerTest.cs index d8f46183913b..5f8be3cbd085 100644 --- a/tests/monotouch-test/System.Net.Http/NSUrlSessionHandlerTest.cs +++ b/tests/monotouch-test/System.Net.Http/NSUrlSessionHandlerTest.cs @@ -526,6 +526,35 @@ public void ProxyWithDefaultProxyCredentialsAuthenticatesWithProxy () } } + [Test] + public void ProxyWithUnsupportedSchemeThrows () + { + // A secure ("https") proxy connection can't be expressed via NSUrlSession's connection proxy + // dictionary, so instead of silently connecting to the proxy over plain HTTP we should fail + // loudly. + using var handler = new NSUrlSessionHandler (); + handler.Proxy = new WebProxy ("https://127.0.0.1:8888"); + using var client = new HttpClient (handler); + + Exception? caught = null; + var done = TestRuntime.TryRunAsync (TimeSpan.FromSeconds (30), async () => { + try { + await client.GetAsync ("http://proxy-scheme-test.example/").ConfigureAwait (false); + } catch (Exception e) { + caught = e; + } + }, out var ex); + + Assert.That (done, Is.True, "Request completed"); + Assert.That (ex, Is.Null, $"Exception: {ex}"); + + // The NotSupportedException may be wrapped by HttpClient, so walk the inner exception chain. + var notSupported = caught; + while (notSupported is not null && notSupported is not NotSupportedException) + notSupported = notSupported.InnerException; + Assert.That (notSupported, Is.InstanceOf (), $"Should have thrown a NotSupportedException for an unsupported proxy scheme, but was: {caught}"); + } + [Test] public void ProxyPropertiesBehaveCorrectly () { From 44246da3edbb1f830cd7b5979cfc846642f99cdb Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Mon, 3 Aug 2026 18:58:55 +0200 Subject: [PATCH 16/16] [tests] Update expected sizes. --- .../expected/MacCatalyst-MonoVM-size.txt | 4 +- ...atalyst-NativeAOT-TrimmableStatic-size.txt | 4 +- .../expected/MacCatalyst-NativeAOT-size.txt | 4 +- ...reCLR-Interpreter-TrimmableStatic-size.txt | 518 +++++++++--------- .../MacOSX-CoreCLR-Interpreter-size.txt | 510 ++++++++--------- .../MacOSX-NativeAOT-TrimmableStatic-size.txt | 4 +- .../expected/MacOSX-NativeAOT-size.txt | 4 +- .../UnitTests/expected/TVOS-MonoVM-size.txt | 4 +- .../TVOS-NativeAOT-TrimmableStatic-size.txt | 4 +- .../expected/TVOS-NativeAOT-size.txt | 4 +- .../UnitTests/expected/iOS-MonoVM-size.txt | 4 +- .../iOS-NativeAOT-TrimmableStatic-size.txt | 4 +- .../UnitTests/expected/iOS-NativeAOT-size.txt | 4 +- 13 files changed, 536 insertions(+), 536 deletions(-) diff --git a/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-size.txt b/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-size.txt index 2179a507afd8..2ee383d41b42 100644 --- a/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-size.txt +++ b/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-size.txt @@ -1,9 +1,9 @@ -AppBundleSize: 16,383,321 bytes (15,999.3 KB = 15.6 MB) +AppBundleSize: 16,308,569 bytes (15,926.3 KB = 15.6 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/Info.plist: 1,096 bytes (1.1 KB = 0.0 MB) Contents/MacOS/SizeTestApp: - 13,876,232 bytes (13,551.0 KB = 13.2 MB) + 13,801,480 bytes (13,478.0 KB = 13.2 MB) Contents/MonoBundle/aot-instances.aotdata.arm64: 1,045,352 bytes (1,020.9 KB = 1.0 MB) Contents/MonoBundle/Microsoft.MacCatalyst.aotdata.arm64: diff --git a/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-TrimmableStatic-size.txt b/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-TrimmableStatic-size.txt index aa4cc923901c..e19be420c0ad 100644 --- a/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-TrimmableStatic-size.txt +++ b/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-TrimmableStatic-size.txt @@ -1,9 +1,9 @@ -AppBundleSize: 13,933,552 bytes (13,607.0 KB = 13.3 MB) +AppBundleSize: 8,788,640 bytes (8,582.7 KB = 8.4 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/Info.plist: 1,096 bytes (1.1 KB = 0.0 MB) Contents/MacOS/SizeTestApp: - 13,930,552 bytes (13,604.1 KB = 13.3 MB) + 8,785,640 bytes (8,579.7 KB = 8.4 MB) Contents/MonoBundle/runtimeconfig.bin: 1,896 bytes (1.9 KB = 0.0 MB) Contents/PkgInfo: diff --git a/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-size.txt b/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-size.txt index 73a3f5ae23e8..288a99e0431b 100644 --- a/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-size.txt +++ b/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-size.txt @@ -1,9 +1,9 @@ -AppBundleSize: 6,144,984 bytes (6,001.0 KB = 5.9 MB) +AppBundleSize: 2,742,248 bytes (2,678.0 KB = 2.6 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/Info.plist: 1,096 bytes (1.1 KB = 0.0 MB) Contents/MacOS/SizeTestApp: - 6,142,072 bytes (5,998.1 KB = 5.9 MB) + 2,739,336 bytes (2,675.1 KB = 2.6 MB) Contents/MonoBundle/runtimeconfig.bin: 1,808 bytes (1.8 KB = 0.0 MB) Contents/PkgInfo: diff --git a/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-TrimmableStatic-size.txt b/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-TrimmableStatic-size.txt index c0ee3af28881..65f8748c0b41 100644 --- a/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-TrimmableStatic-size.txt +++ b/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-TrimmableStatic-size.txt @@ -1,25 +1,25 @@ -AppBundleSize: 258,032,411 bytes (251,984.8 KB = 246.1 MB) +AppBundleSize: 257,735,803 bytes (251,695.1 KB = 245.8 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/Info.plist: 774 bytes (0.8 KB = 0.0 MB) Contents/MacOS/SizeTestApp: - 7,387,928 bytes (7,214.8 KB = 7.0 MB) + 7,388,024 bytes (7,214.9 KB = 7.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/_Microsoft.macOS.TypeMap.dll: - 4,847,616 bytes (4,734.0 KB = 4.6 MB) + 4,911,616 bytes (4,796.5 KB = 4.7 MB) Contents/MonoBundle/.xamarin/osx-arm64/_SizeTestApp.TypeMap.dll: - 3,072 bytes (3.0 KB = 0.0 MB) + 3,584 bytes (3.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.CSharp.dll: - 892,752 bytes (871.8 KB = 0.9 MB) + 892,712 bytes (871.8 KB = 0.9 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.macOS.dll: - 37,449,728 bytes (36,572.0 KB = 35.7 MB) + 37,217,792 bytes (36,345.5 KB = 35.5 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.VisualBasic.Core.dll: - 1,334,608 bytes (1,303.3 KB = 1.3 MB) + 1,334,568 bytes (1,303.3 KB = 1.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.VisualBasic.dll: - 17,232 bytes (16.8 KB = 0.0 MB) + 17,192 bytes (16.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Win32.Primitives.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Win32.Registry.dll: - 34,640 bytes (33.8 KB = 0.0 MB) + 34,600 bytes (33.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/mscorlib.dll: 59,728 bytes (58.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/netstandard.dll: @@ -27,207 +27,207 @@ Contents/MonoBundle/.xamarin/osx-arm64/netstandard.dll: Contents/MonoBundle/.xamarin/osx-arm64/SizeTestApp.dll: 6,144 bytes (6.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.AppContext.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Buffers.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Collections.Concurrent.dll: - 254,288 bytes (248.3 KB = 0.2 MB) + 254,248 bytes (248.3 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Collections.dll: 328,528 bytes (320.8 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Collections.Immutable.dll: - 1,117,008 bytes (1,090.8 KB = 1.1 MB) + 1,116,968 bytes (1,090.8 KB = 1.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Collections.NonGeneric.dll: - 104,272 bytes (101.8 KB = 0.1 MB) + 104,232 bytes (101.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Collections.Specialized.dll: - 105,296 bytes (102.8 KB = 0.1 MB) + 105,256 bytes (102.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.ComponentModel.Annotations.dll: - 215,888 bytes (210.8 KB = 0.2 MB) + 215,848 bytes (210.8 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.ComponentModel.DataAnnotations.dll: 16,720 bytes (16.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.ComponentModel.dll: - 17,232 bytes (16.8 KB = 0.0 MB) + 17,192 bytes (16.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.ComponentModel.EventBasedAsync.dll: - 39,248 bytes (38.3 KB = 0.0 MB) + 39,208 bytes (38.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.ComponentModel.Primitives.dll: - 80,208 bytes (78.3 KB = 0.1 MB) + 80,168 bytes (78.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.ComponentModel.TypeConverter.dll: - 874,320 bytes (853.8 KB = 0.8 MB) + 873,808 bytes (853.3 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Configuration.dll: - 19,280 bytes (18.8 KB = 0.0 MB) + 19,240 bytes (18.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Console.dll: - 226,128 bytes (220.8 KB = 0.2 MB) + 226,088 bytes (220.8 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Core.dll: - 23,376 bytes (22.8 KB = 0.0 MB) + 23,336 bytes (22.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Data.Common.dll: - 3,228,496 bytes (3,152.8 KB = 3.1 MB) + 3,228,968 bytes (3,153.3 KB = 3.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Data.DataSetExtensions.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Data.dll: - 25,424 bytes (24.8 KB = 0.0 MB) + 25,384 bytes (24.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.Contracts.dll: - 16,208 bytes (15.8 KB = 0.0 MB) + 16,168 bytes (15.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.Debug.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.DiagnosticSource.dll: - 558,416 bytes (545.3 KB = 0.5 MB) + 558,376 bytes (545.3 KB = 0.5 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.FileVersionInfo.dll: - 45,904 bytes (44.8 KB = 0.0 MB) + 45,864 bytes (44.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.Process.dll: - 271,184 bytes (264.8 KB = 0.3 MB) + 271,144 bytes (264.8 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.StackTrace.dll: - 35,664 bytes (34.8 KB = 0.0 MB) + 35,624 bytes (34.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.TextWriterTraceListener.dll: - 65,360 bytes (63.8 KB = 0.1 MB) + 65,320 bytes (63.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.Tools.dll: 15,184 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.TraceSource.dll: 150,864 bytes (147.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.Tracing.dll: - 16,208 bytes (15.8 KB = 0.0 MB) + 16,168 bytes (15.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.dll: - 50,512 bytes (49.3 KB = 0.0 MB) + 50,472 bytes (49.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Drawing.dll: - 20,304 bytes (19.8 KB = 0.0 MB) + 20,264 bytes (19.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Drawing.Primitives.dll: - 128,336 bytes (125.3 KB = 0.1 MB) + 128,296 bytes (125.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Dynamic.Runtime.dll: 16,208 bytes (15.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Formats.Asn1.dll: - 249,680 bytes (243.8 KB = 0.2 MB) + 249,640 bytes (243.8 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Formats.Tar.dll: - 309,584 bytes (302.3 KB = 0.3 MB) + 309,544 bytes (302.3 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Globalization.Calendars.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Globalization.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Globalization.Extensions.dll: 15,184 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Compression.Brotli.dll: 82,768 bytes (80.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Compression.dll: - 463,696 bytes (452.8 KB = 0.4 MB) + 463,656 bytes (452.8 KB = 0.4 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Compression.FileSystem.dll: 15,184 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Compression.ZipFile.dll: - 105,808 bytes (103.3 KB = 0.1 MB) + 105,768 bytes (103.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.FileSystem.AccessControl.dll: - 33,616 bytes (32.8 KB = 0.0 MB) + 33,576 bytes (32.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.FileSystem.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.FileSystem.DriveInfo.dll: 91,984 bytes (89.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.FileSystem.Primitives.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.FileSystem.Watcher.dll: 121,680 bytes (118.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.IsolatedStorage.dll: - 83,792 bytes (81.8 KB = 0.1 MB) + 83,752 bytes (81.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.MemoryMappedFiles.dll: 96,592 bytes (94.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Pipelines.dll: - 198,480 bytes (193.8 KB = 0.2 MB) + 197,416 bytes (192.8 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Pipes.AccessControl.dll: - 24,400 bytes (23.8 KB = 0.0 MB) + 24,360 bytes (23.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Pipes.dll: - 145,744 bytes (142.3 KB = 0.1 MB) + 146,256 bytes (142.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.UnmanagedMemoryStream.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.AsyncEnumerable.dll: - 1,492,816 bytes (1,457.8 KB = 1.4 MB) + 1,492,776 bytes (1,457.8 KB = 1.4 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.dll: - 794,960 bytes (776.3 KB = 0.8 MB) + 794,448 bytes (775.8 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.Expressions.dll: - 4,651,856 bytes (4,542.8 KB = 4.4 MB) + 4,650,792 bytes (4,541.8 KB = 4.4 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.Parallel.dll: - 892,240 bytes (871.3 KB = 0.9 MB) + 892,712 bytes (871.8 KB = 0.9 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.Queryable.dll: 213,328 bytes (208.3 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Memory.dll: - 164,688 bytes (160.8 KB = 0.2 MB) + 164,648 bytes (160.8 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.dll: - 17,232 bytes (16.8 KB = 0.0 MB) + 17,192 bytes (16.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Http.dll: - 1,964,368 bytes (1,918.3 KB = 1.9 MB) + 1,966,416 bytes (1,920.3 KB = 1.9 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Http.Json.dll: - 129,360 bytes (126.3 KB = 0.1 MB) + 129,320 bytes (126.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.HttpListener.dll: 329,040 bytes (321.3 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Mail.dll: - 542,032 bytes (529.3 KB = 0.5 MB) + 544,592 bytes (531.8 KB = 0.5 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.NameResolution.dll: - 109,904 bytes (107.3 KB = 0.1 MB) + 109,864 bytes (107.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.NetworkInformation.dll: - 154,448 bytes (150.8 KB = 0.1 MB) + 154,408 bytes (150.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Ping.dll: - 99,152 bytes (96.8 KB = 0.1 MB) + 99,112 bytes (96.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Primitives.dll: 244,560 bytes (238.8 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Quic.dll: - 386,384 bytes (377.3 KB = 0.4 MB) + 386,344 bytes (377.3 KB = 0.4 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Requests.dll: - 420,176 bytes (410.3 KB = 0.4 MB) + 420,136 bytes (410.3 KB = 0.4 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Security.dll: - 860,496 bytes (840.3 KB = 0.8 MB) + 860,968 bytes (840.8 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.ServerSentEvents.dll: - 77,648 bytes (75.8 KB = 0.1 MB) + 77,608 bytes (75.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.ServicePoint.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Sockets.dll: 702,288 bytes (685.8 KB = 0.7 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.WebClient.dll: - 175,952 bytes (171.8 KB = 0.2 MB) + 175,912 bytes (171.8 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.WebHeaderCollection.dll: - 62,288 bytes (60.8 KB = 0.1 MB) + 62,248 bytes (60.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.WebProxy.dll: 34,640 bytes (33.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.WebSockets.Client.dll: - 99,664 bytes (97.3 KB = 0.1 MB) + 99,624 bytes (97.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.WebSockets.dll: - 259,408 bytes (253.3 KB = 0.2 MB) + 259,368 bytes (253.3 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Numerics.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Numerics.Vectors.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.ObjectModel.dll: 77,648 bytes (75.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Private.CoreLib.dll: - 17,092,432 bytes (16,691.8 KB = 16.3 MB) + 17,085,776 bytes (16,685.3 KB = 16.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Private.DataContractSerialization.dll: 2,397,008 bytes (2,340.8 KB = 2.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Private.Uri.dll: - 265,552 bytes (259.3 KB = 0.3 MB) + 265,512 bytes (259.3 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Private.Xml.dll: - 9,001,808 bytes (8,790.8 KB = 8.6 MB) + 9,002,792 bytes (8,791.8 KB = 8.6 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Private.Xml.Linq.dll: 441,168 bytes (430.8 KB = 0.4 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Reflection.DispatchProxy.dll: - 72,528 bytes (70.8 KB = 0.1 MB) + 72,488 bytes (70.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Reflection.dll: - 16,208 bytes (15.8 KB = 0.0 MB) + 16,168 bytes (15.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Reflection.Emit.dll: - 344,400 bytes (336.3 KB = 0.3 MB) + 344,360 bytes (336.3 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Reflection.Emit.ILGeneration.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Reflection.Emit.Lightweight.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Reflection.Extensions.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Reflection.Metadata.dll: - 1,276,240 bytes (1,246.3 KB = 1.2 MB) + 1,276,200 bytes (1,246.3 KB = 1.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Reflection.Primitives.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Reflection.TypeExtensions.dll: - 34,128 bytes (33.3 KB = 0.0 MB) + 34,088 bytes (33.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Resources.Reader.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Resources.ResourceManager.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Resources.Writer.dll: - 45,392 bytes (44.3 KB = 0.0 MB) + 45,904 bytes (44.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Runtime.CompilerServices.Unsafe.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Runtime.CompilerServices.VisualC.dll: 18,768 bytes (18.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Runtime.dll: @@ -241,45 +241,45 @@ Contents/MonoBundle/.xamarin/osx-arm64/System.Runtime.InteropServices.dll: Contents/MonoBundle/.xamarin/osx-arm64/System.Runtime.InteropServices.JavaScript.dll: 39,760 bytes (38.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Runtime.InteropServices.RuntimeInformation.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Runtime.Intrinsics.dll: - 17,232 bytes (16.8 KB = 0.0 MB) + 17,192 bytes (16.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Runtime.Loader.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Runtime.Numerics.dll: - 366,416 bytes (357.8 KB = 0.3 MB) + 366,376 bytes (357.8 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Runtime.Serialization.dll: - 16,720 bytes (16.3 KB = 0.0 MB) + 16,680 bytes (16.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Runtime.Serialization.Formatters.dll: - 128,848 bytes (125.8 KB = 0.1 MB) + 128,808 bytes (125.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Runtime.Serialization.Json.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Runtime.Serialization.Primitives.dll: - 30,032 bytes (29.3 KB = 0.0 MB) + 29,992 bytes (29.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Runtime.Serialization.Xml.dll: 16,720 bytes (16.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Security.AccessControl.dll: - 59,728 bytes (58.3 KB = 0.1 MB) + 59,688 bytes (58.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Security.Claims.dll: 102,224 bytes (99.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Security.Cryptography.Algorithms.dll: - 17,232 bytes (16.8 KB = 0.0 MB) + 17,192 bytes (16.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Security.Cryptography.Cng.dll: 16,208 bytes (15.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Security.Cryptography.Csp.dll: - 16,208 bytes (15.8 KB = 0.0 MB) + 16,168 bytes (15.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Security.Cryptography.dll: - 2,459,472 bytes (2,401.8 KB = 2.3 MB) + 2,459,944 bytes (2,402.3 KB = 2.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Security.Cryptography.Encoding.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Security.Cryptography.OpenSsl.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Security.Cryptography.Primitives.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Security.Cryptography.X509Certificates.dll: - 16,720 bytes (16.3 KB = 0.0 MB) + 16,680 bytes (16.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Security.dll: - 18,256 bytes (17.8 KB = 0.0 MB) + 18,216 bytes (17.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Security.Principal.dll: 15,184 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Security.Principal.Windows.dll: @@ -287,55 +287,55 @@ Contents/MonoBundle/.xamarin/osx-arm64/System.Security.Principal.Windows.dll: Contents/MonoBundle/.xamarin/osx-arm64/System.Security.SecureString.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.ServiceModel.Web.dll: - 16,720 bytes (16.3 KB = 0.0 MB) + 16,680 bytes (16.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.ServiceProcess.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Text.Encoding.CodePages.dll: 869,200 bytes (848.8 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Text.Encoding.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Text.Encoding.Extensions.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Text.Encodings.Web.dll: - 122,192 bytes (119.3 KB = 0.1 MB) + 122,152 bytes (119.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Text.Json.dll: - 2,101,584 bytes (2,052.3 KB = 2.0 MB) + 2,101,544 bytes (2,052.3 KB = 2.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Text.RegularExpressions.dll: 1,159,504 bytes (1,132.3 KB = 1.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Threading.AccessControl.dll: - 34,640 bytes (33.8 KB = 0.0 MB) + 34,600 bytes (33.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Threading.Channels.dll: - 165,200 bytes (161.3 KB = 0.2 MB) + 165,160 bytes (161.3 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Threading.dll: 80,208 bytes (78.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Threading.Overlapped.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Threading.Tasks.Dataflow.dll: - 532,304 bytes (519.8 KB = 0.5 MB) + 532,264 bytes (519.8 KB = 0.5 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Threading.Tasks.dll: - 16,720 bytes (16.3 KB = 0.0 MB) + 16,680 bytes (16.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Threading.Tasks.Extensions.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Threading.Tasks.Parallel.dll: - 133,968 bytes (130.8 KB = 0.1 MB) + 133,928 bytes (130.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Threading.Thread.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Threading.ThreadPool.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Threading.Timer.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Transactions.dll: - 16,720 bytes (16.3 KB = 0.0 MB) + 16,680 bytes (16.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Transactions.Local.dll: - 400,720 bytes (391.3 KB = 0.4 MB) + 400,680 bytes (391.3 KB = 0.4 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.ValueTuple.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Web.dll: 15,184 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Web.HttpUtility.dll: - 56,656 bytes (55.3 KB = 0.1 MB) + 56,616 bytes (55.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Windows.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Xml.dll: 23,376 bytes (22.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Xml.Linq.dll: @@ -343,51 +343,51 @@ Contents/MonoBundle/.xamarin/osx-arm64/System.Xml.Linq.dll: Contents/MonoBundle/.xamarin/osx-arm64/System.Xml.ReaderWriter.dll: 21,840 bytes (21.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Xml.Serialization.dll: - 16,208 bytes (15.8 KB = 0.0 MB) + 16,168 bytes (15.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Xml.XDocument.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Xml.XmlDocument.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Xml.XmlSerializer.dll: - 17,744 bytes (17.3 KB = 0.0 MB) + 17,704 bytes (17.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Xml.XPath.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Xml.XPath.XDocument.dll: - 17,232 bytes (16.8 KB = 0.0 MB) + 17,192 bytes (16.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/WindowsBase.dll: 16,208 bytes (15.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/_Microsoft.macOS.TypeMap.dll: - 4,847,616 bytes (4,734.0 KB = 4.6 MB) + 4,911,616 bytes (4,796.5 KB = 4.7 MB) Contents/MonoBundle/.xamarin/osx-x64/_SizeTestApp.TypeMap.dll: - 3,072 bytes (3.0 KB = 0.0 MB) + 3,584 bytes (3.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.CSharp.dll: - 795,984 bytes (777.3 KB = 0.8 MB) + 795,944 bytes (777.3 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.macOS.dll: - 37,449,728 bytes (36,572.0 KB = 35.7 MB) + 37,217,792 bytes (36,345.5 KB = 35.5 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.VisualBasic.Core.dll: - 1,166,160 bytes (1,138.8 KB = 1.1 MB) + 1,166,120 bytes (1,138.8 KB = 1.1 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.VisualBasic.dll: - 17,232 bytes (16.8 KB = 0.0 MB) + 17,192 bytes (16.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.Win32.Primitives.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.Win32.Registry.dll: - 34,128 bytes (33.3 KB = 0.0 MB) + 34,088 bytes (33.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/mscorlib.dll: - 59,728 bytes (58.3 KB = 0.1 MB) + 59,688 bytes (58.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/netstandard.dll: - 100,688 bytes (98.3 KB = 0.1 MB) + 100,648 bytes (98.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/SizeTestApp.dll: 6,144 bytes (6.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.AppContext.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Buffers.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Collections.Concurrent.dll: - 227,664 bytes (222.3 KB = 0.2 MB) + 227,624 bytes (222.3 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Collections.dll: - 288,592 bytes (281.8 KB = 0.3 MB) + 288,552 bytes (281.8 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Collections.Immutable.dll: - 984,400 bytes (961.3 KB = 0.9 MB) + 984,360 bytes (961.3 KB = 0.9 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Collections.NonGeneric.dll: 92,496 bytes (90.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Collections.Specialized.dll: @@ -397,199 +397,199 @@ Contents/MonoBundle/.xamarin/osx-x64/System.ComponentModel.Annotations.dll: Contents/MonoBundle/.xamarin/osx-x64/System.ComponentModel.DataAnnotations.dll: 16,720 bytes (16.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.ComponentModel.dll: - 17,232 bytes (16.8 KB = 0.0 MB) + 17,192 bytes (16.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.ComponentModel.EventBasedAsync.dll: - 35,664 bytes (34.8 KB = 0.0 MB) + 35,624 bytes (34.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.ComponentModel.Primitives.dll: - 70,480 bytes (68.8 KB = 0.1 MB) + 70,440 bytes (68.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.ComponentModel.TypeConverter.dll: 759,632 bytes (741.8 KB = 0.7 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Configuration.dll: - 19,280 bytes (18.8 KB = 0.0 MB) + 19,240 bytes (18.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Console.dll: 198,992 bytes (194.3 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Core.dll: - 23,376 bytes (22.8 KB = 0.0 MB) + 23,336 bytes (22.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Data.Common.dll: - 2,803,024 bytes (2,737.3 KB = 2.7 MB) + 2,802,984 bytes (2,737.3 KB = 2.7 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Data.DataSetExtensions.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Data.dll: - 25,424 bytes (24.8 KB = 0.0 MB) + 25,384 bytes (24.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.Contracts.dll: 16,208 bytes (15.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.Debug.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.DiagnosticSource.dll: 498,000 bytes (486.3 KB = 0.5 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.FileVersionInfo.dll: 42,832 bytes (41.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.Process.dll: - 235,856 bytes (230.3 KB = 0.2 MB) + 235,816 bytes (230.3 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.StackTrace.dll: - 34,640 bytes (33.8 KB = 0.0 MB) + 34,600 bytes (33.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.TextWriterTraceListener.dll: - 58,704 bytes (57.3 KB = 0.1 MB) + 58,664 bytes (57.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.Tools.dll: 15,184 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.TraceSource.dll: - 130,896 bytes (127.8 KB = 0.1 MB) + 130,856 bytes (127.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.Tracing.dll: - 16,208 bytes (15.8 KB = 0.0 MB) + 16,168 bytes (15.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.dll: - 50,512 bytes (49.3 KB = 0.0 MB) + 50,472 bytes (49.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Drawing.dll: - 20,304 bytes (19.8 KB = 0.0 MB) + 20,264 bytes (19.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Drawing.Primitives.dll: 123,216 bytes (120.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Dynamic.Runtime.dll: - 16,208 bytes (15.8 KB = 0.0 MB) + 16,168 bytes (15.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Formats.Asn1.dll: - 224,080 bytes (218.8 KB = 0.2 MB) + 224,040 bytes (218.8 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Formats.Tar.dll: - 275,792 bytes (269.3 KB = 0.3 MB) + 275,752 bytes (269.3 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Globalization.Calendars.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Globalization.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Globalization.Extensions.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.Compression.Brotli.dll: - 73,552 bytes (71.8 KB = 0.1 MB) + 73,512 bytes (71.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.Compression.dll: 416,080 bytes (406.3 KB = 0.4 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.Compression.FileSystem.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.Compression.ZipFile.dll: - 98,640 bytes (96.3 KB = 0.1 MB) + 98,600 bytes (96.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.FileSystem.AccessControl.dll: - 33,104 bytes (32.3 KB = 0.0 MB) + 33,064 bytes (32.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.FileSystem.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.FileSystem.DriveInfo.dll: 81,744 bytes (79.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.FileSystem.Primitives.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.FileSystem.Watcher.dll: - 105,808 bytes (103.3 KB = 0.1 MB) + 105,768 bytes (103.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.IsolatedStorage.dll: 76,624 bytes (74.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.MemoryMappedFiles.dll: - 83,792 bytes (81.8 KB = 0.1 MB) + 83,752 bytes (81.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.Pipelines.dll: - 181,584 bytes (177.3 KB = 0.2 MB) + 181,032 bytes (176.8 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.Pipes.AccessControl.dll: - 24,400 bytes (23.8 KB = 0.0 MB) + 24,360 bytes (23.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.Pipes.dll: 127,312 bytes (124.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.UnmanagedMemoryStream.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Linq.AsyncEnumerable.dll: 1,328,464 bytes (1,297.3 KB = 1.3 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Linq.dll: - 696,656 bytes (680.3 KB = 0.7 MB) + 696,616 bytes (680.3 KB = 0.7 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Linq.Expressions.dll: - 3,725,136 bytes (3,637.8 KB = 3.6 MB) + 3,723,600 bytes (3,636.3 KB = 3.6 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Linq.Parallel.dll: 776,016 bytes (757.8 KB = 0.7 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Linq.Queryable.dll: - 178,512 bytes (174.3 KB = 0.2 MB) + 178,472 bytes (174.3 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Memory.dll: 152,400 bytes (148.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.dll: - 17,232 bytes (16.8 KB = 0.0 MB) + 17,192 bytes (16.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.Http.dll: - 1,754,960 bytes (1,713.8 KB = 1.7 MB) + 1,757,008 bytes (1,715.8 KB = 1.7 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.Http.Json.dll: 120,144 bytes (117.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.HttpListener.dll: - 291,664 bytes (284.8 KB = 0.3 MB) + 291,624 bytes (284.8 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.Mail.dll: - 479,056 bytes (467.8 KB = 0.5 MB) + 481,064 bytes (469.8 KB = 0.5 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.NameResolution.dll: 97,616 bytes (95.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.NetworkInformation.dll: 135,504 bytes (132.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.Ping.dll: - 89,424 bytes (87.3 KB = 0.1 MB) + 89,384 bytes (87.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.Primitives.dll: - 214,864 bytes (209.8 KB = 0.2 MB) + 214,824 bytes (209.8 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.Quic.dll: 345,424 bytes (337.3 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.Requests.dll: - 367,440 bytes (358.8 KB = 0.4 MB) + 367,400 bytes (358.8 KB = 0.4 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.Security.dll: - 756,560 bytes (738.8 KB = 0.7 MB) + 757,072 bytes (739.3 KB = 0.7 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.ServerSentEvents.dll: 71,504 bytes (69.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.ServicePoint.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.Sockets.dll: - 603,984 bytes (589.8 KB = 0.6 MB) + 603,944 bytes (589.8 KB = 0.6 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.WebClient.dll: - 156,496 bytes (152.8 KB = 0.1 MB) + 156,456 bytes (152.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.WebHeaderCollection.dll: - 54,608 bytes (53.3 KB = 0.1 MB) + 54,568 bytes (53.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.WebProxy.dll: - 32,592 bytes (31.8 KB = 0.0 MB) + 32,552 bytes (31.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.WebSockets.Client.dll: - 90,448 bytes (88.3 KB = 0.1 MB) + 90,920 bytes (88.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.WebSockets.dll: - 235,856 bytes (230.3 KB = 0.2 MB) + 235,816 bytes (230.3 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Numerics.dll: 15,184 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Numerics.Vectors.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.ObjectModel.dll: - 69,456 bytes (67.8 KB = 0.1 MB) + 69,416 bytes (67.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Private.CoreLib.dll: - 15,565,136 bytes (15,200.3 KB = 14.8 MB) + 15,555,920 bytes (15,191.3 KB = 14.8 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Private.DataContractSerialization.dll: - 2,071,376 bytes (2,022.8 KB = 2.0 MB) + 2,071,336 bytes (2,022.8 KB = 2.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Private.Uri.dll: - 245,072 bytes (239.3 KB = 0.2 MB) + 245,032 bytes (239.3 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Private.Xml.dll: - 7,902,032 bytes (7,716.8 KB = 7.5 MB) + 7,902,504 bytes (7,717.3 KB = 7.5 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Private.Xml.Linq.dll: 388,432 bytes (379.3 KB = 0.4 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.DispatchProxy.dll: - 66,896 bytes (65.3 KB = 0.1 MB) + 66,856 bytes (65.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.dll: - 16,208 bytes (15.8 KB = 0.0 MB) + 16,160 bytes (15.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.Emit.dll: - 302,928 bytes (295.8 KB = 0.3 MB) + 302,888 bytes (295.8 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.Emit.ILGeneration.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.Emit.Lightweight.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.Extensions.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.Metadata.dll: - 1,147,728 bytes (1,120.8 KB = 1.1 MB) + 1,147,688 bytes (1,120.8 KB = 1.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.Primitives.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.TypeExtensions.dll: - 32,080 bytes (31.3 KB = 0.0 MB) + 32,040 bytes (31.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Resources.Reader.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Resources.ResourceManager.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Resources.Writer.dll: 42,320 bytes (41.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.CompilerServices.Unsafe.dll: 15,184 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.CompilerServices.VisualC.dll: - 18,768 bytes (18.3 KB = 0.0 MB) + 18,728 bytes (18.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.dll: - 44,880 bytes (43.8 KB = 0.0 MB) + 44,840 bytes (43.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.Extensions.dll: - 17,744 bytes (17.3 KB = 0.0 MB) + 17,704 bytes (17.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.Handles.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.InteropServices.dll: - 102,224 bytes (99.8 KB = 0.1 MB) + 102,184 bytes (99.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.InteropServices.JavaScript.dll: 39,760 bytes (38.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.InteropServices.RuntimeInformation.dll: @@ -597,31 +597,31 @@ Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.InteropServices.RuntimeInfor Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.Intrinsics.dll: 17,232 bytes (16.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.Loader.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.Numerics.dll: - 342,864 bytes (334.8 KB = 0.3 MB) + 342,824 bytes (334.8 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.Serialization.dll: - 16,720 bytes (16.3 KB = 0.0 MB) + 16,680 bytes (16.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.Serialization.Formatters.dll: - 116,048 bytes (113.3 KB = 0.1 MB) + 116,008 bytes (113.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.Serialization.Json.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.Serialization.Primitives.dll: - 28,496 bytes (27.8 KB = 0.0 MB) + 28,456 bytes (27.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.Serialization.Xml.dll: - 16,720 bytes (16.3 KB = 0.0 MB) + 16,680 bytes (16.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Security.AccessControl.dll: - 59,728 bytes (58.3 KB = 0.1 MB) + 59,688 bytes (58.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Security.Claims.dll: 92,496 bytes (90.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Security.Cryptography.Algorithms.dll: - 17,232 bytes (16.8 KB = 0.0 MB) + 17,192 bytes (16.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Security.Cryptography.Cng.dll: 16,208 bytes (15.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Security.Cryptography.Csp.dll: - 16,208 bytes (15.8 KB = 0.0 MB) + 16,168 bytes (15.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Security.Cryptography.dll: - 2,138,448 bytes (2,088.3 KB = 2.0 MB) + 2,138,408 bytes (2,088.3 KB = 2.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Security.Cryptography.Encoding.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Security.Cryptography.OpenSsl.dll: @@ -631,99 +631,99 @@ Contents/MonoBundle/.xamarin/osx-x64/System.Security.Cryptography.Primitives.dll Contents/MonoBundle/.xamarin/osx-x64/System.Security.Cryptography.X509Certificates.dll: 16,720 bytes (16.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Security.dll: - 18,256 bytes (17.8 KB = 0.0 MB) + 18,216 bytes (17.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Security.Principal.dll: 15,184 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Security.Principal.Windows.dll: - 38,736 bytes (37.8 KB = 0.0 MB) + 38,696 bytes (37.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Security.SecureString.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.ServiceModel.Web.dll: - 16,720 bytes (16.3 KB = 0.0 MB) + 16,680 bytes (16.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.ServiceProcess.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Text.Encoding.CodePages.dll: 852,304 bytes (832.3 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Text.Encoding.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Text.Encoding.Extensions.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Text.Encodings.Web.dll: - 113,488 bytes (110.8 KB = 0.1 MB) + 114,000 bytes (111.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Text.Json.dll: - 1,882,448 bytes (1,838.3 KB = 1.8 MB) + 1,882,920 bytes (1,838.8 KB = 1.8 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Text.RegularExpressions.dll: - 1,036,112 bytes (1,011.8 KB = 1.0 MB) + 1,036,624 bytes (1,012.3 KB = 1.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Threading.AccessControl.dll: 34,640 bytes (33.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Threading.Channels.dll: - 149,328 bytes (145.8 KB = 0.1 MB) + 149,288 bytes (145.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Threading.dll: - 73,552 bytes (71.8 KB = 0.1 MB) + 73,512 bytes (71.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Threading.Overlapped.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Threading.Tasks.Dataflow.dll: - 470,864 bytes (459.8 KB = 0.4 MB) + 470,824 bytes (459.8 KB = 0.4 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Threading.Tasks.dll: - 16,720 bytes (16.3 KB = 0.0 MB) + 16,680 bytes (16.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Threading.Tasks.Extensions.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Threading.Tasks.Parallel.dll: - 121,168 bytes (118.3 KB = 0.1 MB) + 121,128 bytes (118.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Threading.Thread.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Threading.ThreadPool.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Threading.Timer.dll: 15,184 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Transactions.dll: - 16,720 bytes (16.3 KB = 0.0 MB) + 16,680 bytes (16.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Transactions.Local.dll: - 356,688 bytes (348.3 KB = 0.3 MB) + 356,648 bytes (348.3 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-x64/System.ValueTuple.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Web.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Web.HttpUtility.dll: 52,048 bytes (50.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Windows.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Xml.dll: - 23,376 bytes (22.8 KB = 0.0 MB) + 23,336 bytes (22.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Xml.Linq.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Xml.ReaderWriter.dll: - 21,840 bytes (21.3 KB = 0.0 MB) + 21,800 bytes (21.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Xml.Serialization.dll: - 16,208 bytes (15.8 KB = 0.0 MB) + 16,168 bytes (15.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Xml.XDocument.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Xml.XmlDocument.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Xml.XmlSerializer.dll: - 17,744 bytes (17.3 KB = 0.0 MB) + 17,704 bytes (17.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Xml.XPath.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Xml.XPath.XDocument.dll: - 16,720 bytes (16.3 KB = 0.0 MB) + 16,680 bytes (16.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/WindowsBase.dll: - 16,208 bytes (15.8 KB = 0.0 MB) + 16,168 bytes (15.8 KB = 0.0 MB) Contents/MonoBundle/libclrgc.dylib: - 1,952,112 bytes (1,906.4 KB = 1.9 MB) + 1,952,384 bytes (1,906.6 KB = 1.9 MB) Contents/MonoBundle/libclrgcexp.dylib: - 2,112,848 bytes (2,063.3 KB = 2.0 MB) + 2,129,776 bytes (2,079.9 KB = 2.0 MB) Contents/MonoBundle/libclrjit.dylib: 6,476,096 bytes (6,324.3 KB = 6.2 MB) Contents/MonoBundle/libcoreclr.dylib: - 12,769,952 bytes (12,470.7 KB = 12.2 MB) + 12,803,872 bytes (12,503.8 KB = 12.2 MB) Contents/MonoBundle/libhostfxr.dylib: 851,440 bytes (831.5 KB = 0.8 MB) Contents/MonoBundle/libhostpolicy.dylib: 832,640 bytes (813.1 KB = 0.8 MB) Contents/MonoBundle/libmscordaccore.dylib: - 4,849,184 bytes (4,735.5 KB = 4.6 MB) + 4,849,920 bytes (4,736.2 KB = 4.6 MB) Contents/MonoBundle/libmscordbi.dylib: - 3,539,568 bytes (3,456.6 KB = 3.4 MB) + 3,540,304 bytes (3,457.3 KB = 3.4 MB) Contents/MonoBundle/libSystem.Globalization.Native.dylib: 302,480 bytes (295.4 KB = 0.3 MB) Contents/MonoBundle/libSystem.IO.Compression.Native.dylib: diff --git a/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-size.txt b/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-size.txt index 0dc512a70f7e..2cc092a1a197 100644 --- a/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-size.txt +++ b/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-size.txt @@ -1,21 +1,21 @@ -AppBundleSize: 248,411,609 bytes (242,589.5 KB = 236.9 MB) +AppBundleSize: 247,985,977 bytes (242,173.8 KB = 236.5 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/Info.plist: 774 bytes (0.8 KB = 0.0 MB) Contents/MacOS/SizeTestApp: - 8,029,736 bytes (7,841.5 KB = 7.7 MB) + 8,029,832 bytes (7,841.6 KB = 7.7 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.CSharp.dll: - 892,752 bytes (871.8 KB = 0.9 MB) + 892,712 bytes (871.8 KB = 0.9 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.macOS.dll: - 37,168,640 bytes (36,297.5 KB = 35.4 MB) + 36,936,704 bytes (36,071.0 KB = 35.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.VisualBasic.Core.dll: - 1,334,608 bytes (1,303.3 KB = 1.3 MB) + 1,334,568 bytes (1,303.3 KB = 1.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.VisualBasic.dll: - 17,232 bytes (16.8 KB = 0.0 MB) + 17,192 bytes (16.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Win32.Primitives.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Win32.Registry.dll: - 34,640 bytes (33.8 KB = 0.0 MB) + 34,600 bytes (33.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/mscorlib.dll: 59,728 bytes (58.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/netstandard.dll: @@ -23,207 +23,207 @@ Contents/MonoBundle/.xamarin/osx-arm64/netstandard.dll: Contents/MonoBundle/.xamarin/osx-arm64/SizeTestApp.dll: 6,656 bytes (6.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.AppContext.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Buffers.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Collections.Concurrent.dll: - 254,288 bytes (248.3 KB = 0.2 MB) + 254,248 bytes (248.3 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Collections.dll: 328,528 bytes (320.8 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Collections.Immutable.dll: - 1,117,008 bytes (1,090.8 KB = 1.1 MB) + 1,116,968 bytes (1,090.8 KB = 1.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Collections.NonGeneric.dll: - 104,272 bytes (101.8 KB = 0.1 MB) + 104,232 bytes (101.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Collections.Specialized.dll: - 105,296 bytes (102.8 KB = 0.1 MB) + 105,256 bytes (102.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.ComponentModel.Annotations.dll: - 215,888 bytes (210.8 KB = 0.2 MB) + 215,848 bytes (210.8 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.ComponentModel.DataAnnotations.dll: 16,720 bytes (16.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.ComponentModel.dll: - 17,232 bytes (16.8 KB = 0.0 MB) + 17,192 bytes (16.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.ComponentModel.EventBasedAsync.dll: - 39,248 bytes (38.3 KB = 0.0 MB) + 39,208 bytes (38.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.ComponentModel.Primitives.dll: - 80,208 bytes (78.3 KB = 0.1 MB) + 80,168 bytes (78.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.ComponentModel.TypeConverter.dll: - 874,320 bytes (853.8 KB = 0.8 MB) + 873,808 bytes (853.3 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Configuration.dll: - 19,280 bytes (18.8 KB = 0.0 MB) + 19,240 bytes (18.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Console.dll: - 226,128 bytes (220.8 KB = 0.2 MB) + 226,088 bytes (220.8 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Core.dll: - 23,376 bytes (22.8 KB = 0.0 MB) + 23,336 bytes (22.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Data.Common.dll: - 3,228,496 bytes (3,152.8 KB = 3.1 MB) + 3,228,968 bytes (3,153.3 KB = 3.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Data.DataSetExtensions.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Data.dll: - 25,424 bytes (24.8 KB = 0.0 MB) + 25,384 bytes (24.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.Contracts.dll: - 16,208 bytes (15.8 KB = 0.0 MB) + 16,168 bytes (15.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.Debug.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.DiagnosticSource.dll: - 558,416 bytes (545.3 KB = 0.5 MB) + 558,376 bytes (545.3 KB = 0.5 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.FileVersionInfo.dll: - 45,904 bytes (44.8 KB = 0.0 MB) + 45,864 bytes (44.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.Process.dll: - 271,184 bytes (264.8 KB = 0.3 MB) + 271,144 bytes (264.8 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.StackTrace.dll: - 35,664 bytes (34.8 KB = 0.0 MB) + 35,624 bytes (34.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.TextWriterTraceListener.dll: - 65,360 bytes (63.8 KB = 0.1 MB) + 65,320 bytes (63.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.Tools.dll: 15,184 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.TraceSource.dll: 150,864 bytes (147.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.Tracing.dll: - 16,208 bytes (15.8 KB = 0.0 MB) + 16,168 bytes (15.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.dll: - 50,512 bytes (49.3 KB = 0.0 MB) + 50,472 bytes (49.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Drawing.dll: - 20,304 bytes (19.8 KB = 0.0 MB) + 20,264 bytes (19.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Drawing.Primitives.dll: - 128,336 bytes (125.3 KB = 0.1 MB) + 128,296 bytes (125.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Dynamic.Runtime.dll: 16,208 bytes (15.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Formats.Asn1.dll: - 249,680 bytes (243.8 KB = 0.2 MB) + 249,640 bytes (243.8 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Formats.Tar.dll: - 309,584 bytes (302.3 KB = 0.3 MB) + 309,544 bytes (302.3 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Globalization.Calendars.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Globalization.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Globalization.Extensions.dll: 15,184 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Compression.Brotli.dll: 82,768 bytes (80.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Compression.dll: - 463,696 bytes (452.8 KB = 0.4 MB) + 463,656 bytes (452.8 KB = 0.4 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Compression.FileSystem.dll: 15,184 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Compression.ZipFile.dll: - 105,808 bytes (103.3 KB = 0.1 MB) + 105,768 bytes (103.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.FileSystem.AccessControl.dll: - 33,616 bytes (32.8 KB = 0.0 MB) + 33,576 bytes (32.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.FileSystem.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.FileSystem.DriveInfo.dll: 91,984 bytes (89.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.FileSystem.Primitives.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.FileSystem.Watcher.dll: 121,680 bytes (118.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.IsolatedStorage.dll: - 83,792 bytes (81.8 KB = 0.1 MB) + 83,752 bytes (81.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.MemoryMappedFiles.dll: 96,592 bytes (94.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Pipelines.dll: - 198,480 bytes (193.8 KB = 0.2 MB) + 197,416 bytes (192.8 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Pipes.AccessControl.dll: - 24,400 bytes (23.8 KB = 0.0 MB) + 24,360 bytes (23.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Pipes.dll: - 145,744 bytes (142.3 KB = 0.1 MB) + 146,256 bytes (142.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.UnmanagedMemoryStream.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.AsyncEnumerable.dll: - 1,492,816 bytes (1,457.8 KB = 1.4 MB) + 1,492,776 bytes (1,457.8 KB = 1.4 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.dll: - 794,960 bytes (776.3 KB = 0.8 MB) + 794,448 bytes (775.8 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.Expressions.dll: - 4,651,856 bytes (4,542.8 KB = 4.4 MB) + 4,650,792 bytes (4,541.8 KB = 4.4 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.Parallel.dll: - 892,240 bytes (871.3 KB = 0.9 MB) + 892,712 bytes (871.8 KB = 0.9 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.Queryable.dll: 213,328 bytes (208.3 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Memory.dll: - 164,688 bytes (160.8 KB = 0.2 MB) + 164,648 bytes (160.8 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.dll: - 17,232 bytes (16.8 KB = 0.0 MB) + 17,192 bytes (16.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Http.dll: - 1,964,368 bytes (1,918.3 KB = 1.9 MB) + 1,966,416 bytes (1,920.3 KB = 1.9 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Http.Json.dll: - 129,360 bytes (126.3 KB = 0.1 MB) + 129,320 bytes (126.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.HttpListener.dll: 329,040 bytes (321.3 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Mail.dll: - 542,032 bytes (529.3 KB = 0.5 MB) + 544,592 bytes (531.8 KB = 0.5 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.NameResolution.dll: - 109,904 bytes (107.3 KB = 0.1 MB) + 109,864 bytes (107.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.NetworkInformation.dll: - 154,448 bytes (150.8 KB = 0.1 MB) + 154,408 bytes (150.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Ping.dll: - 99,152 bytes (96.8 KB = 0.1 MB) + 99,112 bytes (96.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Primitives.dll: 244,560 bytes (238.8 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Quic.dll: - 386,384 bytes (377.3 KB = 0.4 MB) + 386,344 bytes (377.3 KB = 0.4 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Requests.dll: - 420,176 bytes (410.3 KB = 0.4 MB) + 420,136 bytes (410.3 KB = 0.4 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Security.dll: - 860,496 bytes (840.3 KB = 0.8 MB) + 860,968 bytes (840.8 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.ServerSentEvents.dll: - 77,648 bytes (75.8 KB = 0.1 MB) + 77,608 bytes (75.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.ServicePoint.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Sockets.dll: 702,288 bytes (685.8 KB = 0.7 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.WebClient.dll: - 175,952 bytes (171.8 KB = 0.2 MB) + 175,912 bytes (171.8 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.WebHeaderCollection.dll: - 62,288 bytes (60.8 KB = 0.1 MB) + 62,248 bytes (60.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.WebProxy.dll: 34,640 bytes (33.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.WebSockets.Client.dll: - 99,664 bytes (97.3 KB = 0.1 MB) + 99,624 bytes (97.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.WebSockets.dll: - 259,408 bytes (253.3 KB = 0.2 MB) + 259,368 bytes (253.3 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Numerics.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Numerics.Vectors.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.ObjectModel.dll: 77,648 bytes (75.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Private.CoreLib.dll: - 17,092,432 bytes (16,691.8 KB = 16.3 MB) + 17,085,776 bytes (16,685.3 KB = 16.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Private.DataContractSerialization.dll: 2,397,008 bytes (2,340.8 KB = 2.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Private.Uri.dll: - 265,552 bytes (259.3 KB = 0.3 MB) + 265,512 bytes (259.3 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Private.Xml.dll: - 9,001,808 bytes (8,790.8 KB = 8.6 MB) + 9,002,792 bytes (8,791.8 KB = 8.6 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Private.Xml.Linq.dll: 441,168 bytes (430.8 KB = 0.4 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Reflection.DispatchProxy.dll: - 72,528 bytes (70.8 KB = 0.1 MB) + 72,488 bytes (70.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Reflection.dll: - 16,208 bytes (15.8 KB = 0.0 MB) + 16,168 bytes (15.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Reflection.Emit.dll: - 344,400 bytes (336.3 KB = 0.3 MB) + 344,360 bytes (336.3 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Reflection.Emit.ILGeneration.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Reflection.Emit.Lightweight.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Reflection.Extensions.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Reflection.Metadata.dll: - 1,276,240 bytes (1,246.3 KB = 1.2 MB) + 1,276,200 bytes (1,246.3 KB = 1.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Reflection.Primitives.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Reflection.TypeExtensions.dll: - 34,128 bytes (33.3 KB = 0.0 MB) + 34,088 bytes (33.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Resources.Reader.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Resources.ResourceManager.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Resources.Writer.dll: - 45,392 bytes (44.3 KB = 0.0 MB) + 45,904 bytes (44.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Runtime.CompilerServices.Unsafe.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Runtime.CompilerServices.VisualC.dll: 18,768 bytes (18.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Runtime.dll: @@ -237,45 +237,45 @@ Contents/MonoBundle/.xamarin/osx-arm64/System.Runtime.InteropServices.dll: Contents/MonoBundle/.xamarin/osx-arm64/System.Runtime.InteropServices.JavaScript.dll: 39,760 bytes (38.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Runtime.InteropServices.RuntimeInformation.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Runtime.Intrinsics.dll: - 17,232 bytes (16.8 KB = 0.0 MB) + 17,192 bytes (16.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Runtime.Loader.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Runtime.Numerics.dll: - 366,416 bytes (357.8 KB = 0.3 MB) + 366,376 bytes (357.8 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Runtime.Serialization.dll: - 16,720 bytes (16.3 KB = 0.0 MB) + 16,680 bytes (16.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Runtime.Serialization.Formatters.dll: - 128,848 bytes (125.8 KB = 0.1 MB) + 128,808 bytes (125.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Runtime.Serialization.Json.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Runtime.Serialization.Primitives.dll: - 30,032 bytes (29.3 KB = 0.0 MB) + 29,992 bytes (29.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Runtime.Serialization.Xml.dll: 16,720 bytes (16.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Security.AccessControl.dll: - 59,728 bytes (58.3 KB = 0.1 MB) + 59,688 bytes (58.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Security.Claims.dll: 102,224 bytes (99.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Security.Cryptography.Algorithms.dll: - 17,232 bytes (16.8 KB = 0.0 MB) + 17,192 bytes (16.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Security.Cryptography.Cng.dll: 16,208 bytes (15.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Security.Cryptography.Csp.dll: - 16,208 bytes (15.8 KB = 0.0 MB) + 16,168 bytes (15.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Security.Cryptography.dll: - 2,459,472 bytes (2,401.8 KB = 2.3 MB) + 2,459,944 bytes (2,402.3 KB = 2.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Security.Cryptography.Encoding.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Security.Cryptography.OpenSsl.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Security.Cryptography.Primitives.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Security.Cryptography.X509Certificates.dll: - 16,720 bytes (16.3 KB = 0.0 MB) + 16,680 bytes (16.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Security.dll: - 18,256 bytes (17.8 KB = 0.0 MB) + 18,216 bytes (17.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Security.Principal.dll: 15,184 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Security.Principal.Windows.dll: @@ -283,55 +283,55 @@ Contents/MonoBundle/.xamarin/osx-arm64/System.Security.Principal.Windows.dll: Contents/MonoBundle/.xamarin/osx-arm64/System.Security.SecureString.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.ServiceModel.Web.dll: - 16,720 bytes (16.3 KB = 0.0 MB) + 16,680 bytes (16.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.ServiceProcess.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Text.Encoding.CodePages.dll: 869,200 bytes (848.8 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Text.Encoding.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Text.Encoding.Extensions.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Text.Encodings.Web.dll: - 122,192 bytes (119.3 KB = 0.1 MB) + 122,152 bytes (119.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Text.Json.dll: - 2,101,584 bytes (2,052.3 KB = 2.0 MB) + 2,101,544 bytes (2,052.3 KB = 2.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Text.RegularExpressions.dll: 1,159,504 bytes (1,132.3 KB = 1.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Threading.AccessControl.dll: - 34,640 bytes (33.8 KB = 0.0 MB) + 34,600 bytes (33.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Threading.Channels.dll: - 165,200 bytes (161.3 KB = 0.2 MB) + 165,160 bytes (161.3 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Threading.dll: 80,208 bytes (78.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Threading.Overlapped.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Threading.Tasks.Dataflow.dll: - 532,304 bytes (519.8 KB = 0.5 MB) + 532,264 bytes (519.8 KB = 0.5 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Threading.Tasks.dll: - 16,720 bytes (16.3 KB = 0.0 MB) + 16,680 bytes (16.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Threading.Tasks.Extensions.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Threading.Tasks.Parallel.dll: - 133,968 bytes (130.8 KB = 0.1 MB) + 133,928 bytes (130.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Threading.Thread.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Threading.ThreadPool.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Threading.Timer.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Transactions.dll: - 16,720 bytes (16.3 KB = 0.0 MB) + 16,680 bytes (16.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Transactions.Local.dll: - 400,720 bytes (391.3 KB = 0.4 MB) + 400,680 bytes (391.3 KB = 0.4 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.ValueTuple.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Web.dll: 15,184 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Web.HttpUtility.dll: - 56,656 bytes (55.3 KB = 0.1 MB) + 56,616 bytes (55.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Windows.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Xml.dll: 23,376 bytes (22.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Xml.Linq.dll: @@ -339,47 +339,47 @@ Contents/MonoBundle/.xamarin/osx-arm64/System.Xml.Linq.dll: Contents/MonoBundle/.xamarin/osx-arm64/System.Xml.ReaderWriter.dll: 21,840 bytes (21.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Xml.Serialization.dll: - 16,208 bytes (15.8 KB = 0.0 MB) + 16,168 bytes (15.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Xml.XDocument.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Xml.XmlDocument.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Xml.XmlSerializer.dll: - 17,744 bytes (17.3 KB = 0.0 MB) + 17,704 bytes (17.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Xml.XPath.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Xml.XPath.XDocument.dll: - 17,232 bytes (16.8 KB = 0.0 MB) + 17,192 bytes (16.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/WindowsBase.dll: 16,208 bytes (15.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.CSharp.dll: - 795,984 bytes (777.3 KB = 0.8 MB) + 795,944 bytes (777.3 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.macOS.dll: - 37,168,640 bytes (36,297.5 KB = 35.4 MB) + 36,936,704 bytes (36,071.0 KB = 35.2 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.VisualBasic.Core.dll: - 1,166,160 bytes (1,138.8 KB = 1.1 MB) + 1,166,120 bytes (1,138.8 KB = 1.1 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.VisualBasic.dll: - 17,232 bytes (16.8 KB = 0.0 MB) + 17,192 bytes (16.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.Win32.Primitives.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.Win32.Registry.dll: - 34,128 bytes (33.3 KB = 0.0 MB) + 34,088 bytes (33.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/mscorlib.dll: - 59,728 bytes (58.3 KB = 0.1 MB) + 59,688 bytes (58.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/netstandard.dll: - 100,688 bytes (98.3 KB = 0.1 MB) + 100,648 bytes (98.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/SizeTestApp.dll: 6,656 bytes (6.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.AppContext.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Buffers.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Collections.Concurrent.dll: - 227,664 bytes (222.3 KB = 0.2 MB) + 227,624 bytes (222.3 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Collections.dll: - 288,592 bytes (281.8 KB = 0.3 MB) + 288,552 bytes (281.8 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Collections.Immutable.dll: - 984,400 bytes (961.3 KB = 0.9 MB) + 984,360 bytes (961.3 KB = 0.9 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Collections.NonGeneric.dll: 92,496 bytes (90.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Collections.Specialized.dll: @@ -389,199 +389,199 @@ Contents/MonoBundle/.xamarin/osx-x64/System.ComponentModel.Annotations.dll: Contents/MonoBundle/.xamarin/osx-x64/System.ComponentModel.DataAnnotations.dll: 16,720 bytes (16.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.ComponentModel.dll: - 17,232 bytes (16.8 KB = 0.0 MB) + 17,192 bytes (16.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.ComponentModel.EventBasedAsync.dll: - 35,664 bytes (34.8 KB = 0.0 MB) + 35,624 bytes (34.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.ComponentModel.Primitives.dll: - 70,480 bytes (68.8 KB = 0.1 MB) + 70,440 bytes (68.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.ComponentModel.TypeConverter.dll: 759,632 bytes (741.8 KB = 0.7 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Configuration.dll: - 19,280 bytes (18.8 KB = 0.0 MB) + 19,240 bytes (18.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Console.dll: 198,992 bytes (194.3 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Core.dll: - 23,376 bytes (22.8 KB = 0.0 MB) + 23,336 bytes (22.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Data.Common.dll: - 2,803,024 bytes (2,737.3 KB = 2.7 MB) + 2,802,984 bytes (2,737.3 KB = 2.7 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Data.DataSetExtensions.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Data.dll: - 25,424 bytes (24.8 KB = 0.0 MB) + 25,384 bytes (24.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.Contracts.dll: 16,208 bytes (15.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.Debug.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.DiagnosticSource.dll: 498,000 bytes (486.3 KB = 0.5 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.FileVersionInfo.dll: 42,832 bytes (41.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.Process.dll: - 235,856 bytes (230.3 KB = 0.2 MB) + 235,816 bytes (230.3 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.StackTrace.dll: - 34,640 bytes (33.8 KB = 0.0 MB) + 34,600 bytes (33.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.TextWriterTraceListener.dll: - 58,704 bytes (57.3 KB = 0.1 MB) + 58,664 bytes (57.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.Tools.dll: 15,184 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.TraceSource.dll: - 130,896 bytes (127.8 KB = 0.1 MB) + 130,856 bytes (127.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.Tracing.dll: - 16,208 bytes (15.8 KB = 0.0 MB) + 16,168 bytes (15.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.dll: - 50,512 bytes (49.3 KB = 0.0 MB) + 50,472 bytes (49.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Drawing.dll: - 20,304 bytes (19.8 KB = 0.0 MB) + 20,264 bytes (19.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Drawing.Primitives.dll: 123,216 bytes (120.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Dynamic.Runtime.dll: - 16,208 bytes (15.8 KB = 0.0 MB) + 16,168 bytes (15.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Formats.Asn1.dll: - 224,080 bytes (218.8 KB = 0.2 MB) + 224,040 bytes (218.8 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Formats.Tar.dll: - 275,792 bytes (269.3 KB = 0.3 MB) + 275,752 bytes (269.3 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Globalization.Calendars.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Globalization.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Globalization.Extensions.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.Compression.Brotli.dll: - 73,552 bytes (71.8 KB = 0.1 MB) + 73,512 bytes (71.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.Compression.dll: 416,080 bytes (406.3 KB = 0.4 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.Compression.FileSystem.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.Compression.ZipFile.dll: - 98,640 bytes (96.3 KB = 0.1 MB) + 98,600 bytes (96.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.FileSystem.AccessControl.dll: - 33,104 bytes (32.3 KB = 0.0 MB) + 33,064 bytes (32.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.FileSystem.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.FileSystem.DriveInfo.dll: 81,744 bytes (79.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.FileSystem.Primitives.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.FileSystem.Watcher.dll: - 105,808 bytes (103.3 KB = 0.1 MB) + 105,768 bytes (103.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.IsolatedStorage.dll: 76,624 bytes (74.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.MemoryMappedFiles.dll: - 83,792 bytes (81.8 KB = 0.1 MB) + 83,752 bytes (81.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.Pipelines.dll: - 181,584 bytes (177.3 KB = 0.2 MB) + 181,032 bytes (176.8 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.Pipes.AccessControl.dll: - 24,400 bytes (23.8 KB = 0.0 MB) + 24,360 bytes (23.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.Pipes.dll: 127,312 bytes (124.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.UnmanagedMemoryStream.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Linq.AsyncEnumerable.dll: 1,328,464 bytes (1,297.3 KB = 1.3 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Linq.dll: - 696,656 bytes (680.3 KB = 0.7 MB) + 696,616 bytes (680.3 KB = 0.7 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Linq.Expressions.dll: - 3,725,136 bytes (3,637.8 KB = 3.6 MB) + 3,723,600 bytes (3,636.3 KB = 3.6 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Linq.Parallel.dll: 776,016 bytes (757.8 KB = 0.7 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Linq.Queryable.dll: - 178,512 bytes (174.3 KB = 0.2 MB) + 178,472 bytes (174.3 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Memory.dll: 152,400 bytes (148.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.dll: - 17,232 bytes (16.8 KB = 0.0 MB) + 17,192 bytes (16.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.Http.dll: - 1,754,960 bytes (1,713.8 KB = 1.7 MB) + 1,757,008 bytes (1,715.8 KB = 1.7 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.Http.Json.dll: 120,144 bytes (117.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.HttpListener.dll: - 291,664 bytes (284.8 KB = 0.3 MB) + 291,624 bytes (284.8 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.Mail.dll: - 479,056 bytes (467.8 KB = 0.5 MB) + 481,064 bytes (469.8 KB = 0.5 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.NameResolution.dll: 97,616 bytes (95.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.NetworkInformation.dll: 135,504 bytes (132.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.Ping.dll: - 89,424 bytes (87.3 KB = 0.1 MB) + 89,384 bytes (87.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.Primitives.dll: - 214,864 bytes (209.8 KB = 0.2 MB) + 214,824 bytes (209.8 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.Quic.dll: 345,424 bytes (337.3 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.Requests.dll: - 367,440 bytes (358.8 KB = 0.4 MB) + 367,400 bytes (358.8 KB = 0.4 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.Security.dll: - 756,560 bytes (738.8 KB = 0.7 MB) + 757,072 bytes (739.3 KB = 0.7 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.ServerSentEvents.dll: 71,504 bytes (69.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.ServicePoint.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.Sockets.dll: - 603,984 bytes (589.8 KB = 0.6 MB) + 603,944 bytes (589.8 KB = 0.6 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.WebClient.dll: - 156,496 bytes (152.8 KB = 0.1 MB) + 156,456 bytes (152.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.WebHeaderCollection.dll: - 54,608 bytes (53.3 KB = 0.1 MB) + 54,568 bytes (53.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.WebProxy.dll: - 32,592 bytes (31.8 KB = 0.0 MB) + 32,552 bytes (31.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.WebSockets.Client.dll: - 90,448 bytes (88.3 KB = 0.1 MB) + 90,920 bytes (88.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.WebSockets.dll: - 235,856 bytes (230.3 KB = 0.2 MB) + 235,816 bytes (230.3 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Numerics.dll: 15,184 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Numerics.Vectors.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.ObjectModel.dll: - 69,456 bytes (67.8 KB = 0.1 MB) + 69,416 bytes (67.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Private.CoreLib.dll: - 15,565,136 bytes (15,200.3 KB = 14.8 MB) + 15,555,920 bytes (15,191.3 KB = 14.8 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Private.DataContractSerialization.dll: - 2,071,376 bytes (2,022.8 KB = 2.0 MB) + 2,071,336 bytes (2,022.8 KB = 2.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Private.Uri.dll: - 245,072 bytes (239.3 KB = 0.2 MB) + 245,032 bytes (239.3 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Private.Xml.dll: - 7,902,032 bytes (7,716.8 KB = 7.5 MB) + 7,902,504 bytes (7,717.3 KB = 7.5 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Private.Xml.Linq.dll: 388,432 bytes (379.3 KB = 0.4 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.DispatchProxy.dll: - 66,896 bytes (65.3 KB = 0.1 MB) + 66,856 bytes (65.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.dll: - 16,208 bytes (15.8 KB = 0.0 MB) + 16,160 bytes (15.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.Emit.dll: - 302,928 bytes (295.8 KB = 0.3 MB) + 302,888 bytes (295.8 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.Emit.ILGeneration.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.Emit.Lightweight.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.Extensions.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.Metadata.dll: - 1,147,728 bytes (1,120.8 KB = 1.1 MB) + 1,147,688 bytes (1,120.8 KB = 1.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.Primitives.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.TypeExtensions.dll: - 32,080 bytes (31.3 KB = 0.0 MB) + 32,040 bytes (31.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Resources.Reader.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Resources.ResourceManager.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Resources.Writer.dll: 42,320 bytes (41.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.CompilerServices.Unsafe.dll: 15,184 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.CompilerServices.VisualC.dll: - 18,768 bytes (18.3 KB = 0.0 MB) + 18,728 bytes (18.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.dll: - 44,880 bytes (43.8 KB = 0.0 MB) + 44,840 bytes (43.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.Extensions.dll: - 17,744 bytes (17.3 KB = 0.0 MB) + 17,704 bytes (17.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.Handles.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.InteropServices.dll: - 102,224 bytes (99.8 KB = 0.1 MB) + 102,184 bytes (99.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.InteropServices.JavaScript.dll: 39,760 bytes (38.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.InteropServices.RuntimeInformation.dll: @@ -589,31 +589,31 @@ Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.InteropServices.RuntimeInfor Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.Intrinsics.dll: 17,232 bytes (16.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.Loader.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.Numerics.dll: - 342,864 bytes (334.8 KB = 0.3 MB) + 342,824 bytes (334.8 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.Serialization.dll: - 16,720 bytes (16.3 KB = 0.0 MB) + 16,680 bytes (16.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.Serialization.Formatters.dll: - 116,048 bytes (113.3 KB = 0.1 MB) + 116,008 bytes (113.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.Serialization.Json.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.Serialization.Primitives.dll: - 28,496 bytes (27.8 KB = 0.0 MB) + 28,456 bytes (27.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Runtime.Serialization.Xml.dll: - 16,720 bytes (16.3 KB = 0.0 MB) + 16,680 bytes (16.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Security.AccessControl.dll: - 59,728 bytes (58.3 KB = 0.1 MB) + 59,688 bytes (58.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Security.Claims.dll: 92,496 bytes (90.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Security.Cryptography.Algorithms.dll: - 17,232 bytes (16.8 KB = 0.0 MB) + 17,192 bytes (16.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Security.Cryptography.Cng.dll: 16,208 bytes (15.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Security.Cryptography.Csp.dll: - 16,208 bytes (15.8 KB = 0.0 MB) + 16,168 bytes (15.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Security.Cryptography.dll: - 2,138,448 bytes (2,088.3 KB = 2.0 MB) + 2,138,408 bytes (2,088.3 KB = 2.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Security.Cryptography.Encoding.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Security.Cryptography.OpenSsl.dll: @@ -623,99 +623,99 @@ Contents/MonoBundle/.xamarin/osx-x64/System.Security.Cryptography.Primitives.dll Contents/MonoBundle/.xamarin/osx-x64/System.Security.Cryptography.X509Certificates.dll: 16,720 bytes (16.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Security.dll: - 18,256 bytes (17.8 KB = 0.0 MB) + 18,216 bytes (17.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Security.Principal.dll: 15,184 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Security.Principal.Windows.dll: - 38,736 bytes (37.8 KB = 0.0 MB) + 38,696 bytes (37.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Security.SecureString.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.ServiceModel.Web.dll: - 16,720 bytes (16.3 KB = 0.0 MB) + 16,680 bytes (16.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.ServiceProcess.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Text.Encoding.CodePages.dll: 852,304 bytes (832.3 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Text.Encoding.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Text.Encoding.Extensions.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Text.Encodings.Web.dll: - 113,488 bytes (110.8 KB = 0.1 MB) + 114,000 bytes (111.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Text.Json.dll: - 1,882,448 bytes (1,838.3 KB = 1.8 MB) + 1,882,920 bytes (1,838.8 KB = 1.8 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Text.RegularExpressions.dll: - 1,036,112 bytes (1,011.8 KB = 1.0 MB) + 1,036,624 bytes (1,012.3 KB = 1.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Threading.AccessControl.dll: 34,640 bytes (33.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Threading.Channels.dll: - 149,328 bytes (145.8 KB = 0.1 MB) + 149,288 bytes (145.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Threading.dll: - 73,552 bytes (71.8 KB = 0.1 MB) + 73,512 bytes (71.8 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Threading.Overlapped.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Threading.Tasks.Dataflow.dll: - 470,864 bytes (459.8 KB = 0.4 MB) + 470,824 bytes (459.8 KB = 0.4 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Threading.Tasks.dll: - 16,720 bytes (16.3 KB = 0.0 MB) + 16,680 bytes (16.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Threading.Tasks.Extensions.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Threading.Tasks.Parallel.dll: - 121,168 bytes (118.3 KB = 0.1 MB) + 121,128 bytes (118.3 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Threading.Thread.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Threading.ThreadPool.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Threading.Timer.dll: 15,184 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Transactions.dll: - 16,720 bytes (16.3 KB = 0.0 MB) + 16,680 bytes (16.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Transactions.Local.dll: - 356,688 bytes (348.3 KB = 0.3 MB) + 356,648 bytes (348.3 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-x64/System.ValueTuple.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Web.dll: - 15,184 bytes (14.8 KB = 0.0 MB) + 15,144 bytes (14.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Web.HttpUtility.dll: 52,048 bytes (50.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Windows.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Xml.dll: - 23,376 bytes (22.8 KB = 0.0 MB) + 23,336 bytes (22.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Xml.Linq.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Xml.ReaderWriter.dll: - 21,840 bytes (21.3 KB = 0.0 MB) + 21,800 bytes (21.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Xml.Serialization.dll: - 16,208 bytes (15.8 KB = 0.0 MB) + 16,168 bytes (15.8 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Xml.XDocument.dll: 15,696 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Xml.XmlDocument.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Xml.XmlSerializer.dll: - 17,744 bytes (17.3 KB = 0.0 MB) + 17,704 bytes (17.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Xml.XPath.dll: - 15,696 bytes (15.3 KB = 0.0 MB) + 15,656 bytes (15.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Xml.XPath.XDocument.dll: - 16,720 bytes (16.3 KB = 0.0 MB) + 16,680 bytes (16.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/WindowsBase.dll: - 16,208 bytes (15.8 KB = 0.0 MB) + 16,168 bytes (15.8 KB = 0.0 MB) Contents/MonoBundle/libclrgc.dylib: - 1,952,112 bytes (1,906.4 KB = 1.9 MB) + 1,952,384 bytes (1,906.6 KB = 1.9 MB) Contents/MonoBundle/libclrgcexp.dylib: - 2,112,848 bytes (2,063.3 KB = 2.0 MB) + 2,129,776 bytes (2,079.9 KB = 2.0 MB) Contents/MonoBundle/libclrjit.dylib: 6,476,096 bytes (6,324.3 KB = 6.2 MB) Contents/MonoBundle/libcoreclr.dylib: - 12,769,952 bytes (12,470.7 KB = 12.2 MB) + 12,803,872 bytes (12,503.8 KB = 12.2 MB) Contents/MonoBundle/libhostfxr.dylib: 851,440 bytes (831.5 KB = 0.8 MB) Contents/MonoBundle/libhostpolicy.dylib: 832,640 bytes (813.1 KB = 0.8 MB) Contents/MonoBundle/libmscordaccore.dylib: - 4,849,184 bytes (4,735.5 KB = 4.6 MB) + 4,849,920 bytes (4,736.2 KB = 4.6 MB) Contents/MonoBundle/libmscordbi.dylib: - 3,539,568 bytes (3,456.6 KB = 3.4 MB) + 3,540,304 bytes (3,457.3 KB = 3.4 MB) Contents/MonoBundle/libSystem.Globalization.Native.dylib: 302,480 bytes (295.4 KB = 0.3 MB) Contents/MonoBundle/libSystem.IO.Compression.Native.dylib: diff --git a/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-TrimmableStatic-size.txt b/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-TrimmableStatic-size.txt index c8d4b2995f49..e9cbd87b0a9d 100644 --- a/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-TrimmableStatic-size.txt +++ b/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-TrimmableStatic-size.txt @@ -1,9 +1,9 @@ -AppBundleSize: 32,623,422 bytes (31,858.8 KB = 31.1 MB) +AppBundleSize: 21,496,766 bytes (20,992.9 KB = 20.5 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/Info.plist: 774 bytes (0.8 KB = 0.0 MB) Contents/MacOS/SizeTestApp: - 29,534,088 bytes (28,841.9 KB = 28.2 MB) + 18,407,432 bytes (17,976.0 KB = 17.6 MB) Contents/MonoBundle/libSystem.Globalization.Native.dylib: 267,872 bytes (261.6 KB = 0.3 MB) Contents/MonoBundle/libSystem.IO.Compression.Native.dylib: diff --git a/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-size.txt b/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-size.txt index 97e6175f6919..37164df10323 100644 --- a/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-size.txt +++ b/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-size.txt @@ -1,9 +1,9 @@ -AppBundleSize: 15,885,660 bytes (15,513.3 KB = 15.1 MB) +AppBundleSize: 8,779,452 bytes (8,573.7 KB = 8.4 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/Info.plist: 774 bytes (0.8 KB = 0.0 MB) Contents/MacOS/SizeTestApp: - 12,796,408 bytes (12,496.5 KB = 12.2 MB) + 5,690,200 bytes (5,556.8 KB = 5.4 MB) Contents/MonoBundle/libSystem.Globalization.Native.dylib: 267,872 bytes (261.6 KB = 0.3 MB) Contents/MonoBundle/libSystem.IO.Compression.Native.dylib: diff --git a/tests/dotnet/UnitTests/expected/TVOS-MonoVM-size.txt b/tests/dotnet/UnitTests/expected/TVOS-MonoVM-size.txt index 7d45165d95b8..d543d10081b4 100644 --- a/tests/dotnet/UnitTests/expected/TVOS-MonoVM-size.txt +++ b/tests/dotnet/UnitTests/expected/TVOS-MonoVM-size.txt @@ -1,4 +1,4 @@ -AppBundleSize: 9,283,155 bytes (9,065.6 KB = 8.9 MB) +AppBundleSize: 9,249,499 bytes (9,032.7 KB = 8.8 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: aot-instances.aotdata.arm64: 827,728 bytes (808.3 KB = 0.8 MB) @@ -13,7 +13,7 @@ PkgInfo: runtimeconfig.bin: 1,481 bytes (1.4 KB = 0.0 MB) SizeTestApp: - 7,185,600 bytes (7,017.2 KB = 6.9 MB) + 7,151,944 bytes (6,984.3 KB = 6.8 MB) SizeTestApp.aotdata.arm64: 1,464 bytes (1.4 KB = 0.0 MB) SizeTestApp.dll: diff --git a/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-TrimmableStatic-size.txt b/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-TrimmableStatic-size.txt index a86a76e4f8b3..e70aedda61fe 100644 --- a/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-TrimmableStatic-size.txt +++ b/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-TrimmableStatic-size.txt @@ -1,4 +1,4 @@ -AppBundleSize: 12,564,307 bytes (12,269.8 KB = 12.0 MB) +AppBundleSize: 7,821,227 bytes (7,637.9 KB = 7.5 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Info.plist: 1,162 bytes (1.1 KB = 0.0 MB) @@ -7,4 +7,4 @@ PkgInfo: runtimeconfig.bin: 1,889 bytes (1.8 KB = 0.0 MB) SizeTestApp: - 12,561,248 bytes (12,266.8 KB = 12.0 MB) + 7,818,168 bytes (7,634.9 KB = 7.5 MB) diff --git a/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-size.txt b/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-size.txt index 9b4bba4fdae4..60aca8256c34 100644 --- a/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-size.txt +++ b/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-size.txt @@ -1,4 +1,4 @@ -AppBundleSize: 6,065,706 bytes (5,923.5 KB = 5.8 MB) +AppBundleSize: 2,705,674 bytes (2,642.3 KB = 2.6 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Info.plist: 1,162 bytes (1.1 KB = 0.0 MB) @@ -7,4 +7,4 @@ PkgInfo: runtimeconfig.bin: 1,808 bytes (1.8 KB = 0.0 MB) SizeTestApp: - 6,062,728 bytes (5,920.6 KB = 5.8 MB) + 2,702,696 bytes (2,639.4 KB = 2.6 MB) diff --git a/tests/dotnet/UnitTests/expected/iOS-MonoVM-size.txt b/tests/dotnet/UnitTests/expected/iOS-MonoVM-size.txt index f2b0c597f890..3018db933c82 100644 --- a/tests/dotnet/UnitTests/expected/iOS-MonoVM-size.txt +++ b/tests/dotnet/UnitTests/expected/iOS-MonoVM-size.txt @@ -1,4 +1,4 @@ -AppBundleSize: 9,299,571 bytes (9,081.6 KB = 8.9 MB) +AppBundleSize: 9,249,547 bytes (9,032.8 KB = 8.8 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: aot-instances.aotdata.arm64: 827,728 bytes (808.3 KB = 0.8 MB) @@ -13,7 +13,7 @@ PkgInfo: runtimeconfig.bin: 1,481 bytes (1.4 KB = 0.0 MB) SizeTestApp: - 7,201,648 bytes (7,032.9 KB = 6.9 MB) + 7,151,624 bytes (6,984.0 KB = 6.8 MB) SizeTestApp.aotdata.arm64: 1,464 bytes (1.4 KB = 0.0 MB) SizeTestApp.dll: diff --git a/tests/dotnet/UnitTests/expected/iOS-NativeAOT-TrimmableStatic-size.txt b/tests/dotnet/UnitTests/expected/iOS-NativeAOT-TrimmableStatic-size.txt index 89e1eae952d7..904ad9cea70e 100644 --- a/tests/dotnet/UnitTests/expected/iOS-NativeAOT-TrimmableStatic-size.txt +++ b/tests/dotnet/UnitTests/expected/iOS-NativeAOT-TrimmableStatic-size.txt @@ -1,4 +1,4 @@ -AppBundleSize: 14,152,762 bytes (13,821.1 KB = 13.5 MB) +AppBundleSize: 8,998,346 bytes (8,787.4 KB = 8.6 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Info.plist: 1,186 bytes (1.2 KB = 0.0 MB) @@ -7,4 +7,4 @@ PkgInfo: runtimeconfig.bin: 1,888 bytes (1.8 KB = 0.0 MB) SizeTestApp: - 14,149,680 bytes (13,818.0 KB = 13.5 MB) + 8,995,264 bytes (8,784.4 KB = 8.6 MB) diff --git a/tests/dotnet/UnitTests/expected/iOS-NativeAOT-size.txt b/tests/dotnet/UnitTests/expected/iOS-NativeAOT-size.txt index 09a00fcc29a7..f79fd23434f0 100644 --- a/tests/dotnet/UnitTests/expected/iOS-NativeAOT-size.txt +++ b/tests/dotnet/UnitTests/expected/iOS-NativeAOT-size.txt @@ -1,4 +1,4 @@ -AppBundleSize: 6,082,434 bytes (5,939.9 KB = 5.8 MB) +AppBundleSize: 2,706,034 bytes (2,642.6 KB = 2.6 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Info.plist: 1,186 bytes (1.2 KB = 0.0 MB) @@ -7,4 +7,4 @@ PkgInfo: runtimeconfig.bin: 1,808 bytes (1.8 KB = 0.0 MB) SizeTestApp: - 6,079,432 bytes (5,936.9 KB = 5.8 MB) + 2,703,032 bytes (2,639.7 KB = 2.6 MB)