* Copyright 2016 IoT.bzh
* Author: José Bollo <jose.bollo@iot.bzh>
*
- * Inspired by the work of
- *
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
#include <json.h>
#include <openssl/sha.h>
-/*
-#include <openssl/bio.h>
-#include <openssl/evp.h>
-*/
#include "websock.h"
-#include "local-def.h"
-
#include "afb-req-itf.h"
#include "afb-method.h"
#include "afb-hreq.h"
.on_close = (void*)aws_on_close,
.on_text = (void*)aws_on_content,
.on_binary = (void*)aws_on_content,
- .on_continue = (void*)aws_on_content
+ .on_continue = (void*)aws_on_content,
+ .on_extension = NULL
};
struct afb_wsreq
struct afb_websock *afb_websock_create(struct afb_hreq *hreq)
{
+ int fd;
struct afb_websock *result;
+ fd = MHD_get_connection_info(hreq->connection,
+ MHD_CONNECTION_INFO_CONNECTION_FD)->connect_fd;
+ fd = dup(fd);
+ if (fd < 0)
+ return NULL;
+
result = malloc(sizeof * result);
if (result == NULL)
goto error;
result->connection = hreq->connection;
- result->fd = MHD_get_connection_info(hreq->connection,
- MHD_CONNECTION_INFO_CONNECTION_FD)->connect_fd;
+ result->fd = fd;
result->context = ctxClientGet(afb_hreq_context(hreq));
if (result->context == NULL)
goto error2;
result->tokener = json_tokener_new();
if (result->tokener == NULL)
- goto error2;
+ goto error3;
- result->ws = websock_create(&aws_itf, result);
+ result->ws = websock_create_v13(&aws_itf, result);
if (result->ws == NULL)
- goto error3;
+ goto error4;
result->up = upoll_open(result->fd, result);
if (result->up == NULL)
- goto error4;
+ goto error5;
upoll_on_readable(result->up, (void*)aws_on_readable);
upoll_on_hangup(result->up, (void*)aws_disconnect);
return result;
-error4:
+error5:
websock_destroy(result->ws);
-error3:
+error4:
json_tokener_free(result->tokener);
+error3:
+ ctxClientPut(result->context);
error2:
free(result);
error:
+ close(fd);
return NULL;
}
static int aws_handle_json(struct afb_websock *aws, struct json_object *obj)
{
struct afb_req r;
- int count, num, rc;
+ int count, num;
struct json_object *type, *id, *name, *req, *token;
struct afb_wsreq *wsreq;
const char *api, *verb;
goto error;
verb = &api[lenapi+1];
for (lenverb = 0 ; verb[lenverb] && verb[lenverb] != '/' ; lenverb++);
- if (!lenverb || !verb[lenverb])
+ if (!lenverb || verb[lenverb])
goto error;
/* allocates the request data */
r.data = wsreq;
r.itf = &wsreq_itf;
- rc = afb_apis_handle(r, aws->context, api, lenapi, verb, lenverb);
- if (rc == 0)
- wsreq_fail(wsreq, "ail", "api not found");
+ afb_apis_call(r, aws->context, api, lenapi, verb, lenverb);
return 1;
error:
}
}
-
static struct afb_arg wsreq_get(struct afb_wsreq *wsreq, const char *name)
{
struct afb_arg arg;
if (json_object_object_get_ex(wsreq->request, name, &value)) {
arg.name = name;
arg.value = json_object_get_string(value);
+ arg.size = strlen(arg.value);
} else {
arg.name = NULL;
arg.value = NULL;
+ arg.size = 0;
}
- arg.size = 0;
- arg.is_file = 0;
+ arg.path = NULL;
return arg;
}
struct json_object_iterator end = json_object_iter_end(wsreq->request);
arg.size = 0;
- arg.is_file = 0;
+ arg.path = NULL;
while(!json_object_iter_equal(&it, &end)) {
arg.name = json_object_iter_peek_name(&it);
arg.value = json_object_get_string(json_object_iter_peek_value(&it));
/* emits the reply */
message = json_object_to_json_string(reply);
websock_text(wsreq->aws->ws, message, strlen(message));
+ json_object_put(reply);
/* TODO eliminates the wsreq */
}