X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fwebsock.c;h=8518b7210a36df5fc8486957efd14610b4524ddc;hb=6af240ddd3350874aa918591948dc1902169d7f7;hp=1b886c1bdfa1fc49c572205103379158e241a567;hpb=c7e9786d408f13d8f8f43c6b68da916bbb1ed5f3;p=src%2Fapp-framework-binder.git diff --git a/src/websock.c b/src/websock.c index 1b886c1b..8518b721 100644 --- a/src/websock.c +++ b/src/websock.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016 "IoT.bzh" + * Copyright (C) 2016, 2017 "IoT.bzh" * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -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; @@ -537,7 +552,7 @@ int websock_drop(struct websock *ws) char buffer[8000]; while (ws->length) - if (ws_read(ws, buffer, sizeof buffer) < 0) + if (websock_read(ws, buffer, sizeof buffer) < 0) return -1; return 0; } @@ -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; +}