/*
- * Copyright (C) 2016, 2017 "IoT.bzh"
+ * Copyright (C) 2016, 2017, 2018 "IoT.bzh"
* Author: José Bollo <jose.bollo@iot.bzh>
*
* Licensed under the Apache License, Version 2.0 (the "License");
#include "afb-hreq.h"
#include "afb-websock.h"
#include "afb-ws-json1.h"
+#include "afb-fdev.h"
+#include "fdev.h"
/**************** WebSocket connection upgrade ****************************/
struct protodef
{
const char *name;
- void *(*create)(int fd, struct afb_apiset *apiset, struct afb_context *context, void (*cleanup)(void*), void *cleanup_closure);
+ void *(*create)(struct fdev *fdev, struct afb_apiset *apiset, struct afb_context *context, void (*cleanup)(void*), void *cleanup_closure);
};
static const struct protodef *search_proto(const struct protodef *protodefs, const char *protocols)
{
struct memo_websocket *memo = cls;
void *ws;
+ struct fdev *fdev;
- ws = memo->proto->create(sock, memo->apiset, &memo->hreq->xreq.context, close_websocket, urh);
- if (ws == NULL) {
+ fdev = afb_fdev_create(sock);
+ if (!fdev) {
/* TODO */
close_websocket(urh);
+ } else {
+ fdev_set_autoclose(fdev, 0);
+ ws = memo->proto->create(fdev, memo->apiset, &memo->hreq->xreq.context, close_websocket, urh);
+ if (ws == NULL) {
+ /* TODO */
+ close_websocket(urh);
+ }
}
+#if MHD_VERSION <= 0x00095900
afb_hreq_unref(memo->hreq);
+#endif
free(memo);
}
make_accept_value(key, acceptval);
MHD_add_response_header(response, sec_websocket_accept_s, acceptval);
MHD_add_response_header(response, sec_websocket_protocol_s, proto->name);
- MHD_add_response_header(response, MHD_HTTP_HEADER_CONNECTION, MHD_HTTP_HEADER_UPGRADE);
MHD_add_response_header(response, MHD_HTTP_HEADER_UPGRADE, websocket_s);
MHD_queue_response(con, MHD_HTTP_SWITCHING_PROTOCOLS, response);
MHD_destroy_response(response);