srctree

Gregory Mullen parent 2c06156c dad8bf3b
restructure websockets

src/frame.zig added: 31, removed: 28, total 3
@@ -181,32 +181,7 @@ pub fn redirect(vrs: *Frame, loc: []const u8, comptime scode: std.http.Status) N
}
 
pub fn acceptWebsocket(frame: *Frame) !Websocket {
frame.status = .switching_protocols;
frame.content_type = null;
 
const key = if (frame.request.headers.getCustom("Sec-WebSocket-Key")) |key|
key.value_list.value
else
return error.InvalidWebsocketRequest;
 
var sha1 = std.crypto.hash.Sha1.init(.{});
sha1.update(key);
sha1.update("258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
var digest: [std.crypto.hash.Sha1.digest_length]u8 = undefined;
sha1.final(&digest);
var base64_digest: [28]u8 = undefined;
_ = std.base64.standard.Encoder.encode(&base64_digest, &digest);
 
frame.headersAdd("Upgrade", "websocket") catch unreachable;
frame.headersAdd("Connection", "Upgrade") catch unreachable;
frame.headersAdd("Sec-WebSocket-Accept", base64_digest[0..]) catch unreachable;
frame.sendHeaders() catch |err| switch (err) {
error.BrokenPipe => |e| return e,
else => return error.IOWriteFailure,
};
try frame.sendRawSlice("\r\n");
 
return Websocket{ .frame = frame };
return Websocket.accept(frame);
}
 
pub fn init(a: Allocator, req: *const Request, auth: Auth.Provider) !Frame {
 
src/websocket.zig added: 31, removed: 28, total 3
@@ -2,6 +2,32 @@ frame: *Frame,
 
const Websocket = @This();
 
pub fn accept(frame: *Frame) !Websocket {
frame.status = .switching_protocols;
frame.content_type = null;
 
const key = if (frame.request.headers.getCustom("Sec-WebSocket-Key")) |key|
key.value_list.value
else
return error.InvalidWebsocketRequest;
 
var sha = Hash.init(.{});
sha.update(key);
sha.update("258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
var digest: [Hash.digest_length]u8 = undefined;
sha.final(&digest);
var base64_digest: [28]u8 = undefined;
_ = base64.encode(&base64_digest, &digest);
 
try frame.headersAdd("Upgrade", "websocket");
try frame.headersAdd("Connection", "Upgrade");
try frame.headersAdd("Sec-WebSocket-Accept", base64_digest[0..]);
try frame.sendHeaders();
try frame.sendRawSlice("\r\n");
 
return Websocket{ .frame = frame };
}
 
pub fn send(ws: Websocket, msg: []const u8) !void {
_ = switch (ws.frame.downstream) {
.zwsgi, .http => |stream| try stream.writev(&[2]std.posix.iovec_const{
@@ -14,3 +40,5 @@ pub fn send(ws: Websocket, msg: []const u8) !void {
 
const std = @import("std");
const Frame = @import("frame.zig");
const Hash = std.crypto.hash.Sha1;
const base64 = std.base64.standard.Encoder;