aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJosé Bollo <jose.bollo@iot.bzh>2016-04-06 15:26:04 +0200
committerJosé Bollo <jose.bollo@iot.bzh>2016-04-06 15:26:04 +0200
commitb75bbfd9bd96ad8bb7174a768ae70cf3e8c5af7a (patch)
tree0372d90b0db892cbf46caa80e18a12403cf6edc9 /src
parent46fa94d4edd7fa874e334ab51df34f7daca007ce (diff)
websocket first version works
Change-Id: I4db7d432ea5921636bb5033b8d31e91475cecc52 Signed-off-by: José Bollo <jose.bollo@iot.bzh>
Diffstat (limited to 'src')
-rw-r--r--src/afb-hreq.c40
-rw-r--r--src/afb-hsrv.c7
-rw-r--r--src/afb-websock.c13
-rw-r--r--src/websock.c11
-rw-r--r--src/websock.h1
5 files changed, 51 insertions, 21 deletions
diff --git a/src/afb-hreq.c b/src/afb-hreq.c
index ece9b399..474b90e8 100644
--- a/src/afb-hreq.c
+++ b/src/afb-hreq.c
@@ -184,7 +184,34 @@ static const char *magic_mimetype_fd(int fd)
#endif
-
+static const char *mimetype_fd_name(int fd, const char *filename)
+{
+ const char *result = NULL;
+
+#if defined(INFER_EXTENSION)
+ const char *extension = strrchr(filename, '.');
+ if (extension) {
+ static const char *const known[][2] = {
+ { ".js", "text/javascript" },
+ { ".html", "text/html" },
+ { NULL, NULL }
+ };
+ int i = 0;
+ while (known[i][0]) {
+ if (!strcasecmp(extension, known[i][0])) {
+ result = known[i][1];
+ break;
+ }
+ i++;
+ }
+ }
+#endif
+#if defined(USE_MAGIC_MIME_TYPE)
+ if (result == NULL)
+ result = magic_mimetype_fd(fd);
+#endif
+ return result;
+}
void afb_hreq_free(struct afb_hreq *hreq)
{
@@ -257,6 +284,7 @@ int afb_hreq_reply_file_if_exist(struct afb_hreq *hreq, int dirfd, const char *f
char etag[1 + 2 * sizeof(int)];
const char *inm;
struct MHD_Response *response;
+ const char *mimetype;
/* Opens the file or directory */
if (filename[0]) {
@@ -336,14 +364,10 @@ int afb_hreq_reply_file_if_exist(struct afb_hreq *hreq, int dirfd, const char *f
response = MHD_create_response_from_fd((size_t) st.st_size, fd);
status = MHD_HTTP_OK;
-#if defined(USE_MAGIC_MIME_TYPE)
/* set the type */
- {
- const char *mimetype = magic_mimetype_fd(fd);
- if (mimetype != NULL)
- MHD_add_response_header(response, MHD_HTTP_HEADER_CONTENT_TYPE, mimetype);
- }
-#endif
+ mimetype = mimetype_fd_name(fd, filename);
+ if (mimetype != NULL)
+ MHD_add_response_header(response, MHD_HTTP_HEADER_CONTENT_TYPE, mimetype);
}
/* fills the value and send */
diff --git a/src/afb-hsrv.c b/src/afb-hsrv.c
index 64cea9d5..977aea63 100644
--- a/src/afb-hsrv.c
+++ b/src/afb-hsrv.c
@@ -152,11 +152,8 @@ static int afb_hreq_websocket_switch(struct afb_hreq *hreq, void *data)
if (!later) {
struct afb_websock *ws = afb_websock_create(hreq);
- if (ws == NULL) {
- /* TODO */
- } else {
- /* TODO */
- }
+ if (ws != NULL)
+ hreq->upgrade = 1;
}
return 1;
}
diff --git a/src/afb-websock.c b/src/afb-websock.c
index dab4aa09..797724ce 100644
--- a/src/afb-websock.c
+++ b/src/afb-websock.c
@@ -220,15 +220,21 @@ static const struct afb_req_itf wsreq_itf = {
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;
@@ -255,6 +261,7 @@ error3:
error2:
free(result);
error:
+ close(fd);
return NULL;
}
@@ -346,7 +353,7 @@ static int aws_handle_json(struct afb_websock *aws, struct json_object *obj)
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 */
diff --git a/src/websock.c b/src/websock.c
index 41e47a0a..22e91be9 100644
--- a/src/websock.c
+++ b/src/websock.c
@@ -170,12 +170,12 @@ void websock_pong(struct websock *ws)
void websock_text(struct websock *ws, const char *text, size_t length)
{
- websock_send(ws, OPCODE_TEXT, NULL, 0);
+ websock_send(ws, OPCODE_TEXT, text, length);
}
void websock_binary(struct websock *ws, const void *data, size_t length)
{
- websock_send(ws, OPCODE_BINARY, NULL, 0);
+ websock_send(ws, OPCODE_BINARY, data, length);
}
static int read_header(struct websock *ws)
@@ -192,7 +192,7 @@ static int read_header(struct websock *ws)
int websock_dispatch(struct websock *ws)
{
- loop:
+loop:
switch (ws->state) {
case STATE_INIT:
ws->lenhead = 0;
@@ -201,7 +201,7 @@ int websock_dispatch(struct websock *ws)
case STATE_START:
/* read the header */
- if (!read_header(ws))
+ if (read_header(ws))
return -1;
else if (ws->lenhead < ws->szhead)
return 0;
@@ -262,7 +262,7 @@ int websock_dispatch(struct websock *ws)
case STATE_LENGTH:
/* continue to read the header */
- if (!read_header(ws))
+ if (read_header(ws))
return -1;
else if (ws->lenhead < ws->szhead)
return 0;
@@ -409,6 +409,7 @@ struct websock *websock_create(const struct websock_itf *itf, void *closure)
if (result) {
result->itf = itf;
result->closure = closure;
+ result->maxlength = 65000;
}
return result;
}
diff --git a/src/websock.h b/src/websock.h
index b67f36e1..235f9910 100644
--- a/src/websock.h
+++ b/src/websock.h
@@ -63,3 +63,4 @@ int websock_dispatch(struct websock *ws);
struct websock *websock_create(const struct websock_itf *itf, void *closure);
void websock_destroy(struct websock *ws);
+