|
|
|
@ -230,28 +230,31 @@ static int websocket_dequeue(struct websocket_conn *wc) { |
|
|
|
struct lws *wsi = wc->wsi; |
|
|
|
while ((wo = g_queue_pop_head(&wc->output_q))) { |
|
|
|
// used buffer slot? |
|
|
|
if (wo->str) { |
|
|
|
// allocate post-buffer |
|
|
|
g_string_set_size(wo->str, wo->str->len + LWS_SEND_BUFFER_POST_PADDING); |
|
|
|
size_t to_send = wo->str->len - wo->str_done - LWS_SEND_BUFFER_POST_PADDING; |
|
|
|
if (to_send) { |
|
|
|
if (to_send > 2000) |
|
|
|
ilogs(http, LOG_DEBUG, "Writing %lu bytes to LWS", (unsigned long) to_send); |
|
|
|
else |
|
|
|
ilogs(http, LOG_DEBUG, "Writing back to LWS: '%.*s'", |
|
|
|
(int) to_send, wo->str->str + wo->str_done); |
|
|
|
size_t ret = lws_write(wsi, (unsigned char *) wo->str->str + wo->str_done, |
|
|
|
to_send, wo->protocol); |
|
|
|
if (ret != to_send) |
|
|
|
ilogs(http, LOG_ERR, "Invalid LWS write: %lu != %lu", |
|
|
|
(unsigned long) ret, |
|
|
|
(unsigned long) to_send); |
|
|
|
wo->str_done += ret; |
|
|
|
|
|
|
|
if (wo->protocol == LWS_WRITE_HTTP) |
|
|
|
is_http = 1; |
|
|
|
} |
|
|
|
if (!wo->str) |
|
|
|
goto next; |
|
|
|
|
|
|
|
// allocate post-buffer |
|
|
|
g_string_set_size(wo->str, wo->str->len + LWS_SEND_BUFFER_POST_PADDING); |
|
|
|
size_t to_send = wo->str->len - wo->str_done - LWS_SEND_BUFFER_POST_PADDING; |
|
|
|
if (to_send) { |
|
|
|
if (to_send > 2000) |
|
|
|
ilogs(http, LOG_DEBUG, "Writing %lu bytes to LWS", (unsigned long) to_send); |
|
|
|
else |
|
|
|
ilogs(http, LOG_DEBUG, "Writing back to LWS: '%.*s'", |
|
|
|
(int) to_send, wo->str->str + wo->str_done); |
|
|
|
size_t ret = lws_write(wsi, (unsigned char *) wo->str->str + wo->str_done, |
|
|
|
to_send, wo->protocol); |
|
|
|
if (ret != to_send) |
|
|
|
ilogs(http, LOG_ERR, "Invalid LWS write: %lu != %lu", |
|
|
|
(unsigned long) ret, |
|
|
|
(unsigned long) to_send); |
|
|
|
wo->str_done += ret; |
|
|
|
|
|
|
|
if (wo->protocol == LWS_WRITE_HTTP) |
|
|
|
is_http = 1; |
|
|
|
} |
|
|
|
|
|
|
|
next: |
|
|
|
websocket_output_free(wo); |
|
|
|
} |
|
|
|
g_queue_push_tail(&wc->output_q, websocket_output_new()); |
|
|
|
|