zig icon indicating copy to clipboard operation
zig copied to clipboard

DNS resolution fails for URIs with a www subdomain

Open JoshLankford opened this issue 1 month ago • 1 comments

Zig Version

0.16.0-dev.1225+bf9082518

Steps to Reproduce and Observed Behavior

Issue std.http.Client.fetch returns error.InvalidDnsCnameRecord for URIs with www subdomain or domains that redirect to www . This occurs in Arch Linux x86_64 and Ubuntu x86_64 but does not on macOS (15.6.1) aarch64. Most of the time removing www from the URI will bypass the issue however for domains with an auto redirect to www it requires a host override.

Example 1

const std = @import("std");

pub fn main() !void {
    var gpa: std.heap.DebugAllocator(.{}) = .init;
    defer _ = gpa.deinit();
    const alloc = gpa.allocator();

    var io_threaded: std.Io.Threaded = .init(alloc);
    defer io_threaded.deinit();
    const io = io_threaded.io();

    var client: std.http.Client = .{
        .allocator = alloc,
        .io = io,
    };
    defer client.deinit();

    var result_body = std.Io.Writer.Allocating.init(alloc);
    defer result_body.deinit();

    const response = try client.fetch(.{
        .location = .{ .url = "https://www.github.com/" },
        .response_writer = &result_body.writer,
    });

    if (response.status.class() == .success) {
        std.debug.print("{s}\n", .{result_body.written()});
    } else {
        std.debug.print("Request failed: {?s}\n", .{response.status.phrase()});
    }
}

Example 2 (redirect)

const std = @import("std");

pub fn main() !void {
    var gpa: std.heap.DebugAllocator(.{}) = .init;
    defer _ = gpa.deinit();
    const alloc = gpa.allocator();

    var io_threaded: std.Io.Threaded = .init(alloc);
    defer io_threaded.deinit();
    const io = io_threaded.io();

    var client: std.http.Client = .{
        .allocator = alloc,
        .io = io,
    };
    defer client.deinit();

    var result_body = std.Io.Writer.Allocating.init(alloc);
    defer result_body.deinit();

    const response = try client.fetch(.{
        .location = .{ .url = "https://cms.gov/" },
        .response_writer = &result_body.writer,
        // .headers = .{ .host = .{ .override = "www.cms.gov" } },
        // host override bypasses the issue
    });

    if (response.status.class() == .success) {
        std.debug.print("{s}\n", .{result_body.written()});
    } else {
        std.debug.print("Request failed: {?s}\n", .{response.status.phrase()});
    }
}

Error

zig run ./test_0.16.zig
error: InvalidDnsCnameRecord
/home/j/.local/share/mise/installs/zig/master/lib/std/Io/net/HostName.zig:246:13: 0x11e1ea1 in connect (std.zig)
            try end;
            ^
/home/j/.local/share/mise/installs/zig/master/lib/std/http/Client.zig:1447:18: 0x11c0644 in connectTcpOptions (std.zig)
    var stream = try host.connect(io, port, .{ .mode = .stream });
                 ^
/home/j/.local/share/mise/installs/zig/master/lib/std/http/Client.zig:1419:5: 0x11beb67 in connectTcp (std.zig)
    return connectTcpOptions(client, .{ .host = host, .port = port, .protocol = protocol });
    ^
/home/j/.local/share/mise/installs/zig/master/lib/std/http/Client.zig:1592:14: 0x11aa310 in connect (std.zig)
    } orelse return client.connectTcp(host, port, protocol);
             ^
/home/j/.local/share/mise/installs/zig/master/lib/std/http/Client.zig:1708:18: 0x11953bc in request (std.zig)
        break :c try client.connect(host_name, uriPort(uri, protocol), protocol);
                 ^
/home/j/.local/share/mise/installs/zig/master/lib/std/http/Client.zig:1791:15: 0x1182d72 in fetch (std.zig)
    var req = try request(client, method, uri, .{
              ^
/home/j/dev/example/test_0.16.zig:21:22: 0x1180c06 in main (test_0.16.zig)
    const response = try client.fetch(.{
                     ^

Additional Info I cannot reproduce this in zig 0.15.2.

Expected Behavior

URIs with a www subdomain (or redirects) should resolve.

JoshLankford avatar Nov 04 '25 20:11 JoshLankford

Confirm this also an issue for me on 0.16.0-dev.1225+bf9082518 Arch x86_64. Also this error occurs on any URL that has a subdomain (not just www). This is a regression because I was using a different master version previously (unsure which but from maybe 2-3 weeks ago) and didn't have this issue.

larkinxp avatar Nov 06 '25 12:11 larkinxp