Zig Version
0.16.0-dev.2565+684032671
Steps to Reproduce and Observed Behavior
I am encountering a TlsInitializationFailed error when trying to perform a simple HTTPS fetch using std.http.Client on Windows with the latest 0.16.0-dev builds.
HTTP (plain) requests work correctly. This issue only affects HTTPS. The underlying error appears to be error.EndOfStream occurring inside std.Io.net.readVec during the TLS handshake.
conststd=@import("std");consthttp=std.http;pubfnmain(init:std.process.Init)!void{varwriterBuf:[4096]u8=undefined;varwriter=std.Io.File.stdout().writer(init.io,&writerBuf);varclient=http.Client{.allocator=init.gpa,.io=init.io};deferclient.deinit();// https fails, http works_=tryclient.fetch(.{.method=.GET,.location=.{.url="https://jsonplaceholder.typicode.com/posts/1"},.response_writer=&writer.interface});trywriter.interface.flush();}
Observed Output:
error: TlsInitializationFailed
C:\Users\heller\AppData\Roaming\Code\User\globalStorage\ziglang.vscode-zig\zig\x86_64-windows-0.16.0-dev.2565+684032671\lib\std\Io\Threaded.zig:1398:9: 0x7ff68c994df8 in fail__anon_56798 (zig_zcu.obj)
return err;
^
C:\Users\heller\AppData\Roaming\Code\User\globalStorage\ziglang.vscode-zig\zig\x86_64-windows-0.16.0-dev.2565+684032671\lib\std\Io\Threaded.zig:13030:28: 0x7ff68c98bfdf in netReadWindows (zig_zcu.obj)
.ECONNRESET => return syscall.fail(error.ConnectionResetByPeer),
^
C:\Users\heller\AppData\Roaming\Code\User\globalStorage\ziglang.vscode-zig\zig\x86_64-windows-0.16.0-dev.2565+684032671\lib\std\Io\net.zig:1288:17: 0x7ff68ca96e8c in readVec (zig_zcu.obj)
return error.ReadFailed;
^
C:\Users\heller\AppData\Roaming\Code\User\globalStorage\ziglang.vscode-zig\zig\x86_64-windows-0.16.0-dev.2565+684032671\lib\std\Io\Reader.zig:1124:36: 0x7ff68c96dcfa in fillUnbuffered (zig_zcu.obj)
while (r.end < r.seek + n) _ = try r.vtable.readVec(r, &bufs);
^
C:\Users\heller\AppData\Roaming\Code\User\globalStorage\ziglang.vscode-zig\zig\x86_64-windows-0.16.0-dev.2565+684032671\lib\std\Io\Reader.zig:1110:5: 0x7ff68c962245 in fill (zig_zcu.obj)
return fillUnbuffered(r, n);
^
C:\Users\heller\AppData\Roaming\Code\User\globalStorage\ziglang.vscode-zig\zig\x86_64-windows-0.16.0-dev.2565+684032671\lib\std\Io\Reader.zig:511:5: 0x7ff68c9620cb in peek (zig_zcu.obj)
try r.fill(n);
^
C:\Users\heller\AppData\Roaming\Code\User\globalStorage\ziglang.vscode-zig\zig\x86_64-windows-0.16.0-dev.2565+684032671\lib\std\crypto\tls\Client.zig:343:37: 0x7ff68ca3f31b in init (zig_zcu.obj)
error.ReadFailed => |e| return e,
^
C:\Users\heller\AppData\Roaming\Code\User\globalStorage\ziglang.vscode-zig\zig\x86_64-windows-0.16.0-dev.2565+684032671\lib\std\http\Client.zig:359:41: 0x7ff68c9b497b in create (zig_zcu.obj)
error.ReadFailed => return tls.connection.stream_reader.err.?,
^
C:\Users\heller\AppData\Roaming\Code\User\globalStorage\ziglang.vscode-zig\zig\x86_64-windows-0.16.0-dev.2565+684032671\lib\std\http\Client.zig:1461:25: 0x7ff68c9a34c5 in connectTcpOptions (zig_zcu.obj)
else => return error.TlsInitializationFailed,
^
C:\Users\heller\AppData\Roaming\Code\User\globalStorage\ziglang.vscode-zig\zig\x86_64-windows-0.16.0-dev.2565+684032671\lib\std\http\Client.zig:1423:5: 0x7ff68c9a375f in connectTcp (zig_zcu.obj)
return connectTcpOptions(client, .{ .host = host, .port = port, .protocol = protocol });
^
C:\Users\heller\AppData\Roaming\Code\User\globalStorage\ziglang.vscode-zig\zig\x86_64-windows-0.16.0-dev.2565+684032671\lib\std\http\Client.zig:1598:14: 0x7ff68c997f0b in connect (zig_zcu.obj)
} orelse return client.connectTcp(host, port, protocol);
^
C:\Users\heller\AppData\Roaming\Code\User\globalStorage\ziglang.vscode-zig\zig\x86_64-windows-0.16.0-dev.2565+684032671\lib\std\http\Client.zig:1714:18: 0x7ff68c98ee70 in request (zig_zcu.obj)
break :c try client.connect(host_name, uriPort(uri, protocol), protocol);
^
C:\Users\heller\AppData\Roaming\Code\User\globalStorage\ziglang.vscode-zig\zig\x86_64-windows-0.16.0-dev.2565+684032671\lib\std\http\Client.zig:1797:15: 0x7ff68c981d39 in fetch (zig_zcu.obj)
var req = try request(client, method, uri, .{
^
C:\Users\heller\Desktop\languages\zig\src\main.zig:11:20: 0x7ff68c9817ba in main (zig_zcu.obj)
const result = try client.fetch(. {
...
Expected Behavior
The client should successfully connect via HTTPS, perform the TLS handshake, and retrieve the content, similar to how it works with HTTP URLs. It seems like the connection is being closed (EndOfStream) immediately during the TLS initialization phase when reading from the socket using the new IO subsystem on Windows.
### Zig Version
0.16.0-dev.2565+684032671
### Steps to Reproduce and Observed Behavior
I am encountering a TlsInitializationFailed error when trying to perform a simple HTTPS fetch using std.http.Client on Windows with the latest 0.16.0-dev builds.
HTTP (plain) requests work correctly. This issue only affects HTTPS. The underlying error appears to be error.EndOfStream occurring inside std.Io.net.readVec during the TLS handshake.
```zig
const std = @import("std");
const http = std.http;
pub fn main(init: std.process.Init) !void {
var writerBuf: [4096]u8 = undefined;
var writer = std.Io.File.stdout().writer(init.io, &writerBuf);
var client = http.Client{ .allocator = init.gpa, .io = init.io };
defer client.deinit();
// https fails, http works
_ = try client.fetch(. {
.method = .GET,
.location = .{ .url = "https://jsonplaceholder.typicode.com/posts/1" },
.response_writer = &writer.interface
});
try writer.interface.flush();
}
```
Observed Output:
```cmd
error: TlsInitializationFailed
C:\Users\heller\AppData\Roaming\Code\User\globalStorage\ziglang.vscode-zig\zig\x86_64-windows-0.16.0-dev.2565+684032671\lib\std\Io\Threaded.zig:1398:9: 0x7ff68c994df8 in fail__anon_56798 (zig_zcu.obj)
return err;
^
C:\Users\heller\AppData\Roaming\Code\User\globalStorage\ziglang.vscode-zig\zig\x86_64-windows-0.16.0-dev.2565+684032671\lib\std\Io\Threaded.zig:13030:28: 0x7ff68c98bfdf in netReadWindows (zig_zcu.obj)
.ECONNRESET => return syscall.fail(error.ConnectionResetByPeer),
^
C:\Users\heller\AppData\Roaming\Code\User\globalStorage\ziglang.vscode-zig\zig\x86_64-windows-0.16.0-dev.2565+684032671\lib\std\Io\net.zig:1288:17: 0x7ff68ca96e8c in readVec (zig_zcu.obj)
return error.ReadFailed;
^
C:\Users\heller\AppData\Roaming\Code\User\globalStorage\ziglang.vscode-zig\zig\x86_64-windows-0.16.0-dev.2565+684032671\lib\std\Io\Reader.zig:1124:36: 0x7ff68c96dcfa in fillUnbuffered (zig_zcu.obj)
while (r.end < r.seek + n) _ = try r.vtable.readVec(r, &bufs);
^
C:\Users\heller\AppData\Roaming\Code\User\globalStorage\ziglang.vscode-zig\zig\x86_64-windows-0.16.0-dev.2565+684032671\lib\std\Io\Reader.zig:1110:5: 0x7ff68c962245 in fill (zig_zcu.obj)
return fillUnbuffered(r, n);
^
C:\Users\heller\AppData\Roaming\Code\User\globalStorage\ziglang.vscode-zig\zig\x86_64-windows-0.16.0-dev.2565+684032671\lib\std\Io\Reader.zig:511:5: 0x7ff68c9620cb in peek (zig_zcu.obj)
try r.fill(n);
^
C:\Users\heller\AppData\Roaming\Code\User\globalStorage\ziglang.vscode-zig\zig\x86_64-windows-0.16.0-dev.2565+684032671\lib\std\crypto\tls\Client.zig:343:37: 0x7ff68ca3f31b in init (zig_zcu.obj)
error.ReadFailed => |e| return e,
^
C:\Users\heller\AppData\Roaming\Code\User\globalStorage\ziglang.vscode-zig\zig\x86_64-windows-0.16.0-dev.2565+684032671\lib\std\http\Client.zig:359:41: 0x7ff68c9b497b in create (zig_zcu.obj)
error.ReadFailed => return tls.connection.stream_reader.err.?,
^
C:\Users\heller\AppData\Roaming\Code\User\globalStorage\ziglang.vscode-zig\zig\x86_64-windows-0.16.0-dev.2565+684032671\lib\std\http\Client.zig:1461:25: 0x7ff68c9a34c5 in connectTcpOptions (zig_zcu.obj)
else => return error.TlsInitializationFailed,
^
C:\Users\heller\AppData\Roaming\Code\User\globalStorage\ziglang.vscode-zig\zig\x86_64-windows-0.16.0-dev.2565+684032671\lib\std\http\Client.zig:1423:5: 0x7ff68c9a375f in connectTcp (zig_zcu.obj)
return connectTcpOptions(client, .{ .host = host, .port = port, .protocol = protocol });
^
C:\Users\heller\AppData\Roaming\Code\User\globalStorage\ziglang.vscode-zig\zig\x86_64-windows-0.16.0-dev.2565+684032671\lib\std\http\Client.zig:1598:14: 0x7ff68c997f0b in connect (zig_zcu.obj)
} orelse return client.connectTcp(host, port, protocol);
^
C:\Users\heller\AppData\Roaming\Code\User\globalStorage\ziglang.vscode-zig\zig\x86_64-windows-0.16.0-dev.2565+684032671\lib\std\http\Client.zig:1714:18: 0x7ff68c98ee70 in request (zig_zcu.obj)
break :c try client.connect(host_name, uriPort(uri, protocol), protocol);
^
C:\Users\heller\AppData\Roaming\Code\User\globalStorage\ziglang.vscode-zig\zig\x86_64-windows-0.16.0-dev.2565+684032671\lib\std\http\Client.zig:1797:15: 0x7ff68c981d39 in fetch (zig_zcu.obj)
var req = try request(client, method, uri, .{
^
C:\Users\heller\Desktop\languages\zig\src\main.zig:11:20: 0x7ff68c9817ba in main (zig_zcu.obj)
const result = try client.fetch(. {
...
```
### Expected Behavior
The client should successfully connect via HTTPS, perform the TLS handshake, and retrieve the content, similar to how it works with HTTP URLs. It seems like the connection is being closed (EndOfStream) immediately during the TLS initialization phase when reading from the socket using the new IO subsystem on Windows.