Implement DnsResolver for macOS - #131152

Closed
liveans wants to merge 12 commits into
dotnet:mainfrom
liveans:liveans-macos-pal-pr-129845
Closed

Implement DnsResolver for macOS#131152
liveans wants to merge 12 commits into
dotnet:mainfrom
liveans:liveans-macos-pal-pr-129845

Conversation

@liveans

Copy link
Copy Markdown
Contributor
  • Uses DNS-SD for system-configured DNS resolution on macOS.
  • Reuses the managed resolver from Implement DnsResolver for Linux #129846 for explicit DNS servers.
  • Adds macOS-specific functional and loopback tests.

Builds on #129846. Draft until 129846 merged.

/cc @rzikm

rzikmand others added 12 commits July 9, 2026 10:41
Implements the DnsResolver PAL for the unix TFM as a managed stub
resolver. It builds and parses DNS wire messages and talks to the
configured servers over UDP (with TCP fallback on truncation) using
System.Net.Sockets. When no servers are configured, the system servers
from /etc/resolv.conf are used, falling back to loopback.
- Add internal wire primitives: message header, reader, writer,
encoded-name (with IDN/ACE support), and per-type record parsers.
- Add DnsResolverPal.Managed.cs query engine with shared sync/async
paths; the sync path uses blocking socket calls and returns a
completed Task, preserving the task.IsCompleted invariant.
- Add ResolvConf.cs nameserver discovery plus parser unit tests.
- Wire the new sources into the unix ItemGroup; reference the
System.Net.Sockets reference assembly to break the project cycle
(Sockets references NameResolution); the implementation resolves from
the shared framework at runtime.
- Generalize the loopback tests to run on Linux by binding an ephemeral
port on non-Windows.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Adds System.Net.NameResolution.Unit.Tests covering the internal DNS
wire-format types (DnsEncodedName, DnsMessageHeader/Reader/Writer, and
typed RDATA parsing). The project links the production parsing sources
so the internal types can be exercised directly.
Also adds DnsEncodedName.GetFormattedLength() to expose the decoded
dotted-string length (already computed internally) for buffer sizing.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The managed Unix DNS stub resolver used System.Net.Sockets.Socket for UDP/TCP
queries. Because System.Net.Sockets already depends on System.Net.NameResolution
(Socket.Connect(host, port) resolves names through Dns), the emitted
NameResolution.dll carried a real metadata reference back to Sockets, closing a
dependency cycle that the shared-framework VerifyClosure task rejects. This built
locally but failed the CoreCLR/Mono runtime-pack build legs on CI.
Access Socket through a new internal DnsSocket reflection wrapper so
NameResolution no longer statically references System.Net.Sockets. The wrapper
binds the required Socket members to delegates so exceptions (e.g. SocketException)
propagate directly instead of being wrapped in TargetInvocationException, and a
DynamicDependency attribute preserves the members for trimming/AOT. SocketException,
SocketError and AddressFamily live in System.Net.Primitives and continue to be used
directly.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
…uccess
- Gate the loopback DNS resolver tests on IsNotBrowser and IsNotWasi in
addition to IsNotMobile. The functional test project multi-targets
-browser and -wasi where DnsResolverPal is Unsupported, so these
socket-based tests would otherwise run and fail there.
- Assert success of DnsMessageReader.TryCreate/TryReadQuestion/TryReadRecord
in the DnsRecordTypeTests GetAnswerRecord helper so malformed input
surfaces clearly instead of failing in less obvious ways.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: f11fb54e-638e-4c9e-ad82-e5d9ff5c20e4
CopilotAI review requested due to automatic review settings July 21, 2026 14:16
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @karelz, @dotnet/ncl
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Implements a macOS-specific DnsResolverPal for System.Net.NameResolution that uses DNS-SD (DNSServiceQueryRecord) for system-configured DNS resolution while continuing to use the managed stub resolver when explicit DNS servers are provided. This extends the existing cross-platform DNS resolver work by adding an OSX PAL, shared managed wire-format handling, and corresponding tests.

Changes:

  • Add DnsResolverPal.OSX backed by DNS-SD, plus OSX interop declarations for DNSServiceQueryRecord APIs.
  • Add/enable managed DNS stub resolver + wire-format reader/writer and record parsing types for Unix/OSX builds.
  • Add new unit tests for wire-format components and expand functional/loopback tests and PAL tests (including resolv.conf parsing).

Reviewed changes

Copilot reviewed 24 out of 24 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
src/libraries/System.Net.NameResolution/tests/UnitTests/System.Net.NameResolution.Unit.Tests.csprojNew unit test project that links managed DNS wire-format production code for testing.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsEncodedNameTests.csUnit coverage for DNS name encoding/decoding, compression pointers, and IDN handling.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsMessageHeaderTests.csUnit coverage for header encoding/decoding and flag/rcode/opcode round-trips.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsMessageReaderTests.csUnit coverage for parsing questions/records and malformed buffer handling.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsMessageWriterTests.csUnit coverage for query writing, buffer sizing, and pointer expansion behavior.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsRecordTypeTests.csUnit coverage for typed RDATA parsing (A/AAAA/CNAME/MX/SRV/TXT/PTR/NS/SOA) and malformed cases.
src/libraries/System.Net.NameResolution/tests/PalTests/System.Net.NameResolution.Pal.Tests.csprojAdds Unix-only compilation of ResolvConf production code + tests into PAL test project.
src/libraries/System.Net.NameResolution/tests/PalTests/ResolvConfTests.csNew tests for parsing nameserver directives from resolv.conf-style content.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/System.Net.NameResolution.Functional.Tests.csprojAdds OSX to functional test TFMs.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverTest.csExpands functional coverage to OSX and adds OSX-specific behavior/edge-case assertions via reflection hooks.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverLoopbackTest.csBroadens loopback tests beyond Windows and adds OSX custom-server behavior + negative cache TTL assertions for managed resolver.
src/libraries/System.Net.NameResolution/src/System/Net/ResolvConf.csNew resolv.conf nameserver parsing helper for managed resolver system-server discovery (Unix path).
src/libraries/System.Net.NameResolution/src/System/Net/DnsWireEnums.csNew internal DNS wire enums (TYPE/CLASS/OPCODE/FLAGS).
src/libraries/System.Net.NameResolution/src/System/Net/DnsSocket.csNew reflection-based socket wrapper to avoid System.Net.Sockets reference cycles for managed resolver.
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolverPal.Managed.csNew managed stub resolver PAL for Unix-style explicit-server querying (UDP with TCP fallback).
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolverPal.OSX.csNew macOS PAL that uses DNS-SD for system-configured resolution and defers explicit-server queries to the managed PAL.
src/libraries/System.Net.NameResolution/src/System/Net/DnsEncodedName.csNew internal wire-format DNS name representation with compression pointer support and IDN conversion.
src/libraries/System.Net.NameResolution/src/System/Net/DnsMessageHeader.csNew DNS header encode/decode implementation.
src/libraries/System.Net.NameResolution/src/System/Net/DnsMessageReader.csNew sequential DNS message reader for header/questions/records.
src/libraries/System.Net.NameResolution/src/System/Net/DnsMessageWriter.csNew DNS query writer (header + question entries).
src/libraries/System.Net.NameResolution/src/System/Net/DnsRecordParsing.csNew typed record parsing helpers for common RDATA formats.
src/libraries/System.Net.NameResolution/src/System.Net.NameResolution.csprojAdds OSX TFM and wires Unix/OSX compilation of managed resolver components + OSX PAL + required references.
src/libraries/System.Net.NameResolution/src/Resources/Strings.resxAdds a new resource string for invalid DNS names.
src/libraries/Common/src/Interop/OSX/Interop.Dnssd.csNew OSX interop declarations for DNS-SD APIs used by the macOS PAL.

