treesummaryrefslogcommitdiff
diff options
context:
space:
mode:
authorPatrick2026-08-27 10:01:45 +0200
committerPatrick2026-08-27 10:01:45 +0200
commit6ec68dcb479f495bfbe17b2092f4575d7e21119b (patch)
tree996a5611f7717499ad9ce58fbf6bd86b80e535a9
parenta6cb28b75fa1b2ea5547000baba2a6fac9f6a37c (diff)
downloadzigws-6ec68dcb479f495bfbe17b2092f4575d7e21119b.tar.gz
zigws-6ec68dcb479f495bfbe17b2092f4575d7e21119b.zip
at least 0.15HEADmain
-rw-r--r--ws_epoll.zig46
1 files changed, 28 insertions, 18 deletions
diff --git a/ws_epoll.zig b/ws_epoll.zig
index b86237d..07195e0 100644
--- a/ws_epoll.zig
+++ b/ws_epoll.zig
@@ -6,7 +6,7 @@ const echo = std.debug.print;
const html =
\\<script>
- \\let s = new WebSocket("wss://" + window.location.hostname + ":8443");
+ \\let s = new WebSocket("wss://" + window.location.hostname + ":7777");
\\s.addEventListener("open", (event) => {
\\ console.log("connected");
\\ s.send("Hello Server!");
@@ -23,8 +23,10 @@ var g_buffer: [1024]u8 = undefined;
fn respondHttp(stream: std.net.Stream, msg: []const u8) !void {
_ = msg;
- try std.fmt.format(
- stream.writer(),
+ var writer_buffer: [1024]u8 = undefined;
+ var writer = stream.writer(&writer_buffer);
+
+ try writer.interface.print(
"HTTP/1.1 200 OK\r\nContent-Length: {}\r\n\r\n{s}",
.{ html.len, html },
);
@@ -32,12 +34,14 @@ fn respondHttp(stream: std.net.Stream, msg: []const u8) !void {
fn respondWs(stream: std.net.Stream, msg: []const u8) !void {
// TODO: handle msg length (< 128)
- var response_buffer = try std.BoundedArray(u8, 128).init(0);
- var writer = response_buffer.writer();
+ var response_buffer = std.mem.zeroes([128]u8);
+ var fbs = std.io.fixedBufferStream(&response_buffer);
+ var writer = fbs.writer();
+
_ = try writer.writeByte(0b10000001);
_ = try writer.writeByte(@truncate(msg.len));
_ = try writer.write(msg);
- _ = try stream.write(response_buffer.constSlice());
+ _ = try stream.write(fbs.getWritten());
}
fn handleHttp(stream: std.net.Stream, msg: []const u8) !bool {
@@ -53,18 +57,22 @@ fn handleWsUpgrade(stream: std.net.Stream, msg: []const u8) !bool {
const key = msg[idx + 19 .. end];
echo("key: {s}\n", .{key});
- var concat = try std.BoundedArray(u8, 128).init(0);
- _ = try concat.writer().write(key);
- _ = try concat.writer().write("258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
+ var concat_buffer = std.mem.zeroes([128]u8);
+ var fbs = std.io.fixedBufferStream(&concat_buffer);
+ var writer = fbs.writer();
+ _ = try writer.write(key);
+ _ = try writer.write("258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
var hashed: [20]u8 = undefined;
- std.crypto.hash.Sha1.hash(concat.constSlice(), &hashed, .{});
+ std.crypto.hash.Sha1.hash(fbs.getWritten(), &hashed, .{});
var encoded: [28]u8 = undefined;
_ = std.base64.standard.Encoder.encode(&encoded, &hashed);
- try std.fmt.format(
- stream.writer(),
+ var writer_buffer = std.mem.zeroes([1024]u8);
+
+ var stream_writer = stream.writer(&writer_buffer);
+ try stream_writer.interface.print(
"HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: {s}\r\n\r\n",
.{encoded},
);
@@ -103,13 +111,14 @@ fn handleWs(stream: std.net.Stream, frame: []const u8) !bool {
const mask = frame[msgIndex .. msgIndex + 4];
const encoded = frame[msgIndex + 4 .. frame.len];
- var decoded = try std.BoundedArray(u8, 1024).init(0);
+ var decoded_buffer = std.mem.zeroes([1024]u8);
+ var decoded = std.ArrayList(u8).fromOwnedSlice(&decoded_buffer);
for (0..encoded.len) |i| {
- try decoded.append(encoded[i] ^ mask[i % 4]);
+ try decoded.appendBounded(encoded[i] ^ mask[i % 4]);
}
- echo("tcp: [{}] {s}\n", .{ .{ FIN, RSV1, RSV2, RSV3, OPCODE, MASK, payloadLength, mask }, decoded.constSlice() });
+ echo("tcp: [{}] {s}\n", .{ .{ FIN, RSV1, RSV2, RSV3, OPCODE, MASK, payloadLength, mask }, decoded.items });
try respondWs(stream, "yooooooo");
// _ = try stream.write(frame);
@@ -145,7 +154,7 @@ const Client = struct {
};
pub fn main() !void {
- const address = try std.net.Address.parseIp("127.0.0.1", 8000);
+ const address = try std.net.Address.parseIp("0.0.0.0", 7777);
const tpe: u32 = posix.SOCK.STREAM | posix.SOCK.NONBLOCK;
const protocol = posix.IPPROTO.TCP;
@@ -168,7 +177,8 @@ pub fn main() !void {
}
var ready_list: [128]linux.epoll_event = undefined;
- var client_list = try std.BoundedArray(Client, 128).init(0);
+ var client_buffer = std.mem.zeroes([128]Client);
+ var client_list = std.ArrayList(Client).fromOwnedSlice(&client_buffer);
while (true) {
const ready_count = posix.epoll_wait(efd, &ready_list, -1);
@@ -178,7 +188,7 @@ pub fn main() !void {
if (ready_socket == listener) {
const client_socket = try posix.accept(listener, null, null, posix.SOCK.NONBLOCK);
errdefer posix.close(client_socket);
- var new_client = try client_list.addOne();
+ var new_client = try client_list.addOneBounded();
new_client.fd = client_socket;
var event = linux.epoll_event{ .events = linux.EPOLL.IN, .data = .{ .ptr = @intFromPtr(new_client) } };
try posix.epoll_ctl(efd, linux.EPOLL.CTL_ADD, client_socket, &event);