Code Review
/
src
/
app-framework-binder.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
Add function afb_evt_eventid_addref
[src/app-framework-binder.git]
/
src
/
afb-ws.c
diff --git
a/src/afb-ws.c
b/src/afb-ws.c
index
d159c28
..
ff625fc
100644
(file)
--- a/
src/afb-ws.c
+++ b/
src/afb-ws.c
@@
-1,5
+1,5
@@
/*
/*
- * Copyright (C) 2016 "IoT.bzh"
+ * Copyright (C) 2016
, 2017
"IoT.bzh"
* Author: José Bollo <jose.bollo@iot.bzh>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* Author: José Bollo <jose.bollo@iot.bzh>
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@
-99,11
+99,21
@@
struct afb_ws
static inline struct buf aws_pick_buffer(struct afb_ws *ws)
{
struct buf result = ws->buffer;
static inline struct buf aws_pick_buffer(struct afb_ws *ws)
{
struct buf result = ws->buffer;
+ if (result.buffer)
+ result.buffer[result.size] = 0;
ws->buffer.buffer = NULL;
ws->buffer.size = 0;
return result;
}
ws->buffer.buffer = NULL;
ws->buffer.size = 0;
return result;
}
+/*
+ * Clear the current buffer
+ */
+static inline void aws_clear_buffer(struct afb_ws *ws)
+{
+ ws->buffer.size = 0;
+}
+
/*
* Disconnect the websocket 'ws' and calls on_hangup if
* 'call_on_hangup' is not null.
/*
* Disconnect the websocket 'ws' and calls on_hangup if
* 'call_on_hangup' is not null.
@@
-116,7
+126,7
@@
static void aws_disconnect(struct afb_ws *ws, int call_on_hangup)
sd_event_source_unref(ws->evsrc);
ws->evsrc = NULL;
websock_destroy(wsi);
sd_event_source_unref(ws->evsrc);
ws->evsrc = NULL;
websock_destroy(wsi);
- free(
aws_pick_buffer(ws)
.buffer);
+ free(
ws->buffer
.buffer);
ws->state = waiting;
if (call_on_hangup && ws->itf->on_hangup)
ws->itf->on_hangup(ws->closure);
ws->state = waiting;
if (call_on_hangup && ws->itf->on_hangup)
ws->itf->on_hangup(ws->closure);
@@
-379,7
+389,7
@@
static void aws_on_readable(struct afb_ws *ws)
int rc;
assert(ws->ws != NULL);
int rc;
assert(ws->ws != NULL);
- rc = websock_dispatch(ws->ws);
+ rc = websock_dispatch(ws->ws
, 0
);
if (rc < 0 && errno == EPIPE)
afb_ws_hangup(ws);
}
if (rc < 0 && errno == EPIPE)
afb_ws_hangup(ws);
}
@@
-395,24
+405,24
@@
static int aws_read(struct afb_ws *ws, size_t size)
ssize_t sz;
char *buffer;
ssize_t sz;
char *buffer;
- if (size != 0) {
+ if (size != 0
|| ws->buffer.buffer == NULL
) {
buffer = realloc(ws->buffer.buffer, ws->buffer.size + size + 1);
if (buffer == NULL)
return 0;
ws->buffer.buffer = buffer;
buffer = realloc(ws->buffer.buffer, ws->buffer.size + size + 1);
if (buffer == NULL)
return 0;
ws->buffer.buffer = buffer;
-
do
{
+
while (size != 0)
{
sz = websock_read(ws->ws, &buffer[ws->buffer.size], size);
if (sz < 0) {
if (errno != EAGAIN)
return 0;
pfd.fd = ws->fd;
pfd.events = POLLIN;
sz = websock_read(ws->ws, &buffer[ws->buffer.size], size);
if (sz < 0) {
if (errno != EAGAIN)
return 0;
pfd.fd = ws->fd;
pfd.events = POLLIN;
- poll(&pfd, 1, 10);
+ poll(&pfd, 1, 10);
/* TODO: make fully asynchronous websockets */
} else {
ws->buffer.size += (size_t)sz;
size -= (size_t)sz;
}
} else {
ws->buffer.size += (size_t)sz;
size -= (size_t)sz;
}
- }
while (size != 0);
+ }
}
return 1;
}
}
return 1;
}
@@
-425,7
+435,7
@@
static void aws_on_close(struct afb_ws *ws, uint16_t code, size_t size)
struct buf b;
ws->state = waiting;
struct buf b;
ws->state = waiting;
-
free(aws_pick_buffer(ws).buffer
);
+
aws_clear_buffer(ws
);
if (ws->itf->on_close == NULL) {
websock_drop(ws->ws);
afb_ws_hangup(ws);
if (ws->itf->on_close == NULL) {
websock_drop(ws->ws);
afb_ws_hangup(ws);
@@
-443,7
+453,7
@@
static void aws_on_close(struct afb_ws *ws, uint16_t code, size_t size)
static void aws_drop_error(struct afb_ws *ws, uint16_t code)
{
ws->state = waiting;
static void aws_drop_error(struct afb_ws *ws, uint16_t code)
{
ws->state = waiting;
-
free(aws_pick_buffer(ws).buffer
);
+
aws_clear_buffer(ws
);
websock_drop(ws->ws);
websock_error(ws->ws, code, NULL, 0);
}
websock_drop(ws->ws);
websock_error(ws->ws, code, NULL, 0);
}
@@
-462,7
+472,6
@@
static void aws_continue(struct afb_ws *ws, int last, size_t size)
istxt = ws->state == reading_text;
ws->state = waiting;
b = aws_pick_buffer(ws);
istxt = ws->state == reading_text;
ws->state = waiting;
b = aws_pick_buffer(ws);
- b.buffer[b.size] = 0;
(istxt ? ws->itf->on_text : ws->itf->on_binary)(ws->closure, b.buffer, b.size);
}
}
(istxt ? ws->itf->on_text : ws->itf->on_binary)(ws->closure, b.buffer, b.size);
}
}
@@
-498,7
+507,7
@@
static void aws_on_binary(struct afb_ws *ws, int last, size_t size)
}
/*
}
/*
- * Callback when 'c
los
e' command received from 'ws' with 'code' and 'size'.
+ * Callback when 'c
ontinu
e' command received from 'ws' with 'code' and 'size'.
*/
static void aws_on_continue(struct afb_ws *ws, int last, size_t size)
{
*/
static void aws_on_continue(struct afb_ws *ws, int last, size_t size)
{