summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosé Bollo <jose.bollo@iot.bzh>2017-03-31 16:58:14 +0200
committerJosé Bollo <jose.bollo@iot.bzh>2017-03-31 17:13:18 +0200
commita88ecb472d5a82c80b0ccf8f0ef1594ec0d6c878 (patch)
treef30f5a101bb8d43fef4e5578c51336706a1e4405
parent6797f9722dd3e5463e0f7c118397955bb59a40c7 (diff)
Use xreq for websockets
Change-Id: Ia489f863e8be3384fbe8a240f6010f7d5916b72a Signed-off-by: José Bollo <jose.bollo@iot.bzh>
-rw-r--r--src/afb-hreq.c6
-rw-r--r--src/afb-ws-json1.c130
-rw-r--r--src/afb-xreq.c4
-rw-r--r--src/afb-xreq.h6
4 files changed, 36 insertions, 110 deletions
diff --git a/src/afb-hreq.c b/src/afb-hreq.c
index 8e3230db..69403f65 100644
--- a/src/afb-hreq.c
+++ b/src/afb-hreq.c
@@ -317,8 +317,8 @@ static void afb_hreq_destroy(struct afb_hreq *hreq)
}
afb_context_disconnect(&hreq->xreq.context);
json_object_put(hreq->json);
- free(hreq->xreq.api);
- free(hreq->xreq.verb);
+ free((char*)hreq->xreq.api);
+ free((char*)hreq->xreq.verb);
free(hreq);
}
@@ -908,8 +908,6 @@ static void req_success(struct afb_hreq *hreq, json_object *obj, const char *inf
int afb_hreq_init_req_call(struct afb_hreq *hreq, const char *api, size_t lenapi, const char *verb, size_t lenverb)
{
- free(hreq->xreq.api);
- free(hreq->xreq.verb);
hreq->xreq.api = strndup(api, lenapi);
hreq->xreq.verb = strndup(verb, lenverb);
if (hreq->xreq.api == NULL || hreq->xreq.verb == NULL) {
diff --git a/src/afb-ws-json1.c b/src/afb-ws-json1.c
index 8309065d..fdd3baed 100644
--- a/src/afb-ws-json1.c
+++ b/src/afb-ws-json1.c
@@ -33,6 +33,7 @@
#include "afb-msg-json.h"
#include "afb-session.h"
#include "afb-apis.h"
+#include "afb-xreq.h"
#include "afb-context.h"
#include "afb-evt.h"
#include "afb-subcall.h"
@@ -48,17 +49,9 @@ static void aws_on_call(struct afb_ws_json1 *ws, const char *api, const char *ve
static void aws_on_event(struct afb_ws_json1 *ws, const char *event, int eventid, struct json_object *object);
/* predeclaration of wsreq callbacks */
-static void wsreq_addref(struct afb_wsreq *wsreq);
-static void wsreq_unref(struct afb_wsreq *wsreq);
+static void wsreq_destroy(struct afb_wsreq *wsreq);
static struct json_object *wsreq_json(struct afb_wsreq *wsreq);
-static struct afb_arg wsreq_get(struct afb_wsreq *wsreq, const char *name);
-static void wsreq_fail(struct afb_wsreq *wsreq, const char *status, const char *info);
-static void wsreq_success(struct afb_wsreq *wsreq, struct json_object *obj, const char *info);
-static const char *wsreq_raw(struct afb_wsreq *wsreq, size_t *size);
-static void wsreq_send(struct afb_wsreq *wsreq, const char *buffer, size_t size);
-static int wsreq_subscribe(struct afb_wsreq *wsreq, struct afb_event event);
-static int wsreq_unsubscribe(struct afb_wsreq *wsreq, struct afb_event event);
-static void wsreq_subcall(struct afb_wsreq *wsreq, const char *api, const char *verb, struct json_object *args, void (*callback)(void*, int, struct json_object*), void *closure);
+static void wsreq_reply(struct afb_wsreq *wsreq, int iserror, json_object *obj);
/* declaration of websocket structure */
struct afb_ws_json1
@@ -75,12 +68,7 @@ struct afb_ws_json1
/* declaration of wsreq structure */
struct afb_wsreq
{
- /*
- * CAUTION: 'context' field should be the first because there
- * is an implicit convertion to struct afb_context
- */
- struct afb_context context;
- int refcount;
+ struct afb_xreq xreq;
struct afb_ws_json1 *aws;
struct afb_wsreq *next;
struct afb_wsj1_msg *msgj1;
@@ -92,23 +80,11 @@ static struct afb_wsj1_itf wsj1_itf = {
.on_call = (void*)aws_on_call
};
-/* interface for wsreq / afb_req */
-const struct afb_req_itf afb_ws_json1_req_itf = {
+/* interface for xreq */
+const struct afb_xreq_query_itf afb_ws_json1_xreq_itf = {
.json = (void*)wsreq_json,
- .get = (void*)wsreq_get,
- .success = (void*)wsreq_success,
- .fail = (void*)wsreq_fail,
- .raw = (void*)wsreq_raw,
- .send = (void*)wsreq_send,
- .context_get = (void*)afb_context_get,
- .context_set = (void*)afb_context_set,
- .addref = (void*)wsreq_addref,
- .unref = (void*)wsreq_unref,
- .session_close = (void*)afb_context_close,
- .session_set_LOA = (void*)afb_context_change_loa,
- .subscribe = (void*)wsreq_subscribe,
- .unsubscribe = (void*)wsreq_unsubscribe,
- .subcall = (void*)wsreq_subcall
+ .reply = (void*)wsreq_reply,
+ .unref = (void*)wsreq_destroy
};
/* the interface for events */
@@ -190,7 +166,6 @@ static void aws_on_hangup(struct afb_ws_json1 *ws, struct afb_wsj1 *wsj1)
static void aws_on_call(struct afb_ws_json1 *ws, const char *api, const char *verb, struct afb_wsj1_msg *msg)
{
- struct afb_req r;
struct afb_wsreq *wsreq;
DEBUG("received websocket request for %s/%s: %s", api, verb, afb_wsj1_msg_object_s(msg));
@@ -203,25 +178,28 @@ static void aws_on_call(struct afb_ws_json1 *ws, const char *api, const char *ve
}
/* init the context */
- afb_context_init(&wsreq->context, ws->session, afb_wsj1_msg_token(msg));
- if (!wsreq->context.invalidated)
- wsreq->context.validated = 1;
+ afb_context_init(&wsreq->xreq.context, ws->session, afb_wsj1_msg_token(msg));
+ if (!wsreq->xreq.context.invalidated)
+ wsreq->xreq.context.validated = 1;
if (ws->new_session != 0) {
- wsreq->context.created = 1;
+ wsreq->xreq.context.created = 1;
ws->new_session = 0;
}
/* fill and record the request */
afb_wsj1_msg_addref(msg);
wsreq->msgj1 = msg;
- wsreq->refcount = 1;
+ wsreq->xreq.refcount = 1;
+ wsreq->xreq.query = wsreq;
+ wsreq->xreq.queryitf = &afb_ws_json1_xreq_itf;
+ wsreq->xreq.api = api;
+ wsreq->xreq.verb = verb;
wsreq->aws = aws_addref(ws);
+ wsreq->xreq.listener = wsreq->aws->listener;
/* emits the call */
- r.closure = wsreq;
- r.itf = &afb_ws_json1_req_itf;
- afb_apis_call(r, &wsreq->context, api, verb);
- wsreq_unref(wsreq);
+ afb_apis_xcall(&wsreq->xreq);
+ afb_xreq_unref(&wsreq->xreq);
}
static void aws_on_event(struct afb_ws_json1 *aws, const char *event, int eventid, struct json_object *object)
@@ -237,19 +215,12 @@ static void aws_on_event(struct afb_ws_json1 *aws, const char *event, int eventi
****************************************************************
***************************************************************/
-static void wsreq_addref(struct afb_wsreq *wsreq)
-{
- wsreq->refcount++;
-}
-
-static void wsreq_unref(struct afb_wsreq *wsreq)
+static void wsreq_destroy(struct afb_wsreq *wsreq)
{
- if (--wsreq->refcount == 0) {
- afb_context_disconnect(&wsreq->context);
- afb_wsj1_msg_unref(wsreq->msgj1);
- aws_unref(wsreq->aws);
- free(wsreq);
- }
+ afb_context_disconnect(&wsreq->xreq.context);
+ afb_wsj1_msg_unref(wsreq->msgj1);
+ aws_unref(wsreq->aws);
+ free(wsreq);
}
static struct json_object *wsreq_json(struct afb_wsreq *wsreq)
@@ -257,55 +228,12 @@ static struct json_object *wsreq_json(struct afb_wsreq *wsreq)
return afb_wsj1_msg_object_j(wsreq->msgj1);
}
-static struct afb_arg wsreq_get(struct afb_wsreq *wsreq, const char *name)
-{
- return afb_msg_json_get_arg(wsreq_json(wsreq), name);
-}
-
-static void wsreq_fail(struct afb_wsreq *wsreq, const char *status, const char *info)
+static void wsreq_reply(struct afb_wsreq *wsreq, int iserror, json_object *obj)
{
int rc;
- rc = afb_wsj1_reply_error_j(wsreq->msgj1, afb_msg_json_reply_error(status, info, &wsreq->context, NULL), afb_context_sent_token(&wsreq->context));
+ rc = (iserror ? afb_wsj1_reply_error_j : afb_wsj1_reply_ok_j)(
+ wsreq->msgj1, obj, afb_context_sent_token(&wsreq->xreq.context));
if (rc)
- ERROR("Can't send fail reply: %m");
-}
-
-static void wsreq_success(struct afb_wsreq *wsreq, json_object *obj, const char *info)
-{
- int rc;
- rc = afb_wsj1_reply_ok_j(wsreq->msgj1, afb_msg_json_reply_ok(info, obj, &wsreq->context, NULL), afb_context_sent_token(&wsreq->context));
- if (rc)
- ERROR("Can't send success reply: %m");
-}
-
-static const char *wsreq_raw(struct afb_wsreq *wsreq, size_t *size)
-{
- const char *result = afb_wsj1_msg_object_s(wsreq->msgj1);
- if (size != NULL)
- *size = strlen(result);
- return result;
-}
-
-static void wsreq_send(struct afb_wsreq *wsreq, const char *buffer, size_t size)
-{
- int rc;
- rc = afb_wsj1_reply_ok_s(wsreq->msgj1, buffer, afb_context_sent_token(&wsreq->context));
- if (rc)
- ERROR("Can't send raw reply: %m");
-}
-
-static int wsreq_subscribe(struct afb_wsreq *wsreq, struct afb_event event)
-{
- return afb_evt_add_watch(wsreq->aws->listener, event);
-}
-
-static int wsreq_unsubscribe(struct afb_wsreq *wsreq, struct afb_event event)
-{
- return afb_evt_remove_watch(wsreq->aws->listener, event);
-}
-
-static void wsreq_subcall(struct afb_wsreq *wsreq, const char *api, const char *verb, struct json_object *args, void (*callback)(void*, int, struct json_object*), void *closure)
-{
- afb_subcall(&wsreq->context, api, verb, args, callback, closure, (struct afb_req){ .itf = &afb_ws_json1_req_itf, .closure = wsreq });
+ ERROR("Can't send reply: %m (was %s)", json_object_get_string(obj));
}
diff --git a/src/afb-xreq.c b/src/afb-xreq.c
index 5bd2068c..a8849910 100644
--- a/src/afb-xreq.c
+++ b/src/afb-xreq.c
@@ -108,7 +108,7 @@ static void xreq_success_cb(void *closure, struct json_object *obj, const char *
if (xreq->queryitf->success)
xreq->queryitf->success(xreq->query, obj, info);
else
- xreq->queryitf->reply(xreq->query, afb_msg_json_reply_ok(info, obj, &xreq->context, NULL));
+ xreq->queryitf->reply(xreq->query, 0, afb_msg_json_reply_ok(info, obj, &xreq->context, NULL));
}
}
@@ -122,7 +122,7 @@ static void xreq_fail_cb(void *closure, const char *status, const char *info)
if (xreq->queryitf->fail)
xreq->queryitf->fail(xreq->query, status, info);
else
- xreq->queryitf->reply(xreq->query, afb_msg_json_reply_error(status, info, &xreq->context, NULL));
+ xreq->queryitf->reply(xreq->query, 1, afb_msg_json_reply_error(status, info, &xreq->context, NULL));
}
}
diff --git a/src/afb-xreq.h b/src/afb-xreq.h
index 42824d7d..d2eae99c 100644
--- a/src/afb-xreq.h
+++ b/src/afb-xreq.h
@@ -31,7 +31,7 @@ struct afb_xreq_query_itf {
struct afb_arg (*get)(void *closure, const char *name);
void (*success)(void *closure, struct json_object *obj, const char *info);
void (*fail)(void *closure, const char *status, const char *info);
- void (*reply)(void *closure, struct json_object *obj);
+ void (*reply)(void *closure, int iserror, struct json_object *obj);
void (*unref)(void *closure);
int (*subscribe)(void *closure, struct afb_event event);
int (*unsubscribe)(void *closure, struct afb_event event);
@@ -45,8 +45,8 @@ struct afb_xreq_query_itf {
struct afb_xreq
{
struct afb_context context; /**< context of the request */
- char *api; /**< the requested API */
- char *verb; /**< the requested VERB */
+ const char *api; /**< the requested API */
+ const char *verb; /**< the requested VERB */
void *query; /**< closure for the query */
const struct afb_xreq_query_itf *queryitf;
int refcount; /**< current ref count */