diff options
Diffstat (limited to 'ws_epoll.zig')
| -rw-r--r-- | ws_epoll.zig | 46 |
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); |
