Move tokens from sessions to requests
[src/app-framework-binder.git] / src / afb-ws-json1.c
index 743f5a5..a846170 100644 (file)
@@ -68,7 +68,6 @@ struct afb_ws_json1
        struct afb_wsj1 *wsj1;
        struct afb_cred *cred;
        struct afb_apiset *apiset;
-       int new_session;
 };
 
 /* declaration of wsreq structure */
@@ -124,7 +123,6 @@ struct afb_ws_json1 *afb_ws_json1_create(struct fdev *fdev, struct afb_apiset *a
        result->cleanup_closure = cleanup_closure;
        result->session = afb_session_addref(context->session);
        result->token = afb_token_addref(context->token);
-       result->new_session = context->created != 0;
        if (result->session == NULL)
                goto error2;
 
@@ -179,13 +177,33 @@ static void aws_on_hangup_cb(void *closure, struct afb_wsj1 *wsj1)
        afb_ws_json1_unref(ws);
 }
 
+static int aws_new_token(struct afb_ws_json1 *ws, const char *new_token_string)
+{
+       int rc;
+       struct afb_token *newtok, *oldtok;
+
+       rc = afb_token_get(&newtok, new_token_string);
+       if (rc >= 0) {
+               oldtok = ws->token;
+               ws->token = newtok;
+               afb_token_unref(oldtok);
+       }
+       return rc;
+}
+
 static void aws_on_call_cb(void *closure, const char *api, const char *verb, struct afb_wsj1_msg *msg)
 {
        struct afb_ws_json1 *ws = closure;
        struct afb_wsreq *wsreq;
+       const char *tok;
 
        DEBUG("received websocket request for %s/%s: %s", api, verb, afb_wsj1_msg_object_s(msg));
 
+       /* handle new tokens */
+       tok = afb_wsj1_msg_token(msg);
+       if (tok)
+               aws_new_token(ws, tok);
+
        /* allocate */
        wsreq = calloc(1, sizeof *wsreq);
        if (wsreq == NULL) {
@@ -195,13 +213,9 @@ static void aws_on_call_cb(void *closure, const char *api, const char *verb, str
 
        /* init the context */
        afb_xreq_init(&wsreq->xreq, &afb_ws_json1_xreq_itf);
-       afb_context_init(&wsreq->xreq.context, ws->session, afb_wsj1_msg_token(msg));
+       afb_context_init(&wsreq->xreq.context, ws->session, ws->token);
        if (!wsreq->xreq.context.invalidated)
                wsreq->xreq.context.validated = 1;
-       if (ws->new_session != 0) {
-               wsreq->xreq.context.created = 1;
-               ws->new_session = 0;
-       }
 
        /* fill and record the request */
        afb_wsj1_msg_addref(msg);