X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fwebsock.c;h=8518b7210a36df5fc8486957efd14610b4524ddc;hb=refs%2Fheads%2Fdab;hp=04661c11411d8a9596e6c3050c4f989f27e24528;hpb=a38382e89710db2c298f7f101e3ba0cf3681287c;p=src%2Fapp-framework-binder.git diff --git a/src/websock.c b/src/websock.c index 04661c11..8518b721 100644 --- a/src/websock.c +++ b/src/websock.c @@ -30,6 +30,9 @@ #include "websock.h" #define BLOCK_DATA_SIZE 4096 +#if !defined(WEBSOCKET_DEFAULT_MAXLENGTH) +# define WEBSOCKET_DEFAULT_MAXLENGTH 1048500 /* 76 less than 1M, probably enougth for headers */ +#endif #define FRAME_GET_FIN(BYTE) (((BYTE) >> 7) & 0x01) #define FRAME_GET_RSV1(BYTE) (((BYTE) >> 6) & 0x01) @@ -45,7 +48,7 @@ #define FRAME_SET_RSV3(BYTE) (((BYTE) & 0x01) << 4) #define FRAME_SET_OPCODE(BYTE) ((BYTE) & 0x0F) #define FRAME_SET_MASK(BYTE) (((BYTE) & 0x01) << 7) -#define FRAME_SET_LENGTH(X64, IDX) (unsigned char)(((X64) >> ((IDX)*8)) & 0xFF) +#define FRAME_SET_LENGTH(X64, IDX) (unsigned char)((sizeof(X64)) <= (IDX) ? 0 : (((X64) >> ((IDX)*8)) & 0xFF)) #define OPCODE_CONTINUATION 0x0 #define OPCODE_TEXT 0x1 @@ -59,6 +62,8 @@ #define STATE_LENGTH 2 #define STATE_DATA 3 +static size_t default_maxlength = WEBSOCKET_DEFAULT_MAXLENGTH; + struct websock { int state; uint64_t maxlength; @@ -303,7 +308,7 @@ static int check_control_header(struct websock *ws) return 1; } -int websock_dispatch(struct websock *ws) +int websock_dispatch(struct websock *ws, int loop) { uint16_t code; loop: @@ -418,16 +423,22 @@ loop: ws->itf->on_continue(ws->closure, FRAME_GET_FIN(ws->header[0]), (size_t) ws->length); + if (!loop) + return 0; break; case OPCODE_TEXT: ws->itf->on_text(ws->closure, FRAME_GET_FIN(ws->header[0]), (size_t) ws->length); + if (!loop) + return 0; break; case OPCODE_BINARY: ws->itf->on_binary(ws->closure, FRAME_GET_FIN(ws->header[0]), (size_t) ws->length); + if (!loop) + return 0; break; case OPCODE_CLOSE: if (ws->length == 0) @@ -447,6 +458,8 @@ loop: websock_pong(ws, NULL, 0); } ws->state = STATE_INIT; + if (!loop) + return 0; break; case OPCODE_PONG: if (ws->itf->on_pong) @@ -454,6 +467,8 @@ loop: else websock_drop(ws); ws->state = STATE_INIT; + if (!loop) + return 0; break; default: goto protocol_error; @@ -548,7 +563,7 @@ struct websock *websock_create_v13(const struct websock_itf *itf, void *closure) if (result) { result->itf = itf; result->closure = closure; - result->maxlength = 65000; + result->maxlength = default_maxlength; } return result; } @@ -557,3 +572,13 @@ void websock_destroy(struct websock *ws) { free(ws); } + +void websock_set_default_max_length(size_t maxlen) +{ + default_maxlength = maxlen; +} + +void websock_set_max_length(struct websock *ws, size_t maxlen) +{ + ws->maxlength = (uint64_t)maxlen; +}