*
* @param client WebSocket client.
*/
-typedef void (*WebSocketOnCloseCallback)(int client);
+typedef void (*WebSocketOnCloseCallback)(int client, struct WebSocketErrorResult errorResult);
typedef enum WebSocketErrCode {
WEBSOCKET_ERROR_CONNECT_TO_HOST = (-19),
WEBSOCKET_ERROR_CONNECT_CLOSED = (-20),
+
+ WEBSOCKE_ERROR_CONNECTION_NOT_CLOSED = (-21),
} WebSocketErrCode;
#include <stdio.h>
-#define WS_DBG_LEVEL WEBSOCKET_DBG_ON
+#define WS_DBG_LEVEL WEBSOCKET_DBG_OFF
#define WS_INFO_LEVEL WEBSOCKET_DBG_ON
* Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.
*/
-#ifndef _WS_FRAME_H__
-#define _WS_FRAME_H__
+#ifndef _NET_WS_FRAME_H__
+#define _NET_WS_FRAME_H__
-#include "net_websocket.h"
#include <stdint.h>
+#include "net_websocket.h"
+#include "net_websocket_priv.h"
-typedef enum _rws_opcode {
+typedef enum {
WS_OPCODE_CONTINUATION = 0x0, // %x0 denotes a continuation frame
WS_OPCODE_TEXT_FRAME = 0x1, // %x1 denotes a text frame
WS_OPCODE_BINARY_FRAME = 0x2, // %x2 denotes a binary frame
typedef enum WsBinaryCode { WS_BINARY_START, WS_BINARY_CONTINUE, WS_BINARY_END } WsBinary;
typedef struct WsFrameStruct {
- void *data;
+ uint8_t *data;
size_t length;
WsOpcode opcode;
uint8_t mask[4]; /* 4: mask length */
uint8_t headerSize;
} WsFrame;
-size_t WsCheckRecvFrameSize(const void *data, const size_t data_size);
+size_t WsCheckRecvFrameSize(const uint8_t *data, const size_t data_size);
-WsFrame *WsFrameCreateWithRecvData(const void *data, const size_t data_size);
+WsFrame *WsFrameCreateWithRecvData(struct WebSocketClient *clientPtr, const uint8_t *data, const size_t length);
-void WsFrameFillWithSendBinData(WsFrame *f, const void *data, const size_t length, WsBinary binType);
+void WsFrameFillWithSendBinData(WsFrame *frame, const uint8_t *data, const size_t length, WsBinary binType);
// data - should be null, and setted by newly created. 'data' & 'data_size' can be null
-void WsFrameFillWithSendData(WsFrame *f, const void *data, const size_t data_size, bool is_finish);
+void WsFrameFillWithSendData(WsFrame *frame, const uint8_t *data, const size_t data_size, bool is_finish);
// combine datas of 2 frames. combined is 'to'
void WsFrameCombineDatas(WsFrame *to, WsFrame *from);
-WsFrame *WsFrameCreate(void);
+WsFrame *WsFrameCreate(struct WebSocketClient *clientPtr);
+
+void WsDeleteFrame(WsFrame *frame);
+
+void WsInitFrameRandom(struct WebSocketClient *clientPtr);
-void WsDeleteFrame(WsFrame *f);
+void WsFreeRandom(struct WebSocketClient *clientPtr);
#endif
* Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.
*/
-#ifndef __WS_LIST_H__
-#define __WS_LIST_H__
+#ifndef __NET_WS_LIST_H__
+#define __NET_WS_LIST_H__
#include <stdio.h>
#define WS_MAX_CLIENT_NUM 4
-#define WS_MAX_URI_LENGTH 512
-
#define WS_MAX_DATA_LENGTH (20 * 1024)
-#define WS_HANDSHAKE_BUF_LEN 1024
-
#define WSS_READ_TIMEOUT_MS 100
+#define WS_THREAD_STACK_SIZE (6 * 1024)
+
+#define WS_THREAD_SLEEP_MS 100
#endif
\ No newline at end of file
#include "net_websocket_frame.h"
#include "net_websocket_list.h"
+#include "mbedtls/ctr_drbg.h"
+#include "mbedtls/entropy.h"
+
#ifdef WEBSOCKET_SSL_ENABLE
#include "mbedtls/net_sockets.h"
#include "mbedtls/ssl.h"
-#include "mbedtls/entropy.h"
-#include "mbedtls/ctr_drbg.h"
#endif
typedef int WsSocket;
} WsSsl;
#endif
+#define WS_MAX_SCHEME_LEN 16
+
struct WebSocketClient {
int clientfd;
int port;
WsSocket socket;
- char scheme[WS_MAX_URI_LENGTH];
- char host[WS_MAX_URI_LENGTH];
- char path[WS_MAX_URI_LENGTH];
+ char scheme[WS_MAX_SCHEME_LEN];
+ char *url;
+ char *host;
+ char *requestOption;
char *secWsProtocol; // "Sec-WebSocket-Protocol" field
char *secWsAccept; // "Sec-WebSocket-Accept" field from handshake
bool isConnected; // sock connected + handshake done
- void *userObject;
/** Pointer to the callback invoked when a connection message is received */
WebSocketOnOpenCallback onOpen;
/** Pointer to the callback invoked when a message is received */
/** Pointer to the callback invoked when a close message is received */
WebSocketOnCloseCallback onClose;
- void *received;
+ uint8_t *received;
size_t receivedSize; // size of 'received' memory
size_t receivedLen; // length of actualy readed message
WsMutex workMutex;
WsMutex sendMutex;
- WsSem exitSem;
+
+ mbedtls_entropy_context randomEntropy; /* random entropy */
+ mbedtls_ctr_drbg_context randomCtrDrbg;
#ifdef WEBSOCKET_SSL_ENABLE
const char *serverCert; /**< Server certification. */
#endif
char *recvBuffer;
int recvBufferSize;
+
+ struct WebSocketErrorResult errorResult;
};
void WebSocketClientClosePriv(struct WebSocketClient *clientPtr);
int AllocWsClient(void);
-bool WsParseUrl(const char *url, char *prefix, char *address, char *path, int *port);
-
int WsSocketSendTextPriv(struct WebSocketClient *clientPtr, const char *text);
int WsClientSendBinStartPriv(struct WebSocketClient *clientPtr, const char *data, size_t length);
/*
* Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.
*/
-#ifndef __RWS_STRING_H__
-#define __RWS_STRING_H__
+#ifndef __NET_WS_STRING_H__
+#define __NET_WS_STRING_H__
#include <stdio.h>
#include <stdlib.h>
* Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.
*/
-#ifndef __RWS_THREAD_H__
-#define __RWS_THREAD_H__
+#ifndef __NET_WS_THREAD_H__
+#define __NET_WS_THREAD_H__
#include <stdio.h>
-#include <pthread.h>
+#include "cmsis_os2.h"
#define RWS_WAIT_FOREVER 0xffffffffu
struct WsThreadStruct {
WsThreadFunct threadFunction;
- void *userObject;
- pthread_t thread;
+ osThreadId_t thread;
+ void *stackMem;
};
/**
void WsSemSignal(WsSem sem);
+int WsThreadSuspend(WsThread workThread);
+
+int WsThreadResume(WsThread workThread);
#endif
JSI::ReleaseValueList(value, err);\r
}\r
\r
-static void OnClose(int client)\r
+static void OnClose(int client, struct WebSocketErrorResult errorResult)\r
{\r
auto it = WebsocketModule::eventCallbacks.find(std::string("open"));\r
if (it == WebsocketModule::eventCallbacks.end()) {\r
// 调用关闭回调
if (client->on_close) {
- client->on_close(client->client_fd);
+ struct WebSocketErrorResult error = {
+ .errorCode = WEBSOCKET_CONNECTION_CLOSED_BY_PEER,
+ .errorMessage = "WebSocket connection closed by peer"
+ };
+ client->on_close(client->client_fd,error);
}
}