I had broken this for NT4 compat earlier, i manually reimplemented ntohll inline in the tlen == 127 check

This commit is contained in:
winsped
2026-07-12 02:58:30 +03:00
parent 962a3b2bff
commit 48f91c0912
+25 -16
View File
@@ -22,7 +22,7 @@ int OpenWebSocket(const char *hostname, const char *path, SSL **out_ssl) {
server.sin_addr = **(struct in_addr **)gethostbyname(hostname)->h_addr_list;
if (connect(sock, (struct sockaddr *)&server, sizeof(server)) ==
SOCKET_ERROR) {
SOCKET_ERROR) {
MessageBoxA(NULL, "connect failed", "WebSocket Error", 0);
closesocket(sock);
return 1;
@@ -64,14 +64,14 @@ int OpenWebSocket(const char *hostname, const char *path, SSL **out_ssl) {
// send WebSocket upgrade request
char request[2048];
wsprintfA(request,
"GET %s HTTP/1.1\r\n"
"Host: %s\r\n"
"Upgrade: websocket\r\n"
"Connection: Upgrade\r\n"
"Sec-WebSocket-Key: %s\r\n"
"Sec-WebSocket-Version: 13\r\n"
"\r\n",
path, hostname, ws_key);
"GET %s HTTP/1.1\r\n"
"Host: %s\r\n"
"Upgrade: websocket\r\n"
"Connection: Upgrade\r\n"
"Sec-WebSocket-Key: %s\r\n"
"Sec-WebSocket-Version: 13\r\n"
"\r\n",
path, hostname, ws_key);
SSL_write(ssl, request, (int)strlen(request));
@@ -106,7 +106,7 @@ DWORD WINAPI WSThreadProc(LPVOID ssl) {
if (length != 0 && result != 0) {
WebSocketOnDataArrival(ssl, buffer, length);
// printf("%s\n",buffer);
printf("%s\n", buffer);
// LE IMPORTANT: free the buffer after processing... memleak goez
// brr otherewise
free(buffer);
@@ -117,7 +117,8 @@ DWORD WINAPI WSThreadProc(LPVOID ssl) {
return 0;
};
int SendWebSocket(SSL *ssl, const char *data, size_t length,
unsigned char flags) {
unsigned char flags) {
printf("%s\n", data);
unsigned char frame[14];
size_t frame_size = 0;
@@ -153,7 +154,8 @@ int SendWebSocket(SSL *ssl, const char *data, size_t length,
mask[i] = (unsigned char)(i & 0xFF);
}
RtlCopyMemory(&frame[frame_size], mask, 4); // me when i rtlcopymemory to look cool
RtlCopyMemory(&frame[frame_size], mask,
4); // me when i rtlcopymemory to look cool
frame_size += 4;
// Send frame header
@@ -200,8 +202,15 @@ int ReadWebSocket(SSL *ssl, char **out_buffer, size_t *out_length) {
SSL_read(ssl, &plHeaders, 1);
unsigned char tlen = (plHeaders << 1) >> 1;
if (tlen == 127) {
SSL_read(ssl, &curPayloadLen, 8);
curPayloadLen = ntohl(curPayloadLen);
unsigned char lenbytes[8];
SSL_read(ssl, lenbytes,8);
curPayloadLen = 0;
for (int i = 0; i < 4; i++) {
unsigned char temp = lenbytes[i];
lenbytes[i]=lenbytes[7-i];
lenbytes[7-i]=temp;
}
curPayloadLen = *(unsigned long long*)lenbytes;
payloadLen += curPayloadLen;
} else if (tlen == 126) {
unsigned short templen;
@@ -222,8 +231,8 @@ int ReadWebSocket(SSL *ssl, char **out_buffer, size_t *out_length) {
unsigned long long totalRead = 0;
while (totalRead < curPayloadLen) {
int bytesRead = SSL_read(
ssl, *out_buffer + (payloadLen - curPayloadLen) + totalRead,
curPayloadLen - totalRead);
ssl, *out_buffer + (payloadLen - curPayloadLen) + totalRead,
curPayloadLen - totalRead);
if (bytesRead <= 0) {
free(*out_buffer);
return 0;