From 15a18ea6b3c3524a5065b3f9b29ee6604c02c2dc Mon Sep 17 00:00:00 2001 From: Norman Walsh Date: Fri, 20 Feb 2026 10:54:36 +0000 Subject: [PATCH] Correct the response URI and add content type and encoding Fix #95 Fix #96 --- UnitTests/DataAssemblyTest.cs | 4 ++-- UnitTests/ResolverTest.cs | 33 +++++++++++++++++++++++++++++++-- XmlResolver/ResourceAccess.cs | 27 ++++++++++++++++++++------- XmlResolver/ResourceResponse.cs | 2 +- 4 files changed, 54 insertions(+), 12 deletions(-) diff --git a/UnitTests/DataAssemblyTest.cs b/UnitTests/DataAssemblyTest.cs index 6274b62..634a24a 100644 --- a/UnitTests/DataAssemblyTest.cs +++ b/UnitTests/DataAssemblyTest.cs @@ -37,8 +37,8 @@ public void LookupRddl() */ Assert.NotNull(res); Assert.NotNull(res.Stream); - Assert.NotNull(res.Uri); - Assert.That(res.Uri.Scheme == "pack"); + Assert.NotNull(res.ResolvedUri); + Assert.That(res.ResolvedUri.Scheme == "pack"); } /* diff --git a/UnitTests/ResolverTest.cs b/UnitTests/ResolverTest.cs index c30736a..f934c55 100644 --- a/UnitTests/ResolverTest.cs +++ b/UnitTests/ResolverTest.cs @@ -51,7 +51,7 @@ public void LookupSystem() { IResourceResponse rsrc = resolver.ResolveEntity(null, null, "https://example.com/sample/1.0/sample.dtd", null); Assert.NotNull(rsrc.Stream); - Assert.AreEqual(result, rsrc.Uri); + Assert.AreEqual(result, rsrc.ResolvedUri); } catch (Exception ex) { Console.WriteLine(ex.Message); Assert.Fail(); @@ -63,9 +63,38 @@ public void LookupSystemAsUri() { try { Uri result = UriUtils.Resolve(TEST_ROOT_DIRECTORY, "UnitTests/resources/sample10/sample.dtd"); IResourceResponse rsrc = resolver.ResolveEntity(null, null, "https://example.com/sample/1.0/uri.dtd", null); + Assert.NotNull(rsrc.Stream); + Assert.AreEqual(result, rsrc.ResolvedUri); + } catch (Exception) { + Assert.Fail(); + } + } + [Test] + public void LookupUri() { + try + { + IResourceResponse rsrc = resolver.ResolveUri("XMLSchema.xsd", "http://www.w3.org/TR/xmlschema11-1/"); + Assert.NotNull(rsrc.Uri); + Assert.NotNull(rsrc.ResolvedUri); + Assert.NotNull(rsrc.Stream); + + Assert.AreEqual(new Uri("http://www.w3.org/TR/xmlschema11-1/XMLSchema.xsd"), rsrc.Uri); + Assert.AreEqual("pack", rsrc.ResolvedUri.Scheme); + } catch (Exception) { + Assert.Fail(); + } + } + + [Test] + public void LookupRedirectedUri() { + try + { + IResourceResponse rsrc = resolver.ResolveUri("https://www.w3.org/TR/1999/WD-font-19990902"); + Assert.NotNull(rsrc.Uri); + Assert.NotNull(rsrc.ResolvedUri); Assert.NotNull(rsrc.Stream); - Assert.AreEqual(result, rsrc.Uri); + Assert.NotNull(rsrc.Encoding); } catch (Exception) { Assert.Fail(); } diff --git a/XmlResolver/ResourceAccess.cs b/XmlResolver/ResourceAccess.cs index 25e6a2b..20a3f14 100644 --- a/XmlResolver/ResourceAccess.cs +++ b/XmlResolver/ResourceAccess.cs @@ -166,6 +166,19 @@ private static IResourceResponse _getHttpResource(IResourceRequest request, Uri } var rsrc = new ResourceResponse(request, resolvedUri); + + var pos = ctype.IndexOf("charset=", StringComparison.Ordinal); + if (pos > 0) + { + var charset = ctype.Substring(pos + 8); + pos = charset.IndexOf(";", StringComparison.Ordinal); + if (pos > 0) + { + charset = charset.Substring(0, pos); + } + rsrc.Encoding = charset; + } + rsrc.ContentType = ctype; rsrc.SetHeaders(headers); rsrc.Stream = resp.Content.ReadAsStream(); rsrc.StatusCode = 200; @@ -219,13 +232,13 @@ private static (Uri resolvedUri, HttpResponseMessage resp) _getHttpResponse(Uri throw CreateHttpRequestException("Failed to read resource", status); - HttpRequestException CreateHttpRequestException(string text, HttpStatusCode statusCode) - { -#if NETSTANDARD2_0 - return new HttpRequestException($"{text} ({statusCode})"); -#else - return new HttpRequestException(text, null, statusCode); -#endif + HttpRequestException CreateHttpRequestException(string text, HttpStatusCode statusCode) + { +#if NETSTANDARD2_0 + return new HttpRequestException($"{text} ({statusCode})"); +#else + return new HttpRequestException(text, null, statusCode); +#endif } } diff --git a/XmlResolver/ResourceResponse.cs b/XmlResolver/ResourceResponse.cs index 4099908..df1b2c8 100644 --- a/XmlResolver/ResourceResponse.cs +++ b/XmlResolver/ResourceResponse.cs @@ -15,7 +15,7 @@ internal ResourceResponse(IResourceRequest request, Uri? uri = null) { Request = request; Rejected = false; - Uri = uri; + Uri = request.GetAbsoluteUri(); ResolvedUri = uri; Resolved = uri != null; }