aboutsummaryrefslogtreecommitdiff
path: root/lib/std/net.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2023-03-09 22:02:01 -0500
committerGitHub <noreply@github.com>2023-03-09 22:02:01 -0500
commit7c9ed45ac2fd580bbbb4b950ac350dd49fc7600e (patch)
tree027efed5e8b03a30b4b7a23e86ad5ca2bd0d75e5 /lib/std/net.zig
parent14590e956e06903ac408af57874d3b5a0d697670 (diff)
parent524e0cd987a52a60ce1014aa27cd73f99a3b9958 (diff)
downloadzig-7c9ed45ac2fd580bbbb4b950ac350dd49fc7600e.tar.gz
zig-7c9ed45ac2fd580bbbb4b950ac350dd49fc7600e.zip
Merge pull request #14762 from truemedian/http-keepalive
std.http: add connection pooling, handle keep-alive and compressed content
Diffstat (limited to 'lib/std/net.zig')
-rw-r--r--lib/std/net.zig34
1 files changed, 31 insertions, 3 deletions
diff --git a/lib/std/net.zig b/lib/std/net.zig
index 50a0f8b9d7..7222433fd5 100644
--- a/lib/std/net.zig
+++ b/lib/std/net.zig
@@ -702,8 +702,10 @@ pub const AddressList = struct {
}
};
+pub const TcpConnectToHostError = GetAddressListError || TcpConnectToAddressError;
+
/// All memory allocated with `allocator` will be freed before this function returns.
-pub fn tcpConnectToHost(allocator: mem.Allocator, name: []const u8, port: u16) !Stream {
+pub fn tcpConnectToHost(allocator: mem.Allocator, name: []const u8, port: u16) TcpConnectToHostError!Stream {
const list = try getAddressList(allocator, name, port);
defer list.deinit();
@@ -720,7 +722,9 @@ pub fn tcpConnectToHost(allocator: mem.Allocator, name: []const u8, port: u16) !
return std.os.ConnectError.ConnectionRefused;
}
-pub fn tcpConnectToAddress(address: Address) !Stream {
+pub const TcpConnectToAddressError = std.os.SocketError || std.os.ConnectError;
+
+pub fn tcpConnectToAddress(address: Address) TcpConnectToAddressError!Stream {
const nonblock = if (std.io.is_async) os.SOCK.NONBLOCK else 0;
const sock_flags = os.SOCK.STREAM | nonblock |
(if (builtin.target.os.tag == .windows) 0 else os.SOCK.CLOEXEC);
@@ -737,8 +741,32 @@ pub fn tcpConnectToAddress(address: Address) !Stream {
return Stream{ .handle = sockfd };
}
+const GetAddressListError = std.mem.Allocator.Error || std.fs.File.OpenError || std.fs.File.ReadError || std.os.SocketError || std.os.BindError || error{
+ // TODO: break this up into error sets from the various underlying functions
+
+ TemporaryNameServerFailure,
+ NameServerFailure,
+ AddressFamilyNotSupported,
+ UnknownHostName,
+ ServiceUnavailable,
+ Unexpected,
+
+ HostLacksNetworkAddresses,
+
+ InvalidCharacter,
+ InvalidEnd,
+ NonCanonical,
+ Overflow,
+ Incomplete,
+ InvalidIpv4Mapping,
+ InvalidIPAddressFormat,
+
+ InterfaceNotFound,
+ FileSystem,
+};
+
/// Call `AddressList.deinit` on the result.
-pub fn getAddressList(allocator: mem.Allocator, name: []const u8, port: u16) !*AddressList {
+pub fn getAddressList(allocator: mem.Allocator, name: []const u8, port: u16) GetAddressListError!*AddressList {
const result = blk: {
var arena = std.heap.ArenaAllocator.init(allocator);
errdefer arena.deinit();