Comment on lines +4 to +5
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
Comment on lines +4 to +5
using System.Buffers;
using System.Net;
{
cancellationToken.ThrowIfCancellationRequested();

Interop.Error error = Interop.Sys.Poll(fileHandle, Interop.PollEvents.POLLIN, PollTimeoutMilliseconds, out Interop.PollEvents triggered);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It might be possible to implement async resolution by doing a ReceiveAsync on an empty buffer, instead of offloading to the thread pool.

@liveansliveans assigned rzikm and unassigned liveansAug 3, 2026
@wfurtwfurt self-assigned this Aug 6, 2026
@wfurt

wfurt commented Aug 6, 2026

Copy link
Copy Markdown
Member

replaced by follow-up #131934. Thanks @liveans

@wfurtwfurt closed this Aug 6, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@liveans@wfurt@teo-tsirpanis@rzikm
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Implement DnsResolver for macOS - #131152

Closed
liveans wants to merge 12 commits into
dotnet:mainfrom
liveans:liveans-macos-pal-pr-129845
Closed

Implement DnsResolver for macOS#131152
liveans wants to merge 12 commits into
dotnet:mainfrom
liveans:liveans-macos-pal-pr-129845

Conversation

@liveans

Copy link
Copy Markdown
Contributor
  • Uses DNS-SD for system-configured DNS resolution on macOS.
  • Reuses the managed resolver from Implement DnsResolver for Linux #129846 for explicit DNS servers.
  • Adds macOS-specific functional and loopback tests.

Builds on #129846. Draft until 129846 merged.

/cc @rzikm

rzikmand others added 12 commits July 9, 2026 10:41
Implements the DnsResolver PAL for the unix TFM as a managed stub
resolver. It builds and parses DNS wire messages and talks to the
configured servers over UDP (with TCP fallback on truncation) using
System.Net.Sockets. When no servers are configured, the system servers
from /etc/resolv.conf are used, falling back to loopback.
- Add internal wire primitives: message header, reader, writer,
encoded-name (with IDN/ACE support), and per-type record parsers.
- Add DnsResolverPal.Managed.cs query engine with shared sync/async
paths; the sync path uses blocking socket calls and returns a
completed Task, preserving the task.IsCompleted invariant.
- Add ResolvConf.cs nameserver discovery plus parser unit tests.
- Wire the new sources into the unix ItemGroup; reference the
System.Net.Sockets reference assembly to break the project cycle
(Sockets references NameResolution); the implementation resolves from
the shared framework at runtime.
- Generalize the loopback tests to run on Linux by binding an ephemeral
port on non-Windows.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Adds System.Net.NameResolution.Unit.Tests covering the internal DNS
wire-format types (DnsEncodedName, DnsMessageHeader/Reader/Writer, and
typed RDATA parsing). The project links the production parsing sources
so the internal types can be exercised directly.
Also adds DnsEncodedName.GetFormattedLength() to expose the decoded
dotted-string length (already computed internally) for buffer sizing.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The managed Unix DNS stub resolver used System.Net.Sockets.Socket for UDP/TCP
queries. Because System.Net.Sockets already depends on System.Net.NameResolution
(Socket.Connect(host, port) resolves names through Dns), the emitted
NameResolution.dll carried a real metadata reference back to Sockets, closing a
dependency cycle that the shared-framework VerifyClosure task rejects. This built
locally but failed the CoreCLR/Mono runtime-pack build legs on CI.
Access Socket through a new internal DnsSocket reflection wrapper so
NameResolution no longer statically references System.Net.Sockets. The wrapper
binds the required Socket members to delegates so exceptions (e.g. SocketException)
propagate directly instead of being wrapped in TargetInvocationException, and a
DynamicDependency attribute preserves the members for trimming/AOT. SocketException,
SocketError and AddressFamily live in System.Net.Primitives and continue to be used
directly.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
…uccess
- Gate the loopback DNS resolver tests on IsNotBrowser and IsNotWasi in
addition to IsNotMobile. The functional test project multi-targets
-browser and -wasi where DnsResolverPal is Unsupported, so these
socket-based tests would otherwise run and fail there.
- Assert success of DnsMessageReader.TryCreate/TryReadQuestion/TryReadRecord
in the DnsRecordTypeTests GetAnswerRecord helper so malformed input
surfaces clearly instead of failing in less obvious ways.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: f11fb54e-638e-4c9e-ad82-e5d9ff5c20e4
CopilotAI review requested due to automatic review settings July 21, 2026 14:16
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @karelz, @dotnet/ncl
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Implements a macOS-specific DnsResolverPal for System.Net.NameResolution that uses DNS-SD (DNSServiceQueryRecord) for system-configured DNS resolution while continuing to use the managed stub resolver when explicit DNS servers are provided. This extends the existing cross-platform DNS resolver work by adding an OSX PAL, shared managed wire-format handling, and corresponding tests.

Changes:

  • Add DnsResolverPal.OSX backed by DNS-SD, plus OSX interop declarations for DNSServiceQueryRecord APIs.
  • Add/enable managed DNS stub resolver + wire-format reader/writer and record parsing types for Unix/OSX builds.
  • Add new unit tests for wire-format components and expand functional/loopback tests and PAL tests (including resolv.conf parsing).

Reviewed changes

Copilot reviewed 24 out of 24 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
src/libraries/System.Net.NameResolution/tests/UnitTests/System.Net.NameResolution.Unit.Tests.csprojNew unit test project that links managed DNS wire-format production code for testing.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsEncodedNameTests.csUnit coverage for DNS name encoding/decoding, compression pointers, and IDN handling.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsMessageHeaderTests.csUnit coverage for header encoding/decoding and flag/rcode/opcode round-trips.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsMessageReaderTests.csUnit coverage for parsing questions/records and malformed buffer handling.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsMessageWriterTests.csUnit coverage for query writing, buffer sizing, and pointer expansion behavior.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsRecordTypeTests.csUnit coverage for typed RDATA parsing (A/AAAA/CNAME/MX/SRV/TXT/PTR/NS/SOA) and malformed cases.
src/libraries/System.Net.NameResolution/tests/PalTests/System.Net.NameResolution.Pal.Tests.csprojAdds Unix-only compilation of ResolvConf production code + tests into PAL test project.
src/libraries/System.Net.NameResolution/tests/PalTests/ResolvConfTests.csNew tests for parsing nameserver directives from resolv.conf-style content.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/System.Net.NameResolution.Functional.Tests.csprojAdds OSX to functional test TFMs.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverTest.csExpands functional coverage to OSX and adds OSX-specific behavior/edge-case assertions via reflection hooks.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverLoopbackTest.csBroadens loopback tests beyond Windows and adds OSX custom-server behavior + negative cache TTL assertions for managed resolver.
src/libraries/System.Net.NameResolution/src/System/Net/ResolvConf.csNew resolv.conf nameserver parsing helper for managed resolver system-server discovery (Unix path).
src/libraries/System.Net.NameResolution/src/System/Net/DnsWireEnums.csNew internal DNS wire enums (TYPE/CLASS/OPCODE/FLAGS).
src/libraries/System.Net.NameResolution/src/System/Net/DnsSocket.csNew reflection-based socket wrapper to avoid System.Net.Sockets reference cycles for managed resolver.
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolverPal.Managed.csNew managed stub resolver PAL for Unix-style explicit-server querying (UDP with TCP fallback).
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolverPal.OSX.csNew macOS PAL that uses DNS-SD for system-configured resolution and defers explicit-server queries to the managed PAL.
src/libraries/System.Net.NameResolution/src/System/Net/DnsEncodedName.csNew internal wire-format DNS name representation with compression pointer support and IDN conversion.
src/libraries/System.Net.NameResolution/src/System/Net/DnsMessageHeader.csNew DNS header encode/decode implementation.
src/libraries/System.Net.NameResolution/src/System/Net/DnsMessageReader.csNew sequential DNS message reader for header/questions/records.
src/libraries/System.Net.NameResolution/src/System/Net/DnsMessageWriter.csNew DNS query writer (header + question entries).
src/libraries/System.Net.NameResolution/src/System/Net/DnsRecordParsing.csNew typed record parsing helpers for common RDATA formats.
src/libraries/System.Net.NameResolution/src/System.Net.NameResolution.csprojAdds OSX TFM and wires Unix/OSX compilation of managed resolver components + OSX PAL + required references.
src/libraries/System.Net.NameResolution/src/Resources/Strings.resxAdds a new resource string for invalid DNS names.
src/libraries/Common/src/Interop/OSX/Interop.Dnssd.csNew OSX interop declarations for DNS-SD APIs used by the macOS PAL.

Comment on lines +4 to +5
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
Comment on lines +4 to +5
using System.Buffers;
using System.Net;
{
cancellationToken.ThrowIfCancellationRequested();

Interop.Error error = Interop.Sys.Poll(fileHandle, Interop.PollEvents.POLLIN, PollTimeoutMilliseconds, out Interop.PollEvents triggered);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It might be possible to implement async resolution by doing a ReceiveAsync on an empty buffer, instead of offloading to the thread pool.

@liveansliveans assigned rzikm and unassigned liveansAug 3, 2026
@wfurtwfurt self-assigned this Aug 6, 2026
@wfurt

wfurt commented Aug 6, 2026

Copy link
Copy Markdown
Member

replaced by follow-up #131934. Thanks @liveans

@wfurtwfurt closed this Aug 6, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@liveans@wfurt@teo-tsirpanis@rzikm
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Implement DnsResolver for macOS - #131152

Closed
liveans wants to merge 12 commits into
dotnet:mainfrom
liveans:liveans-macos-pal-pr-129845
Closed

Implement DnsResolver for macOS#131152
liveans wants to merge 12 commits into
dotnet:mainfrom
liveans:liveans-macos-pal-pr-129845

Conversation

@liveans

Copy link
Copy Markdown
Contributor
  • Uses DNS-SD for system-configured DNS resolution on macOS.
  • Reuses the managed resolver from Implement DnsResolver for Linux #129846 for explicit DNS servers.
  • Adds macOS-specific functional and loopback tests.

Builds on #129846. Draft until 129846 merged.

/cc @rzikm

rzikmand others added 12 commits July 9, 2026 10:41
Implements the DnsResolver PAL for the unix TFM as a managed stub
resolver. It builds and parses DNS wire messages and talks to the
configured servers over UDP (with TCP fallback on truncation) using
System.Net.Sockets. When no servers are configured, the system servers
from /etc/resolv.conf are used, falling back to loopback.
- Add internal wire primitives: message header, reader, writer,
encoded-name (with IDN/ACE support), and per-type record parsers.
- Add DnsResolverPal.Managed.cs query engine with shared sync/async
paths; the sync path uses blocking socket calls and returns a
completed Task, preserving the task.IsCompleted invariant.
- Add ResolvConf.cs nameserver discovery plus parser unit tests.
- Wire the new sources into the unix ItemGroup; reference the
System.Net.Sockets reference assembly to break the project cycle
(Sockets references NameResolution); the implementation resolves from
the shared framework at runtime.
- Generalize the loopback tests to run on Linux by binding an ephemeral
port on non-Windows.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Adds System.Net.NameResolution.Unit.Tests covering the internal DNS
wire-format types (DnsEncodedName, DnsMessageHeader/Reader/Writer, and
typed RDATA parsing). The project links the production parsing sources
so the internal types can be exercised directly.
Also adds DnsEncodedName.GetFormattedLength() to expose the decoded
dotted-string length (already computed internally) for buffer sizing.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The managed Unix DNS stub resolver used System.Net.Sockets.Socket for UDP/TCP
queries. Because System.Net.Sockets already depends on System.Net.NameResolution
(Socket.Connect(host, port) resolves names through Dns), the emitted
NameResolution.dll carried a real metadata reference back to Sockets, closing a
dependency cycle that the shared-framework VerifyClosure task rejects. This built
locally but failed the CoreCLR/Mono runtime-pack build legs on CI.
Access Socket through a new internal DnsSocket reflection wrapper so
NameResolution no longer statically references System.Net.Sockets. The wrapper
binds the required Socket members to delegates so exceptions (e.g. SocketException)
propagate directly instead of being wrapped in TargetInvocationException, and a
DynamicDependency attribute preserves the members for trimming/AOT. SocketException,
SocketError and AddressFamily live in System.Net.Primitives and continue to be used
directly.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
…uccess
- Gate the loopback DNS resolver tests on IsNotBrowser and IsNotWasi in
addition to IsNotMobile. The functional test project multi-targets
-browser and -wasi where DnsResolverPal is Unsupported, so these
socket-based tests would otherwise run and fail there.
- Assert success of DnsMessageReader.TryCreate/TryReadQuestion/TryReadRecord
in the DnsRecordTypeTests GetAnswerRecord helper so malformed input
surfaces clearly instead of failing in less obvious ways.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: f11fb54e-638e-4c9e-ad82-e5d9ff5c20e4
CopilotAI review requested due to automatic review settings July 21, 2026 14:16
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @karelz, @dotnet/ncl
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Implements a macOS-specific DnsResolverPal for System.Net.NameResolution that uses DNS-SD (DNSServiceQueryRecord) for system-configured DNS resolution while continuing to use the managed stub resolver when explicit DNS servers are provided. This extends the existing cross-platform DNS resolver work by adding an OSX PAL, shared managed wire-format handling, and corresponding tests.

Changes:

  • Add DnsResolverPal.OSX backed by DNS-SD, plus OSX interop declarations for DNSServiceQueryRecord APIs.
  • Add/enable managed DNS stub resolver + wire-format reader/writer and record parsing types for Unix/OSX builds.
  • Add new unit tests for wire-format components and expand functional/loopback tests and PAL tests (including resolv.conf parsing).

Reviewed changes

Copilot reviewed 24 out of 24 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
src/libraries/System.Net.NameResolution/tests/UnitTests/System.Net.NameResolution.Unit.Tests.csprojNew unit test project that links managed DNS wire-format production code for testing.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsEncodedNameTests.csUnit coverage for DNS name encoding/decoding, compression pointers, and IDN handling.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsMessageHeaderTests.csUnit coverage for header encoding/decoding and flag/rcode/opcode round-trips.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsMessageReaderTests.csUnit coverage for parsing questions/records and malformed buffer handling.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsMessageWriterTests.csUnit coverage for query writing, buffer sizing, and pointer expansion behavior.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsRecordTypeTests.csUnit coverage for typed RDATA parsing (A/AAAA/CNAME/MX/SRV/TXT/PTR/NS/SOA) and malformed cases.
src/libraries/System.Net.NameResolution/tests/PalTests/System.Net.NameResolution.Pal.Tests.csprojAdds Unix-only compilation of ResolvConf production code + tests into PAL test project.
src/libraries/System.Net.NameResolution/tests/PalTests/ResolvConfTests.csNew tests for parsing nameserver directives from resolv.conf-style content.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/System.Net.NameResolution.Functional.Tests.csprojAdds OSX to functional test TFMs.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverTest.csExpands functional coverage to OSX and adds OSX-specific behavior/edge-case assertions via reflection hooks.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverLoopbackTest.csBroadens loopback tests beyond Windows and adds OSX custom-server behavior + negative cache TTL assertions for managed resolver.
src/libraries/System.Net.NameResolution/src/System/Net/ResolvConf.csNew resolv.conf nameserver parsing helper for managed resolver system-server discovery (Unix path).
src/libraries/System.Net.NameResolution/src/System/Net/DnsWireEnums.csNew internal DNS wire enums (TYPE/CLASS/OPCODE/FLAGS).
src/libraries/System.Net.NameResolution/src/System/Net/DnsSocket.csNew reflection-based socket wrapper to avoid System.Net.Sockets reference cycles for managed resolver.
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolverPal.Managed.csNew managed stub resolver PAL for Unix-style explicit-server querying (UDP with TCP fallback).
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolverPal.OSX.csNew macOS PAL that uses DNS-SD for system-configured resolution and defers explicit-server queries to the managed PAL.
src/libraries/System.Net.NameResolution/src/System/Net/DnsEncodedName.csNew internal wire-format DNS name representation with compression pointer support and IDN conversion.
src/libraries/System.Net.NameResolution/src/System/Net/DnsMessageHeader.csNew DNS header encode/decode implementation.
src/libraries/System.Net.NameResolution/src/System/Net/DnsMessageReader.csNew sequential DNS message reader for header/questions/records.
src/libraries/System.Net.NameResolution/src/System/Net/DnsMessageWriter.csNew DNS query writer (header + question entries).
src/libraries/System.Net.NameResolution/src/System/Net/DnsRecordParsing.csNew typed record parsing helpers for common RDATA formats.
src/libraries/System.Net.NameResolution/src/System.Net.NameResolution.csprojAdds OSX TFM and wires Unix/OSX compilation of managed resolver components + OSX PAL + required references.
src/libraries/System.Net.NameResolution/src/Resources/Strings.resxAdds a new resource string for invalid DNS names.
src/libraries/Common/src/Interop/OSX/Interop.Dnssd.csNew OSX interop declarations for DNS-SD APIs used by the macOS PAL.

Comment on lines +4 to +5
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
Comment on lines +4 to +5
using System.Buffers;
using System.Net;
{
cancellationToken.ThrowIfCancellationRequested();

Interop.Error error = Interop.Sys.Poll(fileHandle, Interop.PollEvents.POLLIN, PollTimeoutMilliseconds, out Interop.PollEvents triggered);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It might be possible to implement async resolution by doing a ReceiveAsync on an empty buffer, instead of offloading to the thread pool.

@liveansliveans assigned rzikm and unassigned liveansAug 3, 2026
@wfurtwfurt self-assigned this Aug 6, 2026
@wfurt

wfurt commented Aug 6, 2026

Copy link
Copy Markdown
Member

replaced by follow-up #131934. Thanks @liveans

@wfurtwfurt closed this Aug 6, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@liveans@wfurt@teo-tsirpanis@rzikm
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Implement DnsResolver for macOS - #131152

Closed
liveans wants to merge 12 commits into
dotnet:mainfrom
liveans:liveans-macos-pal-pr-129845
Closed

Implement DnsResolver for macOS#131152
liveans wants to merge 12 commits into
dotnet:mainfrom
liveans:liveans-macos-pal-pr-129845

Conversation

@liveans

Copy link
Copy Markdown
Contributor
  • Uses DNS-SD for system-configured DNS resolution on macOS.
  • Reuses the managed resolver from Implement DnsResolver for Linux #129846 for explicit DNS servers.
  • Adds macOS-specific functional and loopback tests.

Builds on #129846. Draft until 129846 merged.

/cc @rzikm

rzikmand others added 12 commits July 9, 2026 10:41
Implements the DnsResolver PAL for the unix TFM as a managed stub
resolver. It builds and parses DNS wire messages and talks to the
configured servers over UDP (with TCP fallback on truncation) using
System.Net.Sockets. When no servers are configured, the system servers
from /etc/resolv.conf are used, falling back to loopback.
- Add internal wire primitives: message header, reader, writer,
encoded-name (with IDN/ACE support), and per-type record parsers.
- Add DnsResolverPal.Managed.cs query engine with shared sync/async
paths; the sync path uses blocking socket calls and returns a
completed Task, preserving the task.IsCompleted invariant.
- Add ResolvConf.cs nameserver discovery plus parser unit tests.
- Wire the new sources into the unix ItemGroup; reference the
System.Net.Sockets reference assembly to break the project cycle
(Sockets references NameResolution); the implementation resolves from
the shared framework at runtime.
- Generalize the loopback tests to run on Linux by binding an ephemeral
port on non-Windows.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Adds System.Net.NameResolution.Unit.Tests covering the internal DNS
wire-format types (DnsEncodedName, DnsMessageHeader/Reader/Writer, and
typed RDATA parsing). The project links the production parsing sources
so the internal types can be exercised directly.
Also adds DnsEncodedName.GetFormattedLength() to expose the decoded
dotted-string length (already computed internally) for buffer sizing.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The managed Unix DNS stub resolver used System.Net.Sockets.Socket for UDP/TCP
queries. Because System.Net.Sockets already depends on System.Net.NameResolution
(Socket.Connect(host, port) resolves names through Dns), the emitted
NameResolution.dll carried a real metadata reference back to Sockets, closing a
dependency cycle that the shared-framework VerifyClosure task rejects. This built
locally but failed the CoreCLR/Mono runtime-pack build legs on CI.
Access Socket through a new internal DnsSocket reflection wrapper so
NameResolution no longer statically references System.Net.Sockets. The wrapper
binds the required Socket members to delegates so exceptions (e.g. SocketException)
propagate directly instead of being wrapped in TargetInvocationException, and a
DynamicDependency attribute preserves the members for trimming/AOT. SocketException,
SocketError and AddressFamily live in System.Net.Primitives and continue to be used
directly.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
…uccess
- Gate the loopback DNS resolver tests on IsNotBrowser and IsNotWasi in
addition to IsNotMobile. The functional test project multi-targets
-browser and -wasi where DnsResolverPal is Unsupported, so these
socket-based tests would otherwise run and fail there.
- Assert success of DnsMessageReader.TryCreate/TryReadQuestion/TryReadRecord
in the DnsRecordTypeTests GetAnswerRecord helper so malformed input
surfaces clearly instead of failing in less obvious ways.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: f11fb54e-638e-4c9e-ad82-e5d9ff5c20e4
CopilotAI review requested due to automatic review settings July 21, 2026 14:16
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @karelz, @dotnet/ncl
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Implements a macOS-specific DnsResolverPal for System.Net.NameResolution that uses DNS-SD (DNSServiceQueryRecord) for system-configured DNS resolution while continuing to use the managed stub resolver when explicit DNS servers are provided. This extends the existing cross-platform DNS resolver work by adding an OSX PAL, shared managed wire-format handling, and corresponding tests.

Changes:

  • Add DnsResolverPal.OSX backed by DNS-SD, plus OSX interop declarations for DNSServiceQueryRecord APIs.
  • Add/enable managed DNS stub resolver + wire-format reader/writer and record parsing types for Unix/OSX builds.
  • Add new unit tests for wire-format components and expand functional/loopback tests and PAL tests (including resolv.conf parsing).

Reviewed changes

Copilot reviewed 24 out of 24 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
src/libraries/System.Net.NameResolution/tests/UnitTests/System.Net.NameResolution.Unit.Tests.csprojNew unit test project that links managed DNS wire-format production code for testing.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsEncodedNameTests.csUnit coverage for DNS name encoding/decoding, compression pointers, and IDN handling.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsMessageHeaderTests.csUnit coverage for header encoding/decoding and flag/rcode/opcode round-trips.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsMessageReaderTests.csUnit coverage for parsing questions/records and malformed buffer handling.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsMessageWriterTests.csUnit coverage for query writing, buffer sizing, and pointer expansion behavior.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsRecordTypeTests.csUnit coverage for typed RDATA parsing (A/AAAA/CNAME/MX/SRV/TXT/PTR/NS/SOA) and malformed cases.
src/libraries/System.Net.NameResolution/tests/PalTests/System.Net.NameResolution.Pal.Tests.csprojAdds Unix-only compilation of ResolvConf production code + tests into PAL test project.
src/libraries/System.Net.NameResolution/tests/PalTests/ResolvConfTests.csNew tests for parsing nameserver directives from resolv.conf-style content.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/System.Net.NameResolution.Functional.Tests.csprojAdds OSX to functional test TFMs.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverTest.csExpands functional coverage to OSX and adds OSX-specific behavior/edge-case assertions via reflection hooks.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverLoopbackTest.csBroadens loopback tests beyond Windows and adds OSX custom-server behavior + negative cache TTL assertions for managed resolver.
src/libraries/System.Net.NameResolution/src/System/Net/ResolvConf.csNew resolv.conf nameserver parsing helper for managed resolver system-server discovery (Unix path).
src/libraries/System.Net.NameResolution/src/System/Net/DnsWireEnums.csNew internal DNS wire enums (TYPE/CLASS/OPCODE/FLAGS).
src/libraries/System.Net.NameResolution/src/System/Net/DnsSocket.csNew reflection-based socket wrapper to avoid System.Net.Sockets reference cycles for managed resolver.
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolverPal.Managed.csNew managed stub resolver PAL for Unix-style explicit-server querying (UDP with TCP fallback).
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolverPal.OSX.csNew macOS PAL that uses DNS-SD for system-configured resolution and defers explicit-server queries to the managed PAL.
src/libraries/System.Net.NameResolution/src/System/Net/DnsEncodedName.csNew internal wire-format DNS name representation with compression pointer support and IDN conversion.
src/libraries/System.Net.NameResolution/src/System/Net/DnsMessageHeader.csNew DNS header encode/decode implementation.
src/libraries/System.Net.NameResolution/src/System/Net/DnsMessageReader.csNew sequential DNS message reader for header/questions/records.
src/libraries/System.Net.NameResolution/src/System/Net/DnsMessageWriter.csNew DNS query writer (header + question entries).
src/libraries/System.Net.NameResolution/src/System/Net/DnsRecordParsing.csNew typed record parsing helpers for common RDATA formats.
src/libraries/System.Net.NameResolution/src/System.Net.NameResolution.csprojAdds OSX TFM and wires Unix/OSX compilation of managed resolver components + OSX PAL + required references.
src/libraries/System.Net.NameResolution/src/Resources/Strings.resxAdds a new resource string for invalid DNS names.
src/libraries/Common/src/Interop/OSX/Interop.Dnssd.csNew OSX interop declarations for DNS-SD APIs used by the macOS PAL.

Comment on lines +4 to +5
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
Comment on lines +4 to +5
using System.Buffers;
using System.Net;
{
cancellationToken.ThrowIfCancellationRequested();

Interop.Error error = Interop.Sys.Poll(fileHandle, Interop.PollEvents.POLLIN, PollTimeoutMilliseconds, out Interop.PollEvents triggered);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It might be possible to implement async resolution by doing a ReceiveAsync on an empty buffer, instead of offloading to the thread pool.

@liveansliveans assigned rzikm and unassigned liveansAug 3, 2026
@wfurtwfurt self-assigned this Aug 6, 2026
@wfurt

wfurt commented Aug 6, 2026

Copy link
Copy Markdown
Member

replaced by follow-up #131934. Thanks @liveans

@wfurtwfurt closed this Aug 6, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@liveans@wfurt@teo-tsirpanis@rzikm
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Implement DnsResolver for macOS - #131152

Closed
liveans wants to merge 12 commits into
dotnet:mainfrom
liveans:liveans-macos-pal-pr-129845
Closed

Implement DnsResolver for macOS#131152
liveans wants to merge 12 commits into
dotnet:mainfrom
liveans:liveans-macos-pal-pr-129845

Conversation

@liveans

Copy link
Copy Markdown
Contributor
  • Uses DNS-SD for system-configured DNS resolution on macOS.
  • Reuses the managed resolver from Implement DnsResolver for Linux #129846 for explicit DNS servers.
  • Adds macOS-specific functional and loopback tests.

Builds on #129846. Draft until 129846 merged.

/cc @rzikm

rzikmand others added 12 commits July 9, 2026 10:41
Implements the DnsResolver PAL for the unix TFM as a managed stub
resolver. It builds and parses DNS wire messages and talks to the
configured servers over UDP (with TCP fallback on truncation) using
System.Net.Sockets. When no servers are configured, the system servers
from /etc/resolv.conf are used, falling back to loopback.
- Add internal wire primitives: message header, reader, writer,
encoded-name (with IDN/ACE support), and per-type record parsers.
- Add DnsResolverPal.Managed.cs query engine with shared sync/async
paths; the sync path uses blocking socket calls and returns a
completed Task, preserving the task.IsCompleted invariant.
- Add ResolvConf.cs nameserver discovery plus parser unit tests.
- Wire the new sources into the unix ItemGroup; reference the
System.Net.Sockets reference assembly to break the project cycle
(Sockets references NameResolution); the implementation resolves from
the shared framework at runtime.
- Generalize the loopback tests to run on Linux by binding an ephemeral
port on non-Windows.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Adds System.Net.NameResolution.Unit.Tests covering the internal DNS
wire-format types (DnsEncodedName, DnsMessageHeader/Reader/Writer, and
typed RDATA parsing). The project links the production parsing sources
so the internal types can be exercised directly.
Also adds DnsEncodedName.GetFormattedLength() to expose the decoded
dotted-string length (already computed internally) for buffer sizing.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The managed Unix DNS stub resolver used System.Net.Sockets.Socket for UDP/TCP
queries. Because System.Net.Sockets already depends on System.Net.NameResolution
(Socket.Connect(host, port) resolves names through Dns), the emitted
NameResolution.dll carried a real metadata reference back to Sockets, closing a
dependency cycle that the shared-framework VerifyClosure task rejects. This built
locally but failed the CoreCLR/Mono runtime-pack build legs on CI.
Access Socket through a new internal DnsSocket reflection wrapper so
NameResolution no longer statically references System.Net.Sockets. The wrapper
binds the required Socket members to delegates so exceptions (e.g. SocketException)
propagate directly instead of being wrapped in TargetInvocationException, and a
DynamicDependency attribute preserves the members for trimming/AOT. SocketException,
SocketError and AddressFamily live in System.Net.Primitives and continue to be used
directly.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
…uccess
- Gate the loopback DNS resolver tests on IsNotBrowser and IsNotWasi in
addition to IsNotMobile. The functional test project multi-targets
-browser and -wasi where DnsResolverPal is Unsupported, so these
socket-based tests would otherwise run and fail there.
- Assert success of DnsMessageReader.TryCreate/TryReadQuestion/TryReadRecord
in the DnsRecordTypeTests GetAnswerRecord helper so malformed input
surfaces clearly instead of failing in less obvious ways.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: f11fb54e-638e-4c9e-ad82-e5d9ff5c20e4
CopilotAI review requested due to automatic review settings July 21, 2026 14:16
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @karelz, @dotnet/ncl
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Implements a macOS-specific DnsResolverPal for System.Net.NameResolution that uses DNS-SD (DNSServiceQueryRecord) for system-configured DNS resolution while continuing to use the managed stub resolver when explicit DNS servers are provided. This extends the existing cross-platform DNS resolver work by adding an OSX PAL, shared managed wire-format handling, and corresponding tests.

Changes:

  • Add DnsResolverPal.OSX backed by DNS-SD, plus OSX interop declarations for DNSServiceQueryRecord APIs.
  • Add/enable managed DNS stub resolver + wire-format reader/writer and record parsing types for Unix/OSX builds.
  • Add new unit tests for wire-format components and expand functional/loopback tests and PAL tests (including resolv.conf parsing).

Reviewed changes

Copilot reviewed 24 out of 24 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
src/libraries/System.Net.NameResolution/tests/UnitTests/System.Net.NameResolution.Unit.Tests.csprojNew unit test project that links managed DNS wire-format production code for testing.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsEncodedNameTests.csUnit coverage for DNS name encoding/decoding, compression pointers, and IDN handling.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsMessageHeaderTests.csUnit coverage for header encoding/decoding and flag/rcode/opcode round-trips.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsMessageReaderTests.csUnit coverage for parsing questions/records and malformed buffer handling.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsMessageWriterTests.csUnit coverage for query writing, buffer sizing, and pointer expansion behavior.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsRecordTypeTests.csUnit coverage for typed RDATA parsing (A/AAAA/CNAME/MX/SRV/TXT/PTR/NS/SOA) and malformed cases.
src/libraries/System.Net.NameResolution/tests/PalTests/System.Net.NameResolution.Pal.Tests.csprojAdds Unix-only compilation of ResolvConf production code + tests into PAL test project.
src/libraries/System.Net.NameResolution/tests/PalTests/ResolvConfTests.csNew tests for parsing nameserver directives from resolv.conf-style content.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/System.Net.NameResolution.Functional.Tests.csprojAdds OSX to functional test TFMs.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverTest.csExpands functional coverage to OSX and adds OSX-specific behavior/edge-case assertions via reflection hooks.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverLoopbackTest.csBroadens loopback tests beyond Windows and adds OSX custom-server behavior + negative cache TTL assertions for managed resolver.
src/libraries/System.Net.NameResolution/src/System/Net/ResolvConf.csNew resolv.conf nameserver parsing helper for managed resolver system-server discovery (Unix path).
src/libraries/System.Net.NameResolution/src/System/Net/DnsWireEnums.csNew internal DNS wire enums (TYPE/CLASS/OPCODE/FLAGS).
src/libraries/System.Net.NameResolution/src/System/Net/DnsSocket.csNew reflection-based socket wrapper to avoid System.Net.Sockets reference cycles for managed resolver.
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolverPal.Managed.csNew managed stub resolver PAL for Unix-style explicit-server querying (UDP with TCP fallback).
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolverPal.OSX.csNew macOS PAL that uses DNS-SD for system-configured resolution and defers explicit-server queries to the managed PAL.
src/libraries/System.Net.NameResolution/src/System/Net/DnsEncodedName.csNew internal wire-format DNS name representation with compression pointer support and IDN conversion.
src/libraries/System.Net.NameResolution/src/System/Net/DnsMessageHeader.csNew DNS header encode/decode implementation.
src/libraries/System.Net.NameResolution/src/System/Net/DnsMessageReader.csNew sequential DNS message reader for header/questions/records.
src/libraries/System.Net.NameResolution/src/System/Net/DnsMessageWriter.csNew DNS query writer (header + question entries).
src/libraries/System.Net.NameResolution/src/System/Net/DnsRecordParsing.csNew typed record parsing helpers for common RDATA formats.
src/libraries/System.Net.NameResolution/src/System.Net.NameResolution.csprojAdds OSX TFM and wires Unix/OSX compilation of managed resolver components + OSX PAL + required references.
src/libraries/System.Net.NameResolution/src/Resources/Strings.resxAdds a new resource string for invalid DNS names.
src/libraries/Common/src/Interop/OSX/Interop.Dnssd.csNew OSX interop declarations for DNS-SD APIs used by the macOS PAL.

Comment on lines +4 to +5
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
Comment on lines +4 to +5
using System.Buffers;
using System.Net;
{
cancellationToken.ThrowIfCancellationRequested();

Interop.Error error = Interop.Sys.Poll(fileHandle, Interop.PollEvents.POLLIN, PollTimeoutMilliseconds, out Interop.PollEvents triggered);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It might be possible to implement async resolution by doing a ReceiveAsync on an empty buffer, instead of offloading to the thread pool.

@liveansliveans assigned rzikm and unassigned liveansAug 3, 2026
@wfurtwfurt self-assigned this Aug 6, 2026
@wfurt

wfurt commented Aug 6, 2026

Copy link
Copy Markdown
Member

replaced by follow-up #131934. Thanks @liveans

@wfurtwfurt closed this Aug 6, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@liveans@wfurt@teo-tsirpanis@rzikm
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Implement DnsResolver for macOS - #131152

Closed
liveans wants to merge 12 commits into
dotnet:mainfrom
liveans:liveans-macos-pal-pr-129845
Closed

Implement DnsResolver for macOS#131152
liveans wants to merge 12 commits into
dotnet:mainfrom
liveans:liveans-macos-pal-pr-129845

Conversation

@liveans

Copy link
Copy Markdown
Contributor
  • Uses DNS-SD for system-configured DNS resolution on macOS.
  • Reuses the managed resolver from Implement DnsResolver for Linux #129846 for explicit DNS servers.
  • Adds macOS-specific functional and loopback tests.

Builds on #129846. Draft until 129846 merged.

/cc @rzikm

rzikmand others added 12 commits July 9, 2026 10:41
Implements the DnsResolver PAL for the unix TFM as a managed stub
resolver. It builds and parses DNS wire messages and talks to the
configured servers over UDP (with TCP fallback on truncation) using
System.Net.Sockets. When no servers are configured, the system servers
from /etc/resolv.conf are used, falling back to loopback.
- Add internal wire primitives: message header, reader, writer,
encoded-name (with IDN/ACE support), and per-type record parsers.
- Add DnsResolverPal.Managed.cs query engine with shared sync/async
paths; the sync path uses blocking socket calls and returns a
completed Task, preserving the task.IsCompleted invariant.
- Add ResolvConf.cs nameserver discovery plus parser unit tests.
- Wire the new sources into the unix ItemGroup; reference the
System.Net.Sockets reference assembly to break the project cycle
(Sockets references NameResolution); the implementation resolves from
the shared framework at runtime.
- Generalize the loopback tests to run on Linux by binding an ephemeral
port on non-Windows.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Adds System.Net.NameResolution.Unit.Tests covering the internal DNS
wire-format types (DnsEncodedName, DnsMessageHeader/Reader/Writer, and
typed RDATA parsing). The project links the production parsing sources
so the internal types can be exercised directly.
Also adds DnsEncodedName.GetFormattedLength() to expose the decoded
dotted-string length (already computed internally) for buffer sizing.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The managed Unix DNS stub resolver used System.Net.Sockets.Socket for UDP/TCP
queries. Because System.Net.Sockets already depends on System.Net.NameResolution
(Socket.Connect(host, port) resolves names through Dns), the emitted
NameResolution.dll carried a real metadata reference back to Sockets, closing a
dependency cycle that the shared-framework VerifyClosure task rejects. This built
locally but failed the CoreCLR/Mono runtime-pack build legs on CI.
Access Socket through a new internal DnsSocket reflection wrapper so
NameResolution no longer statically references System.Net.Sockets. The wrapper
binds the required Socket members to delegates so exceptions (e.g. SocketException)
propagate directly instead of being wrapped in TargetInvocationException, and a
DynamicDependency attribute preserves the members for trimming/AOT. SocketException,
SocketError and AddressFamily live in System.Net.Primitives and continue to be used
directly.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
…uccess
- Gate the loopback DNS resolver tests on IsNotBrowser and IsNotWasi in
addition to IsNotMobile. The functional test project multi-targets
-browser and -wasi where DnsResolverPal is Unsupported, so these
socket-based tests would otherwise run and fail there.
- Assert success of DnsMessageReader.TryCreate/TryReadQuestion/TryReadRecord
in the DnsRecordTypeTests GetAnswerRecord helper so malformed input
surfaces clearly instead of failing in less obvious ways.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: f11fb54e-638e-4c9e-ad82-e5d9ff5c20e4
CopilotAI review requested due to automatic review settings July 21, 2026 14:16
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @karelz, @dotnet/ncl
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Implements a macOS-specific DnsResolverPal for System.Net.NameResolution that uses DNS-SD (DNSServiceQueryRecord) for system-configured DNS resolution while continuing to use the managed stub resolver when explicit DNS servers are provided. This extends the existing cross-platform DNS resolver work by adding an OSX PAL, shared managed wire-format handling, and corresponding tests.

Changes:

  • Add DnsResolverPal.OSX backed by DNS-SD, plus OSX interop declarations for DNSServiceQueryRecord APIs.
  • Add/enable managed DNS stub resolver + wire-format reader/writer and record parsing types for Unix/OSX builds.
  • Add new unit tests for wire-format components and expand functional/loopback tests and PAL tests (including resolv.conf parsing).

Reviewed changes

Copilot reviewed 24 out of 24 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
src/libraries/System.Net.NameResolution/tests/UnitTests/System.Net.NameResolution.Unit.Tests.csprojNew unit test project that links managed DNS wire-format production code for testing.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsEncodedNameTests.csUnit coverage for DNS name encoding/decoding, compression pointers, and IDN handling.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsMessageHeaderTests.csUnit coverage for header encoding/decoding and flag/rcode/opcode round-trips.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsMessageReaderTests.csUnit coverage for parsing questions/records and malformed buffer handling.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsMessageWriterTests.csUnit coverage for query writing, buffer sizing, and pointer expansion behavior.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsRecordTypeTests.csUnit coverage for typed RDATA parsing (A/AAAA/CNAME/MX/SRV/TXT/PTR/NS/SOA) and malformed cases.
src/libraries/System.Net.NameResolution/tests/PalTests/System.Net.NameResolution.Pal.Tests.csprojAdds Unix-only compilation of ResolvConf production code + tests into PAL test project.
src/libraries/System.Net.NameResolution/tests/PalTests/ResolvConfTests.csNew tests for parsing nameserver directives from resolv.conf-style content.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/System.Net.NameResolution.Functional.Tests.csprojAdds OSX to functional test TFMs.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverTest.csExpands functional coverage to OSX and adds OSX-specific behavior/edge-case assertions via reflection hooks.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverLoopbackTest.csBroadens loopback tests beyond Windows and adds OSX custom-server behavior + negative cache TTL assertions for managed resolver.
src/libraries/System.Net.NameResolution/src/System/Net/ResolvConf.csNew resolv.conf nameserver parsing helper for managed resolver system-server discovery (Unix path).
src/libraries/System.Net.NameResolution/src/System/Net/DnsWireEnums.csNew internal DNS wire enums (TYPE/CLASS/OPCODE/FLAGS).
src/libraries/System.Net.NameResolution/src/System/Net/DnsSocket.csNew reflection-based socket wrapper to avoid System.Net.Sockets reference cycles for managed resolver.
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolverPal.Managed.csNew managed stub resolver PAL for Unix-style explicit-server querying (UDP with TCP fallback).
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolverPal.OSX.csNew macOS PAL that uses DNS-SD for system-configured resolution and defers explicit-server queries to the managed PAL.
src/libraries/System.Net.NameResolution/src/System/Net/DnsEncodedName.csNew internal wire-format DNS name representation with compression pointer support and IDN conversion.
src/libraries/System.Net.NameResolution/src/System/Net/DnsMessageHeader.csNew DNS header encode/decode implementation.
src/libraries/System.Net.NameResolution/src/System/Net/DnsMessageReader.csNew sequential DNS message reader for header/questions/records.
src/libraries/System.Net.NameResolution/src/System/Net/DnsMessageWriter.csNew DNS query writer (header + question entries).
src/libraries/System.Net.NameResolution/src/System/Net/DnsRecordParsing.csNew typed record parsing helpers for common RDATA formats.
src/libraries/System.Net.NameResolution/src/System.Net.NameResolution.csprojAdds OSX TFM and wires Unix/OSX compilation of managed resolver components + OSX PAL + required references.
src/libraries/System.Net.NameResolution/src/Resources/Strings.resxAdds a new resource string for invalid DNS names.
src/libraries/Common/src/Interop/OSX/Interop.Dnssd.csNew OSX interop declarations for DNS-SD APIs used by the macOS PAL.

Comment on lines +4 to +5
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
Comment on lines +4 to +5
using System.Buffers;
using System.Net;
{
cancellationToken.ThrowIfCancellationRequested();

Interop.Error error = Interop.Sys.Poll(fileHandle, Interop.PollEvents.POLLIN, PollTimeoutMilliseconds, out Interop.PollEvents triggered);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It might be possible to implement async resolution by doing a ReceiveAsync on an empty buffer, instead of offloading to the thread pool.

@liveansliveans assigned rzikm and unassigned liveansAug 3, 2026
@wfurtwfurt self-assigned this Aug 6, 2026
@wfurt

wfurt commented Aug 6, 2026

Copy link
Copy Markdown
Member

replaced by follow-up #131934. Thanks @liveans

@wfurtwfurt closed this Aug 6, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@liveans@wfurt@teo-tsirpanis@rzikm
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Implement DnsResolver for macOS - #131152

Closed
liveans wants to merge 12 commits into
dotnet:mainfrom
liveans:liveans-macos-pal-pr-129845
Closed

Implement DnsResolver for macOS#131152
liveans wants to merge 12 commits into
dotnet:mainfrom
liveans:liveans-macos-pal-pr-129845

Conversation

@liveans

Copy link
Copy Markdown
Contributor
  • Uses DNS-SD for system-configured DNS resolution on macOS.
  • Reuses the managed resolver from Implement DnsResolver for Linux #129846 for explicit DNS servers.
  • Adds macOS-specific functional and loopback tests.

Builds on #129846. Draft until 129846 merged.

/cc @rzikm

rzikmand others added 12 commits July 9, 2026 10:41
Implements the DnsResolver PAL for the unix TFM as a managed stub
resolver. It builds and parses DNS wire messages and talks to the
configured servers over UDP (with TCP fallback on truncation) using
System.Net.Sockets. When no servers are configured, the system servers
from /etc/resolv.conf are used, falling back to loopback.
- Add internal wire primitives: message header, reader, writer,
encoded-name (with IDN/ACE support), and per-type record parsers.
- Add DnsResolverPal.Managed.cs query engine with shared sync/async
paths; the sync path uses blocking socket calls and returns a
completed Task, preserving the task.IsCompleted invariant.
- Add ResolvConf.cs nameserver discovery plus parser unit tests.
- Wire the new sources into the unix ItemGroup; reference the
System.Net.Sockets reference assembly to break the project cycle
(Sockets references NameResolution); the implementation resolves from
the shared framework at runtime.
- Generalize the loopback tests to run on Linux by binding an ephemeral
port on non-Windows.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Adds System.Net.NameResolution.Unit.Tests covering the internal DNS
wire-format types (DnsEncodedName, DnsMessageHeader/Reader/Writer, and
typed RDATA parsing). The project links the production parsing sources
so the internal types can be exercised directly.
Also adds DnsEncodedName.GetFormattedLength() to expose the decoded
dotted-string length (already computed internally) for buffer sizing.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The managed Unix DNS stub resolver used System.Net.Sockets.Socket for UDP/TCP
queries. Because System.Net.Sockets already depends on System.Net.NameResolution
(Socket.Connect(host, port) resolves names through Dns), the emitted
NameResolution.dll carried a real metadata reference back to Sockets, closing a
dependency cycle that the shared-framework VerifyClosure task rejects. This built
locally but failed the CoreCLR/Mono runtime-pack build legs on CI.
Access Socket through a new internal DnsSocket reflection wrapper so
NameResolution no longer statically references System.Net.Sockets. The wrapper
binds the required Socket members to delegates so exceptions (e.g. SocketException)
propagate directly instead of being wrapped in TargetInvocationException, and a
DynamicDependency attribute preserves the members for trimming/AOT. SocketException,
SocketError and AddressFamily live in System.Net.Primitives and continue to be used
directly.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
…uccess
- Gate the loopback DNS resolver tests on IsNotBrowser and IsNotWasi in
addition to IsNotMobile. The functional test project multi-targets
-browser and -wasi where DnsResolverPal is Unsupported, so these
socket-based tests would otherwise run and fail there.
- Assert success of DnsMessageReader.TryCreate/TryReadQuestion/TryReadRecord
in the DnsRecordTypeTests GetAnswerRecord helper so malformed input
surfaces clearly instead of failing in less obvious ways.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: f11fb54e-638e-4c9e-ad82-e5d9ff5c20e4
CopilotAI review requested due to automatic review settings July 21, 2026 14:16
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @karelz, @dotnet/ncl
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Implements a macOS-specific DnsResolverPal for System.Net.NameResolution that uses DNS-SD (DNSServiceQueryRecord) for system-configured DNS resolution while continuing to use the managed stub resolver when explicit DNS servers are provided. This extends the existing cross-platform DNS resolver work by adding an OSX PAL, shared managed wire-format handling, and corresponding tests.

Changes:

  • Add DnsResolverPal.OSX backed by DNS-SD, plus OSX interop declarations for DNSServiceQueryRecord APIs.
  • Add/enable managed DNS stub resolver + wire-format reader/writer and record parsing types for Unix/OSX builds.
  • Add new unit tests for wire-format components and expand functional/loopback tests and PAL tests (including resolv.conf parsing).

Reviewed changes

Copilot reviewed 24 out of 24 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
src/libraries/System.Net.NameResolution/tests/UnitTests/System.Net.NameResolution.Unit.Tests.csprojNew unit test project that links managed DNS wire-format production code for testing.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsEncodedNameTests.csUnit coverage for DNS name encoding/decoding, compression pointers, and IDN handling.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsMessageHeaderTests.csUnit coverage for header encoding/decoding and flag/rcode/opcode round-trips.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsMessageReaderTests.csUnit coverage for parsing questions/records and malformed buffer handling.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsMessageWriterTests.csUnit coverage for query writing, buffer sizing, and pointer expansion behavior.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsRecordTypeTests.csUnit coverage for typed RDATA parsing (A/AAAA/CNAME/MX/SRV/TXT/PTR/NS/SOA) and malformed cases.
src/libraries/System.Net.NameResolution/tests/PalTests/System.Net.NameResolution.Pal.Tests.csprojAdds Unix-only compilation of ResolvConf production code + tests into PAL test project.
src/libraries/System.Net.NameResolution/tests/PalTests/ResolvConfTests.csNew tests for parsing nameserver directives from resolv.conf-style content.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/System.Net.NameResolution.Functional.Tests.csprojAdds OSX to functional test TFMs.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverTest.csExpands functional coverage to OSX and adds OSX-specific behavior/edge-case assertions via reflection hooks.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverLoopbackTest.csBroadens loopback tests beyond Windows and adds OSX custom-server behavior + negative cache TTL assertions for managed resolver.
src/libraries/System.Net.NameResolution/src/System/Net/ResolvConf.csNew resolv.conf nameserver parsing helper for managed resolver system-server discovery (Unix path).
src/libraries/System.Net.NameResolution/src/System/Net/DnsWireEnums.csNew internal DNS wire enums (TYPE/CLASS/OPCODE/FLAGS).
src/libraries/System.Net.NameResolution/src/System/Net/DnsSocket.csNew reflection-based socket wrapper to avoid System.Net.Sockets reference cycles for managed resolver.
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolverPal.Managed.csNew managed stub resolver PAL for Unix-style explicit-server querying (UDP with TCP fallback).
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolverPal.OSX.csNew macOS PAL that uses DNS-SD for system-configured resolution and defers explicit-server queries to the managed PAL.
src/libraries/System.Net.NameResolution/src/System/Net/DnsEncodedName.csNew internal wire-format DNS name representation with compression pointer support and IDN conversion.
src/libraries/System.Net.NameResolution/src/System/Net/DnsMessageHeader.csNew DNS header encode/decode implementation.
src/libraries/System.Net.NameResolution/src/System/Net/DnsMessageReader.csNew sequential DNS message reader for header/questions/records.
src/libraries/System.Net.NameResolution/src/System/Net/DnsMessageWriter.csNew DNS query writer (header + question entries).
src/libraries/System.Net.NameResolution/src/System/Net/DnsRecordParsing.csNew typed record parsing helpers for common RDATA formats.
src/libraries/System.Net.NameResolution/src/System.Net.NameResolution.csprojAdds OSX TFM and wires Unix/OSX compilation of managed resolver components + OSX PAL + required references.
src/libraries/System.Net.NameResolution/src/Resources/Strings.resxAdds a new resource string for invalid DNS names.
src/libraries/Common/src/Interop/OSX/Interop.Dnssd.csNew OSX interop declarations for DNS-SD APIs used by the macOS PAL.

Comment on lines +4 to +5
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
Comment on lines +4 to +5
using System.Buffers;
using System.Net;
{
cancellationToken.ThrowIfCancellationRequested();

Interop.Error error = Interop.Sys.Poll(fileHandle, Interop.PollEvents.POLLIN, PollTimeoutMilliseconds, out Interop.PollEvents triggered);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It might be possible to implement async resolution by doing a ReceiveAsync on an empty buffer, instead of offloading to the thread pool.

@liveansliveans assigned rzikm and unassigned liveansAug 3, 2026
@wfurtwfurt self-assigned this Aug 6, 2026
@wfurt

wfurt commented Aug 6, 2026

Copy link
Copy Markdown
Member

replaced by follow-up #131934. Thanks @liveans

@wfurtwfurt closed this Aug 6, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@liveans@wfurt@teo-tsirpanis@rzikm
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Implement DnsResolver for macOS - #131152

Closed
liveans wants to merge 12 commits into
dotnet:mainfrom
liveans:liveans-macos-pal-pr-129845
Closed

Implement DnsResolver for macOS#131152
liveans wants to merge 12 commits into
dotnet:mainfrom
liveans:liveans-macos-pal-pr-129845

Conversation

@liveans

Copy link
Copy Markdown
Contributor
  • Uses DNS-SD for system-configured DNS resolution on macOS.
  • Reuses the managed resolver from Implement DnsResolver for Linux #129846 for explicit DNS servers.
  • Adds macOS-specific functional and loopback tests.

Builds on #129846. Draft until 129846 merged.

/cc @rzikm

rzikmand others added 12 commits July 9, 2026 10:41
Implements the DnsResolver PAL for the unix TFM as a managed stub
resolver. It builds and parses DNS wire messages and talks to the
configured servers over UDP (with TCP fallback on truncation) using
System.Net.Sockets. When no servers are configured, the system servers
from /etc/resolv.conf are used, falling back to loopback.
- Add internal wire primitives: message header, reader, writer,
encoded-name (with IDN/ACE support), and per-type record parsers.
- Add DnsResolverPal.Managed.cs query engine with shared sync/async
paths; the sync path uses blocking socket calls and returns a
completed Task, preserving the task.IsCompleted invariant.
- Add ResolvConf.cs nameserver discovery plus parser unit tests.
- Wire the new sources into the unix ItemGroup; reference the
System.Net.Sockets reference assembly to break the project cycle
(Sockets references NameResolution); the implementation resolves from
the shared framework at runtime.
- Generalize the loopback tests to run on Linux by binding an ephemeral
port on non-Windows.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Adds System.Net.NameResolution.Unit.Tests covering the internal DNS
wire-format types (DnsEncodedName, DnsMessageHeader/Reader/Writer, and
typed RDATA parsing). The project links the production parsing sources
so the internal types can be exercised directly.
Also adds DnsEncodedName.GetFormattedLength() to expose the decoded
dotted-string length (already computed internally) for buffer sizing.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The managed Unix DNS stub resolver used System.Net.Sockets.Socket for UDP/TCP
queries. Because System.Net.Sockets already depends on System.Net.NameResolution
(Socket.Connect(host, port) resolves names through Dns), the emitted
NameResolution.dll carried a real metadata reference back to Sockets, closing a
dependency cycle that the shared-framework VerifyClosure task rejects. This built
locally but failed the CoreCLR/Mono runtime-pack build legs on CI.
Access Socket through a new internal DnsSocket reflection wrapper so
NameResolution no longer statically references System.Net.Sockets. The wrapper
binds the required Socket members to delegates so exceptions (e.g. SocketException)
propagate directly instead of being wrapped in TargetInvocationException, and a
DynamicDependency attribute preserves the members for trimming/AOT. SocketException,
SocketError and AddressFamily live in System.Net.Primitives and continue to be used
directly.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
…uccess
- Gate the loopback DNS resolver tests on IsNotBrowser and IsNotWasi in
addition to IsNotMobile. The functional test project multi-targets
-browser and -wasi where DnsResolverPal is Unsupported, so these
socket-based tests would otherwise run and fail there.
- Assert success of DnsMessageReader.TryCreate/TryReadQuestion/TryReadRecord
in the DnsRecordTypeTests GetAnswerRecord helper so malformed input
surfaces clearly instead of failing in less obvious ways.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: f11fb54e-638e-4c9e-ad82-e5d9ff5c20e4
CopilotAI review requested due to automatic review settings July 21, 2026 14:16
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @karelz, @dotnet/ncl
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Implements a macOS-specific DnsResolverPal for System.Net.NameResolution that uses DNS-SD (DNSServiceQueryRecord) for system-configured DNS resolution while continuing to use the managed stub resolver when explicit DNS servers are provided. This extends the existing cross-platform DNS resolver work by adding an OSX PAL, shared managed wire-format handling, and corresponding tests.

Changes:

  • Add DnsResolverPal.OSX backed by DNS-SD, plus OSX interop declarations for DNSServiceQueryRecord APIs.
  • Add/enable managed DNS stub resolver + wire-format reader/writer and record parsing types for Unix/OSX builds.
  • Add new unit tests for wire-format components and expand functional/loopback tests and PAL tests (including resolv.conf parsing).

Reviewed changes

Copilot reviewed 24 out of 24 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
src/libraries/System.Net.NameResolution/tests/UnitTests/System.Net.NameResolution.Unit.Tests.csprojNew unit test project that links managed DNS wire-format production code for testing.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsEncodedNameTests.csUnit coverage for DNS name encoding/decoding, compression pointers, and IDN handling.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsMessageHeaderTests.csUnit coverage for header encoding/decoding and flag/rcode/opcode round-trips.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsMessageReaderTests.csUnit coverage for parsing questions/records and malformed buffer handling.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsMessageWriterTests.csUnit coverage for query writing, buffer sizing, and pointer expansion behavior.
src/libraries/System.Net.NameResolution/tests/UnitTests/DnsRecordTypeTests.csUnit coverage for typed RDATA parsing (A/AAAA/CNAME/MX/SRV/TXT/PTR/NS/SOA) and malformed cases.
src/libraries/System.Net.NameResolution/tests/PalTests/System.Net.NameResolution.Pal.Tests.csprojAdds Unix-only compilation of ResolvConf production code + tests into PAL test project.
src/libraries/System.Net.NameResolution/tests/PalTests/ResolvConfTests.csNew tests for parsing nameserver directives from resolv.conf-style content.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/System.Net.NameResolution.Functional.Tests.csprojAdds OSX to functional test TFMs.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverTest.csExpands functional coverage to OSX and adds OSX-specific behavior/edge-case assertions via reflection hooks.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverLoopbackTest.csBroadens loopback tests beyond Windows and adds OSX custom-server behavior + negative cache TTL assertions for managed resolver.
src/libraries/System.Net.NameResolution/src/System/Net/ResolvConf.csNew resolv.conf nameserver parsing helper for managed resolver system-server discovery (Unix path).
src/libraries/System.Net.NameResolution/src/System/Net/DnsWireEnums.csNew internal DNS wire enums (TYPE/CLASS/OPCODE/FLAGS).
src/libraries/System.Net.NameResolution/src/System/Net/DnsSocket.csNew reflection-based socket wrapper to avoid System.Net.Sockets reference cycles for managed resolver.
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolverPal.Managed.csNew managed stub resolver PAL for Unix-style explicit-server querying (UDP with TCP fallback).
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolverPal.OSX.csNew macOS PAL that uses DNS-SD for system-configured resolution and defers explicit-server queries to the managed PAL.
src/libraries/System.Net.NameResolution/src/System/Net/DnsEncodedName.csNew internal wire-format DNS name representation with compression pointer support and IDN conversion.
src/libraries/System.Net.NameResolution/src/System/Net/DnsMessageHeader.csNew DNS header encode/decode implementation.
src/libraries/System.Net.NameResolution/src/System/Net/DnsMessageReader.csNew sequential DNS message reader for header/questions/records.
src/libraries/System.Net.NameResolution/src/System/Net/DnsMessageWriter.csNew DNS query writer (header + question entries).
src/libraries/System.Net.NameResolution/src/System/Net/DnsRecordParsing.csNew typed record parsing helpers for common RDATA formats.
src/libraries/System.Net.NameResolution/src/System.Net.NameResolution.csprojAdds OSX TFM and wires Unix/OSX compilation of managed resolver components + OSX PAL + required references.
src/libraries/System.Net.NameResolution/src/Resources/Strings.resxAdds a new resource string for invalid DNS names.
src/libraries/Common/src/Interop/OSX/Interop.Dnssd.csNew OSX interop declarations for DNS-SD APIs used by the macOS PAL.

Comment on lines +4 to +5
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
Comment on lines +4 to +5
using System.Buffers;
using System.Net;
{
cancellationToken.ThrowIfCancellationRequested();

Interop.Error error = Interop.Sys.Poll(fileHandle, Interop.PollEvents.POLLIN, PollTimeoutMilliseconds, out Interop.PollEvents triggered);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It might be possible to implement async resolution by doing a ReceiveAsync on an empty buffer, instead of offloading to the thread pool.

@liveansliveans assigned rzikm and unassigned liveansAug 3, 2026
@wfurtwfurt self-assigned this Aug 6, 2026
@wfurt

wfurt commented Aug 6, 2026

Copy link
Copy Markdown
Member

replaced by follow-up #131934. Thanks @liveans

@wfurtwfurt closed this Aug 6, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@liveans@wfurt@teo-tsirpanis@rzikm