mirror of
https://github.com/oven-sh/bun
synced 2026-02-14 12:51:54 +00:00
It connects! but the frames are corrupt
This commit is contained in:
committed by
Jarred Sumner
parent
be9efacf1b
commit
ab888d2ebe
@@ -64,11 +64,11 @@ pub fn NewSocketHandler(comptime ssl: bool) type {
|
||||
this.socket,
|
||||
);
|
||||
}
|
||||
pub fn isShutdown(this: ThisSocket) c_int {
|
||||
pub fn isShutdown(this: ThisSocket) bool {
|
||||
return us_socket_is_shut_down(
|
||||
comptime ssl_int,
|
||||
this.socket,
|
||||
);
|
||||
) > 0;
|
||||
}
|
||||
pub fn isClosed(this: ThisSocket) c_int {
|
||||
return us_socket_is_closed(
|
||||
@@ -136,12 +136,10 @@ pub fn NewSocketHandler(comptime ssl: bool) type {
|
||||
comptime onEnd: anytype,
|
||||
) void {
|
||||
const SocketHandler = struct {
|
||||
pub fn on_open(socket: *Socket, _: c_int, ip: [*c]u8, port: c_int) callconv(.C) ?*Socket {
|
||||
pub fn on_open(socket: *Socket, _: c_int, _: [*c]u8, _: c_int) callconv(.C) ?*Socket {
|
||||
onOpen(
|
||||
@ptrCast(*ContextType, @alignCast(std.meta.alignment(ContextType), us_socket_ext(comptime ssl_int, socket).?)),
|
||||
ThisSocket{ .socket = socket },
|
||||
bun.span(ip),
|
||||
port,
|
||||
);
|
||||
return socket;
|
||||
}
|
||||
|
||||
@@ -60,7 +60,7 @@ fn buildRequestBody(vm: *JSC.VirtualMachine, pathname: *const JSC.ZigString, hos
|
||||
"Connection: Upgrade\r\n" ++
|
||||
"Upgrade: websocket\r\n" ++
|
||||
"Sec-WebSocket-Version: 13\r\n" ++
|
||||
"{any}\n" ++
|
||||
"{any}" ++
|
||||
"\r\n",
|
||||
.{
|
||||
pathname_,
|
||||
@@ -199,7 +199,7 @@ pub fn NewHTTPUpgradeClient(comptime ssl: bool) type {
|
||||
pub fn handleClose(this: *HTTPClient, _: Socket, _: c_int, _: ?*anyopaque) void {
|
||||
JSC.markBinding();
|
||||
this.clearData();
|
||||
WebSocket__didFailToConnect(this.outgoing_websocket, ErrorCode.closed);
|
||||
WebSocket__didFailToConnect(this.outgoing_websocket, ErrorCode.ended);
|
||||
}
|
||||
|
||||
pub fn terminate(this: *HTTPClient, code: ErrorCode) void {
|
||||
@@ -208,13 +208,13 @@ pub fn NewHTTPUpgradeClient(comptime ssl: bool) type {
|
||||
this.socket.close(0, null);
|
||||
}
|
||||
|
||||
pub fn handleOpen(this: *HTTPClient, socket: Socket, _: []const u8, _: c_int) void {
|
||||
pub fn handleOpen(this: *HTTPClient, socket: Socket) void {
|
||||
std.debug.assert(socket.socket == this.socket.socket);
|
||||
|
||||
std.debug.assert(this.input_body_buf.len > 0);
|
||||
std.debug.assert(this.to_send.len == 0);
|
||||
|
||||
const wrote = socket.write(this.input_body_buf, false);
|
||||
const wrote = socket.write(this.input_body_buf, true);
|
||||
if (wrote < 0) {
|
||||
this.terminate(ErrorCode.failed_to_write);
|
||||
return;
|
||||
@@ -235,14 +235,14 @@ pub fn NewHTTPUpgradeClient(comptime ssl: bool) type {
|
||||
std.debug.assert(socket.socket == this.socket.socket);
|
||||
|
||||
if (comptime Environment.allow_assert)
|
||||
std.debug.assert(socket.isShutdown() == 0);
|
||||
std.debug.assert(!socket.isShutdown());
|
||||
|
||||
var body = this.getBody();
|
||||
var remain = body[this.body_written..];
|
||||
const is_first = this.body_written == 0;
|
||||
if (is_first and data.len >= "101 ".len) {
|
||||
if (is_first and data.len >= "HTTP/1.1 101 ".len) {
|
||||
// fail early if we receive a non-101 status code
|
||||
if (!strings.eqlComptimeIgnoreLen(data[0.."101 ".len], "101 ")) {
|
||||
if (!strings.eqlComptimeIgnoreLen(data[0.."HTTP/1.1 101 ".len], "HTTP/1.1 101 ")) {
|
||||
this.terminate(ErrorCode.expected_101_status_code);
|
||||
return;
|
||||
}
|
||||
@@ -291,7 +291,8 @@ pub fn NewHTTPUpgradeClient(comptime ssl: bool) type {
|
||||
var connection_header = PicoHTTP.Header{ .name = "", .value = "" };
|
||||
var websocket_accept_header = PicoHTTP.Header{ .name = "", .value = "" };
|
||||
var visited_protocol = this.websocket_protocol == 0;
|
||||
var visited_version = false;
|
||||
// var visited_version = false;
|
||||
std.debug.assert(response.status_code == 101);
|
||||
|
||||
if (remain_buf.len > 0) {
|
||||
std.debug.assert(overflow_buf.len == 0);
|
||||
@@ -302,7 +303,7 @@ pub fn NewHTTPUpgradeClient(comptime ssl: bool) type {
|
||||
"Connection".len => {
|
||||
if (connection_header.name.len == 0 and strings.eqlCaseInsensitiveASCII(header.name, "Connection", false)) {
|
||||
connection_header = header;
|
||||
if (visited_protocol and upgrade_header.name.len > 0 and connection_header.name.len > 0 and websocket_accept_header.name.len > 0 and visited_version) {
|
||||
if (visited_protocol and upgrade_header.name.len > 0 and connection_header.name.len > 0 and websocket_accept_header.name.len > 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -310,14 +311,13 @@ pub fn NewHTTPUpgradeClient(comptime ssl: bool) type {
|
||||
"Upgrade".len => {
|
||||
if (upgrade_header.name.len == 0 and strings.eqlCaseInsensitiveASCII(header.name, "Upgrade", false)) {
|
||||
upgrade_header = header;
|
||||
if (visited_protocol and upgrade_header.name.len > 0 and connection_header.name.len > 0 and websocket_accept_header.name.len > 0 and visited_version) {
|
||||
if (visited_protocol and upgrade_header.name.len > 0 and connection_header.name.len > 0 and websocket_accept_header.name.len > 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
},
|
||||
"Sec-WebSocket-Version".len => {
|
||||
if (!visited_version and strings.eqlCaseInsensitiveASCII(header.name, "Sec-WebSocket-Version", false)) {
|
||||
visited_version = true;
|
||||
if (strings.eqlCaseInsensitiveASCII(header.name, "Sec-WebSocket-Version", false)) {
|
||||
if (!strings.eqlComptimeIgnoreLen(header.value, "13")) {
|
||||
this.terminate(ErrorCode.invalid_websocket_version);
|
||||
return;
|
||||
@@ -327,7 +327,7 @@ pub fn NewHTTPUpgradeClient(comptime ssl: bool) type {
|
||||
"Sec-WebSocket-Accept".len => {
|
||||
if (websocket_accept_header.name.len == 0 and strings.eqlCaseInsensitiveASCII(header.name, "Sec-WebSocket-Accept", false)) {
|
||||
websocket_accept_header = header;
|
||||
if (visited_protocol and upgrade_header.name.len > 0 and connection_header.name.len > 0 and websocket_accept_header.name.len > 0 and visited_version) {
|
||||
if (visited_protocol and upgrade_header.name.len > 0 and connection_header.name.len > 0 and websocket_accept_header.name.len > 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -340,7 +340,7 @@ pub fn NewHTTPUpgradeClient(comptime ssl: bool) type {
|
||||
}
|
||||
visited_protocol = true;
|
||||
|
||||
if (visited_protocol and upgrade_header.name.len > 0 and connection_header.name.len > 0 and websocket_accept_header.name.len > 0 and visited_version) {
|
||||
if (visited_protocol and upgrade_header.name.len > 0 and connection_header.name.len > 0 and websocket_accept_header.name.len > 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -349,10 +349,10 @@ pub fn NewHTTPUpgradeClient(comptime ssl: bool) type {
|
||||
}
|
||||
}
|
||||
|
||||
if (!visited_version) {
|
||||
this.terminate(ErrorCode.invalid_websocket_version);
|
||||
return;
|
||||
}
|
||||
// if (!visited_version) {
|
||||
// this.terminate(ErrorCode.invalid_websocket_version);
|
||||
// return;
|
||||
// }
|
||||
|
||||
if (@minimum(upgrade_header.name.len, upgrade_header.value.len) == 0) {
|
||||
this.terminate(ErrorCode.missing_upgrade_header);
|
||||
@@ -374,7 +374,7 @@ pub fn NewHTTPUpgradeClient(comptime ssl: bool) type {
|
||||
return;
|
||||
}
|
||||
|
||||
if (strings.eqlComptime(connection_header.value, "Upgrade")) {
|
||||
if (!strings.eqlComptime(connection_header.value, "Upgrade")) {
|
||||
this.terminate(ErrorCode.invalid_connection_header);
|
||||
return;
|
||||
}
|
||||
@@ -394,7 +394,7 @@ pub fn NewHTTPUpgradeClient(comptime ssl: bool) type {
|
||||
return;
|
||||
};
|
||||
if (remain_buf.len > 0) @memcpy(overflow.ptr, remain_buf.ptr, remain_buf.len);
|
||||
if (overflow_buf.len > 0) @memcpy(overflow.ptr + remain_buf.len, overflow_buf.ptr, remain_buf.len);
|
||||
if (overflow_buf.len > 0) @memcpy(overflow.ptr + remain_buf.len, overflow_buf.ptr, overflow_buf.len);
|
||||
}
|
||||
|
||||
this.clearData();
|
||||
@@ -411,7 +411,7 @@ pub fn NewHTTPUpgradeClient(comptime ssl: bool) type {
|
||||
if (this.to_send.len == 0)
|
||||
return;
|
||||
|
||||
const wrote = socket.write(this.to_send, false);
|
||||
const wrote = socket.write(this.to_send, true);
|
||||
if (wrote < 0) {
|
||||
this.terminate(ErrorCode.failed_to_write);
|
||||
return;
|
||||
|
||||
@@ -420,6 +420,8 @@ ExceptionOr<void> WebSocket::send(const String& message)
|
||||
if (utf8.length() > 0)
|
||||
this->sendWebSocketData<false>(utf8.data(), utf8.length());
|
||||
|
||||
delete utf8;
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
@@ -490,22 +492,22 @@ void WebSocket::sendWebSocketData(const char* baseAddress, size_t length)
|
||||
|
||||
switch (m_connectedWebSocketKind) {
|
||||
case ConnectedWebSocketKind::Client: {
|
||||
this->m_connectedWebSocket.client->send({ baseAddress, length }, opCode, false);
|
||||
this->m_connectedWebSocket.client->send({ baseAddress, length }, opCode);
|
||||
this->m_bufferedAmount = this->m_connectedWebSocket.client->getBufferedAmount();
|
||||
break;
|
||||
}
|
||||
case ConnectedWebSocketKind::ClientSSL: {
|
||||
this->m_connectedWebSocket.clientSSL->send({ baseAddress, length }, opCode, false);
|
||||
this->m_connectedWebSocket.clientSSL->send({ baseAddress, length }, opCode);
|
||||
this->m_bufferedAmount = this->m_connectedWebSocket.clientSSL->getBufferedAmount();
|
||||
break;
|
||||
}
|
||||
case ConnectedWebSocketKind::Server: {
|
||||
this->m_connectedWebSocket.server->send({ baseAddress, length }, opCode, false);
|
||||
this->m_connectedWebSocket.server->send({ baseAddress, length }, opCode);
|
||||
this->m_bufferedAmount = this->m_connectedWebSocket.server->getBufferedAmount();
|
||||
break;
|
||||
}
|
||||
case ConnectedWebSocketKind::ServerSSL: {
|
||||
this->m_connectedWebSocket.serverSSL->send({ baseAddress, length }, opCode, false);
|
||||
this->m_connectedWebSocket.serverSSL->send({ baseAddress, length }, opCode);
|
||||
this->m_bufferedAmount = this->m_connectedWebSocket.serverSSL->getBufferedAmount();
|
||||
break;
|
||||
}
|
||||
@@ -827,13 +829,14 @@ void WebSocket::dispatchErrorEventIfNeeded()
|
||||
|
||||
void WebSocket::didConnect(us_socket_t* socket, char* bufferedData, size_t bufferedDataSize)
|
||||
{
|
||||
m_state = OPEN;
|
||||
this->m_upgradeClient = nullptr;
|
||||
if (m_isSecure) {
|
||||
/* Adopting a socket invalidates it, do not rely on it directly to carry any data */
|
||||
uWS::WebSocket<true, false, WebSocket*>* webSocket = (uWS::WebSocket<true, false, WebSocket*>*)us_socket_context_adopt_socket(1,
|
||||
(us_socket_context_t*)this->scriptExecutionContext()->connnectedWebSocketContext<true, false>(), socket, sizeof(uWS::WebSocketData) + sizeof(WebSocket*));
|
||||
|
||||
webSocket->AsyncSocket<true>::uncork();
|
||||
|
||||
webSocket->init(0, uWS::CompressOptions::DISABLED, uWS::BackPressure());
|
||||
*webSocket->getUserData() = this;
|
||||
this->m_connectedWebSocket.clientSSL = webSocket;
|
||||
@@ -843,6 +846,8 @@ void WebSocket::didConnect(us_socket_t* socket, char* bufferedData, size_t buffe
|
||||
uWS::WebSocket<false, false, WebSocket*>* webSocket = (uWS::WebSocket<false, false, WebSocket*>*)us_socket_context_adopt_socket(1,
|
||||
(us_socket_context_t*)this->scriptExecutionContext()->connnectedWebSocketContext<false, false>(), socket, sizeof(uWS::WebSocketData) + sizeof(WebSocket*));
|
||||
|
||||
webSocket->AsyncSocket<false>::uncork();
|
||||
|
||||
webSocket->init(0, uWS::CompressOptions::DISABLED, uWS::BackPressure());
|
||||
*webSocket->getUserData() = this;
|
||||
this->m_connectedWebSocket.client = webSocket;
|
||||
|
||||
Reference in New Issue
Block a user