From 75cdd93001c3900f6750b8893a6f5bdb4a2b59d6 Mon Sep 17 00:00:00 2001 From: Flyinghead Date: Sun, 7 Jul 2019 23:40:13 +0200 Subject: [PATCH] remove webui, libwebsocket --- WorkDir/webui/debugger.html | 397 ------ WorkDir/webui/favicon.ico | Bin 1406 -> 0 bytes core/core.mk | 9 - core/deps/ifaddrs/README.md | 6 - core/deps/ifaddrs/ifaddrs.c | 658 --------- core/deps/ifaddrs/ifaddrs.h | 56 - core/deps/libwebsocket/LICENSE | 526 -------- core/deps/libwebsocket/README | 20 - core/deps/libwebsocket/base64-decode.c | 93 -- core/deps/libwebsocket/client-handshake.c | 441 ------ core/deps/libwebsocket/client-parser.c | 402 ------ core/deps/libwebsocket/client.c | 953 ------------- core/deps/libwebsocket/config.h | 4 - core/deps/libwebsocket/context.c | 348 ----- .../libwebsocket/extension-deflate-frame.c | 294 ---- .../libwebsocket/extension-deflate-frame.h | 25 - .../libwebsocket/extension-deflate-stream.c | 166 --- .../libwebsocket/extension-deflate-stream.h | 20 - core/deps/libwebsocket/extension.c | 206 --- core/deps/libwebsocket/handshake.c | 171 --- core/deps/libwebsocket/lextable.h | 287 ---- core/deps/libwebsocket/libwebsockets.c | 766 ----------- core/deps/libwebsocket/libwebsockets.h | 1190 ----------------- core/deps/libwebsocket/lws-plat-unix.c | 396 ------ core/deps/libwebsocket/lws-plat-win.c | 365 ----- core/deps/libwebsocket/lws_config.h | 174 --- core/deps/libwebsocket/output.c | 571 -------- core/deps/libwebsocket/parsers.c | 973 -------------- core/deps/libwebsocket/pollfd.c | 239 ---- .../deps/libwebsocket/private-libwebsockets.h | 916 ------------- core/deps/libwebsocket/server-handshake.c | 280 ---- core/deps/libwebsocket/server.c | 868 ------------ core/deps/libwebsocket/service.c | 514 ------- core/deps/libwebsocket/sha-1.c | 299 ----- core/webui/server.cpp | 877 ------------ core/webui/server.h | 1 - .../reicast/src/main/jni/Android.mk | 1 - .../reicast-ios.xcodeproj/project.pbxproj | 2 - .../reicast-osx.xcodeproj/project.pbxproj | 4 - shell/cmake/CMakeLists.txt | 8 - shell/cmake/config.cmake | 27 +- shell/emscripten/Makefile | 2 +- shell/linux/Makefile | 18 +- 43 files changed, 13 insertions(+), 13560 deletions(-) delete mode 100644 WorkDir/webui/debugger.html delete mode 100644 WorkDir/webui/favicon.ico delete mode 100644 core/deps/ifaddrs/README.md delete mode 100644 core/deps/ifaddrs/ifaddrs.c delete mode 100644 core/deps/ifaddrs/ifaddrs.h delete mode 100644 core/deps/libwebsocket/LICENSE delete mode 100644 core/deps/libwebsocket/README delete mode 100644 core/deps/libwebsocket/base64-decode.c delete mode 100644 core/deps/libwebsocket/client-handshake.c delete mode 100644 core/deps/libwebsocket/client-parser.c delete mode 100644 core/deps/libwebsocket/client.c delete mode 100644 core/deps/libwebsocket/config.h delete mode 100644 core/deps/libwebsocket/context.c delete mode 100644 core/deps/libwebsocket/extension-deflate-frame.c delete mode 100644 core/deps/libwebsocket/extension-deflate-frame.h delete mode 100644 core/deps/libwebsocket/extension-deflate-stream.c delete mode 100644 core/deps/libwebsocket/extension-deflate-stream.h delete mode 100644 core/deps/libwebsocket/extension.c delete mode 100644 core/deps/libwebsocket/handshake.c delete mode 100644 core/deps/libwebsocket/lextable.h delete mode 100644 core/deps/libwebsocket/libwebsockets.c delete mode 100644 core/deps/libwebsocket/libwebsockets.h delete mode 100644 core/deps/libwebsocket/lws-plat-unix.c delete mode 100644 core/deps/libwebsocket/lws-plat-win.c delete mode 100644 core/deps/libwebsocket/lws_config.h delete mode 100644 core/deps/libwebsocket/output.c delete mode 100644 core/deps/libwebsocket/parsers.c delete mode 100644 core/deps/libwebsocket/pollfd.c delete mode 100644 core/deps/libwebsocket/private-libwebsockets.h delete mode 100644 core/deps/libwebsocket/server-handshake.c delete mode 100644 core/deps/libwebsocket/server.c delete mode 100644 core/deps/libwebsocket/service.c delete mode 100644 core/deps/libwebsocket/sha-1.c delete mode 100644 core/webui/server.cpp delete mode 100644 core/webui/server.h diff --git a/WorkDir/webui/debugger.html b/WorkDir/webui/debugger.html deleted file mode 100644 index 13a738b6c..000000000 --- a/WorkDir/webui/debugger.html +++ /dev/null @@ -1,397 +0,0 @@ - - - - - Minimal Websocket test app - - - - -
-
- -
- -
-
Detected Browser:
...
- -
- -
-
libwebsockets "dumb-increment-protocol"
-
- - - - - -
Not initialized
-
-The incrementing number is coming from the server and is individual for -each connection to the server... try opening a second browser window. -

-The button zeros just this connection's number. -

- -
-
-
-
-
libwebsockets "lws-mirror-protocol"
-
-Use the mouse to draw on the canvas below -- all other browser windows open -on this page see your drawing in realtime and you can see any of theirs as -well. -

-The lws-mirror protocol doesn't interpret what is being sent to it, it just -re-sends it to every other websocket it has a connection with using that -protocol, including the guy who sent the packet. -

-libwebsockets-test-client joins in by spamming circles on to this shared canvas when -run. -
- - - - - - - - -
Drawing color: - -
Not initialized
-
-
-
- -
-Looking for support? http://libwebsockets.org
-Join the mailing list: ​http://ml.libwebsockets.org/mailman/listinfo/libwebsockets - -
- -
- - - - - diff --git a/WorkDir/webui/favicon.ico b/WorkDir/webui/favicon.ico deleted file mode 100644 index c0cc2e3dff34012ba3d4a7848a7ed17579788ec5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1406 zcmZQzU<5(|0R}M0U}azs1F|%L7$l?s#Ec9aKoZP=&`9i!<^REA8>%80(yxAC$j<-A zkb5S8;qL6446ipNFl>5#fuVR6L=8goC~GtXMnhmYga9MSfQgBTk&TUw5$JocUP63y z3phA97+G0a8QIy{!BT|y==xb$SQt4uIT@LmnZZ(o_~`mk`Tv1M8w?+DXJCL~kQj^& JqOtKoVgQl$ETjMc diff --git a/core/core.mk b/core/core.mk index 82ff5c045..b7970ce95 100755 --- a/core/core.mk +++ b/core/core.mk @@ -13,15 +13,6 @@ RZDCY_MODULES := cfg/ hw/arm7/ hw/aica/ hw/holly/ hw/ hw/gdrom/ hw/maple/ \ deps/libelf/ deps/chdpsr/ arm_emitter/ rend/ reios/ deps/libpng/ deps/xbrz/ \ deps/xxhash/ deps/libzip/ deps/imgui/ archive/ input/ log/ -ifdef WEBUI - RZDCY_MODULES += webui/ - RZDCY_MODULES += deps/libwebsocket/ - - ifdef FOR_ANDROID - RZDCY_MODULES += deps/ifaddrs/ - endif -endif - ifndef NOT_ARM RZDCY_MODULES += rec-ARM/ endif diff --git a/core/deps/ifaddrs/README.md b/core/deps/ifaddrs/README.md deleted file mode 100644 index dc05bdfd3..000000000 --- a/core/deps/ifaddrs/README.md +++ /dev/null @@ -1,6 +0,0 @@ -android-ifaddrs -=============== - -An implementation of getifaddrs() for Android, since the NDK does not natively support it. - -Works just like you would expect on regular Linux. License information is present in each file (BSD license). diff --git a/core/deps/ifaddrs/ifaddrs.c b/core/deps/ifaddrs/ifaddrs.c deleted file mode 100644 index 916f9c2fd..000000000 --- a/core/deps/ifaddrs/ifaddrs.c +++ /dev/null @@ -1,658 +0,0 @@ -/* -Copyright (c) 2013, Kenneth MacKay -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "ifaddrs.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -typedef struct NetlinkList -{ - struct NetlinkList *m_next; - struct nlmsghdr *m_data; - unsigned int m_size; -} NetlinkList; - -static int netlink_socket(void) -{ - int l_socket = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE); - if(l_socket < 0) - { - return -1; - } - - struct sockaddr_nl l_addr; - memset(&l_addr, 0, sizeof(l_addr)); - l_addr.nl_family = AF_NETLINK; - if(bind(l_socket, (struct sockaddr *)&l_addr, sizeof(l_addr)) < 0) - { - close(l_socket); - return -1; - } - - return l_socket; -} - -static int netlink_send(int p_socket, int p_request) -{ - char l_buffer[NLMSG_ALIGN(sizeof(struct nlmsghdr)) + NLMSG_ALIGN(sizeof(struct rtgenmsg))]; - memset(l_buffer, 0, sizeof(l_buffer)); - struct nlmsghdr *l_hdr = (struct nlmsghdr *)l_buffer; - struct rtgenmsg *l_msg = (struct rtgenmsg *)NLMSG_DATA(l_hdr); - - l_hdr->nlmsg_len = NLMSG_LENGTH(sizeof(*l_msg)); - l_hdr->nlmsg_type = p_request; - l_hdr->nlmsg_flags = NLM_F_ROOT | NLM_F_MATCH | NLM_F_REQUEST; - l_hdr->nlmsg_pid = 0; - l_hdr->nlmsg_seq = p_socket; - l_msg->rtgen_family = AF_UNSPEC; - - struct sockaddr_nl l_addr; - memset(&l_addr, 0, sizeof(l_addr)); - l_addr.nl_family = AF_NETLINK; - return (sendto(p_socket, l_hdr, l_hdr->nlmsg_len, 0, (struct sockaddr *)&l_addr, sizeof(l_addr))); -} - -static int netlink_recv(int p_socket, void *p_buffer, size_t p_len) -{ - struct msghdr l_msg; - struct iovec l_iov = { p_buffer, p_len }; - struct sockaddr_nl l_addr; - int l_result; - - for(;;) - { - l_msg.msg_name = (void *)&l_addr; - l_msg.msg_namelen = sizeof(l_addr); - l_msg.msg_iov = &l_iov; - l_msg.msg_iovlen = 1; - l_msg.msg_control = NULL; - l_msg.msg_controllen = 0; - l_msg.msg_flags = 0; - int l_result = recvmsg(p_socket, &l_msg, 0); - - if(l_result < 0) - { - if(errno == EINTR) - { - continue; - } - return -2; - } - - if(l_msg.msg_flags & MSG_TRUNC) - { // buffer was too small - return -1; - } - return l_result; - } -} - -static struct nlmsghdr *getNetlinkResponse(int p_socket, int *p_size, int *p_done) -{ - size_t l_size = 4096; - void *l_buffer = NULL; - - for(;;) - { - free(l_buffer); - l_buffer = malloc(l_size); - if (l_buffer == NULL) - { - return NULL; - } - - int l_read = netlink_recv(p_socket, l_buffer, l_size); - *p_size = l_read; - if(l_read == -2) - { - free(l_buffer); - return NULL; - } - if(l_read >= 0) - { - pid_t l_pid = getpid(); - struct nlmsghdr *l_hdr; - for(l_hdr = (struct nlmsghdr *)l_buffer; NLMSG_OK(l_hdr, (unsigned int)l_read); l_hdr = (struct nlmsghdr *)NLMSG_NEXT(l_hdr, l_read)) - { - if((pid_t)l_hdr->nlmsg_pid != l_pid || (int)l_hdr->nlmsg_seq != p_socket) - { - continue; - } - - if(l_hdr->nlmsg_type == NLMSG_DONE) - { - *p_done = 1; - break; - } - - if(l_hdr->nlmsg_type == NLMSG_ERROR) - { - free(l_buffer); - return NULL; - } - } - return l_buffer; - } - - l_size *= 2; - } -} - -static NetlinkList *newListItem(struct nlmsghdr *p_data, unsigned int p_size) -{ - NetlinkList *l_item = malloc(sizeof(NetlinkList)); - if (l_item == NULL) - { - return NULL; - } - - l_item->m_next = NULL; - l_item->m_data = p_data; - l_item->m_size = p_size; - return l_item; -} - -static void freeResultList(NetlinkList *p_list) -{ - NetlinkList *l_cur; - while(p_list) - { - l_cur = p_list; - p_list = p_list->m_next; - free(l_cur->m_data); - free(l_cur); - } -} - -static NetlinkList *getResultList(int p_socket, int p_request) -{ - if(netlink_send(p_socket, p_request) < 0) - { - return NULL; - } - - NetlinkList *l_list = NULL; - NetlinkList *l_end = NULL; - int l_size; - int l_done = 0; - while(!l_done) - { - struct nlmsghdr *l_hdr = getNetlinkResponse(p_socket, &l_size, &l_done); - if(!l_hdr) - { // error - freeResultList(l_list); - return NULL; - } - - NetlinkList *l_item = newListItem(l_hdr, l_size); - if (!l_item) - { - freeResultList(l_list); - return NULL; - } - if(!l_list) - { - l_list = l_item; - } - else - { - l_end->m_next = l_item; - } - l_end = l_item; - } - return l_list; -} - -static size_t maxSize(size_t a, size_t b) -{ - return (a > b ? a : b); -} - -static size_t calcAddrLen(sa_family_t p_family, int p_dataSize) -{ - switch(p_family) - { - case AF_INET: - return sizeof(struct sockaddr_in); - case AF_INET6: - return sizeof(struct sockaddr_in6); - case AF_PACKET: - return maxSize(sizeof(struct sockaddr_ll), offsetof(struct sockaddr_ll, sll_addr) + p_dataSize); - default: - return maxSize(sizeof(struct sockaddr), offsetof(struct sockaddr, sa_data) + p_dataSize); - } -} - -static void makeSockaddr(sa_family_t p_family, struct sockaddr *p_dest, void *p_data, size_t p_size) -{ - switch(p_family) - { - case AF_INET: - memcpy(&((struct sockaddr_in*)p_dest)->sin_addr, p_data, p_size); - break; - case AF_INET6: - memcpy(&((struct sockaddr_in6*)p_dest)->sin6_addr, p_data, p_size); - break; - case AF_PACKET: - memcpy(((struct sockaddr_ll*)p_dest)->sll_addr, p_data, p_size); - ((struct sockaddr_ll*)p_dest)->sll_halen = p_size; - break; - default: - memcpy(p_dest->sa_data, p_data, p_size); - break; - } - p_dest->sa_family = p_family; -} - -static void addToEnd(struct ifaddrs **p_resultList, struct ifaddrs *p_entry) -{ - if(!*p_resultList) - { - *p_resultList = p_entry; - } - else - { - struct ifaddrs *l_cur = *p_resultList; - while(l_cur->ifa_next) - { - l_cur = l_cur->ifa_next; - } - l_cur->ifa_next = p_entry; - } -} - -static int interpretLink(struct nlmsghdr *p_hdr, struct ifaddrs **p_resultList) -{ - struct ifinfomsg *l_info = (struct ifinfomsg *)NLMSG_DATA(p_hdr); - - size_t l_nameSize = 0; - size_t l_addrSize = 0; - size_t l_dataSize = 0; - - size_t l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifinfomsg)); - struct rtattr *l_rta; - for(l_rta = IFLA_RTA(l_info); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize)) - { - void *l_rtaData = RTA_DATA(l_rta); - size_t l_rtaDataSize = RTA_PAYLOAD(l_rta); - switch(l_rta->rta_type) - { - case IFLA_ADDRESS: - case IFLA_BROADCAST: - l_addrSize += NLMSG_ALIGN(calcAddrLen(AF_PACKET, l_rtaDataSize)); - break; - case IFLA_IFNAME: - l_nameSize += NLMSG_ALIGN(l_rtaSize + 1); - break; - case IFLA_STATS: - l_dataSize += NLMSG_ALIGN(l_rtaSize); - break; - default: - break; - } - } - - struct ifaddrs *l_entry = malloc(sizeof(struct ifaddrs) + sizeof(int) + l_nameSize + l_addrSize + l_dataSize); - if (l_entry == NULL) - { - return -1; - } - memset(l_entry, 0, sizeof(struct ifaddrs)); - l_entry->ifa_name = ""; - - char *l_index = ((char *)l_entry) + sizeof(struct ifaddrs); - char *l_name = l_index + sizeof(int); - char *l_addr = l_name + l_nameSize; - char *l_data = l_addr + l_addrSize; - - // save the interface index so we can look it up when handling the addresses. - memcpy(l_index, &l_info->ifi_index, sizeof(int)); - - l_entry->ifa_flags = l_info->ifi_flags; - - l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifinfomsg)); - for(l_rta = IFLA_RTA(l_info); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize)) - { - void *l_rtaData = RTA_DATA(l_rta); - size_t l_rtaDataSize = RTA_PAYLOAD(l_rta); - switch(l_rta->rta_type) - { - case IFLA_ADDRESS: - case IFLA_BROADCAST: - { - size_t l_addrLen = calcAddrLen(AF_PACKET, l_rtaDataSize); - makeSockaddr(AF_PACKET, (struct sockaddr *)l_addr, l_rtaData, l_rtaDataSize); - ((struct sockaddr_ll *)l_addr)->sll_ifindex = l_info->ifi_index; - ((struct sockaddr_ll *)l_addr)->sll_hatype = l_info->ifi_type; - if(l_rta->rta_type == IFLA_ADDRESS) - { - l_entry->ifa_addr = (struct sockaddr *)l_addr; - } - else - { - l_entry->ifa_broadaddr = (struct sockaddr *)l_addr; - } - l_addr += NLMSG_ALIGN(l_addrLen); - break; - } - case IFLA_IFNAME: - strncpy(l_name, l_rtaData, l_rtaDataSize); - l_name[l_rtaDataSize] = '\0'; - l_entry->ifa_name = l_name; - break; - case IFLA_STATS: - memcpy(l_data, l_rtaData, l_rtaDataSize); - l_entry->ifa_data = l_data; - break; - default: - break; - } - } - - addToEnd(p_resultList, l_entry); - return 0; -} - -static struct ifaddrs *findInterface(int p_index, struct ifaddrs **p_links, int p_numLinks) -{ - int l_num = 0; - struct ifaddrs *l_cur = *p_links; - while(l_cur && l_num < p_numLinks) - { - char *l_indexPtr = ((char *)l_cur) + sizeof(struct ifaddrs); - int l_index; - memcpy(&l_index, l_indexPtr, sizeof(int)); - if(l_index == p_index) - { - return l_cur; - } - - l_cur = l_cur->ifa_next; - ++l_num; - } - return NULL; -} - -static int interpretAddr(struct nlmsghdr *p_hdr, struct ifaddrs **p_resultList, int p_numLinks) -{ - struct ifaddrmsg *l_info = (struct ifaddrmsg *)NLMSG_DATA(p_hdr); - struct ifaddrs *l_interface = findInterface(l_info->ifa_index, p_resultList, p_numLinks); - - size_t l_nameSize = 0; - size_t l_addrSize = 0; - - int l_addedNetmask = 0; - - size_t l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifaddrmsg)); - struct rtattr *l_rta; - for(l_rta = IFLA_RTA(l_info); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize)) - { - void *l_rtaData = RTA_DATA(l_rta); - size_t l_rtaDataSize = RTA_PAYLOAD(l_rta); - if(l_info->ifa_family == AF_PACKET) - { - continue; - } - - switch(l_rta->rta_type) - { - case IFA_ADDRESS: - case IFA_LOCAL: - if((l_info->ifa_family == AF_INET || l_info->ifa_family == AF_INET6) && !l_addedNetmask) - { // make room for netmask - l_addrSize += NLMSG_ALIGN(calcAddrLen(l_info->ifa_family, l_rtaDataSize)); - l_addedNetmask = 1; - } - case IFA_BROADCAST: - l_addrSize += NLMSG_ALIGN(calcAddrLen(l_info->ifa_family, l_rtaDataSize)); - break; - case IFA_LABEL: - l_nameSize += NLMSG_ALIGN(l_rtaSize + 1); - break; - default: - break; - } - } - - struct ifaddrs *l_entry = malloc(sizeof(struct ifaddrs) + l_nameSize + l_addrSize); - if (l_entry == NULL) - { - return -1; - } - memset(l_entry, 0, sizeof(struct ifaddrs)); - l_entry->ifa_name = (l_interface ? l_interface->ifa_name : ""); - - char *l_name = ((char *)l_entry) + sizeof(struct ifaddrs); - char *l_addr = l_name + l_nameSize; - - l_entry->ifa_flags = l_info->ifa_flags; - if(l_interface) - { - l_entry->ifa_flags |= l_interface->ifa_flags; - } - - l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifaddrmsg)); - for(l_rta = IFLA_RTA(l_info); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize)) - { - void *l_rtaData = RTA_DATA(l_rta); - size_t l_rtaDataSize = RTA_PAYLOAD(l_rta); - switch(l_rta->rta_type) - { - case IFA_ADDRESS: - case IFA_BROADCAST: - case IFA_LOCAL: - { - size_t l_addrLen = calcAddrLen(l_info->ifa_family, l_rtaDataSize); - makeSockaddr(l_info->ifa_family, (struct sockaddr *)l_addr, l_rtaData, l_rtaDataSize); - if(l_info->ifa_family == AF_INET6) - { - if(IN6_IS_ADDR_LINKLOCAL((struct in6_addr *)l_rtaData) || IN6_IS_ADDR_MC_LINKLOCAL((struct in6_addr *)l_rtaData)) - { - ((struct sockaddr_in6 *)l_addr)->sin6_scope_id = l_info->ifa_index; - } - } - - if(l_rta->rta_type == IFA_ADDRESS) - { // apparently in a point-to-point network IFA_ADDRESS contains the dest address and IFA_LOCAL contains the local address - if(l_entry->ifa_addr) - { - l_entry->ifa_dstaddr = (struct sockaddr *)l_addr; - } - else - { - l_entry->ifa_addr = (struct sockaddr *)l_addr; - } - } - else if(l_rta->rta_type == IFA_LOCAL) - { - if(l_entry->ifa_addr) - { - l_entry->ifa_dstaddr = l_entry->ifa_addr; - } - l_entry->ifa_addr = (struct sockaddr *)l_addr; - } - else - { - l_entry->ifa_broadaddr = (struct sockaddr *)l_addr; - } - l_addr += NLMSG_ALIGN(l_addrLen); - break; - } - case IFA_LABEL: - strncpy(l_name, l_rtaData, l_rtaDataSize); - l_name[l_rtaDataSize] = '\0'; - l_entry->ifa_name = l_name; - break; - default: - break; - } - } - - if(l_entry->ifa_addr && (l_entry->ifa_addr->sa_family == AF_INET || l_entry->ifa_addr->sa_family == AF_INET6)) - { - unsigned l_maxPrefix = (l_entry->ifa_addr->sa_family == AF_INET ? 32 : 128); - unsigned l_prefix = (l_info->ifa_prefixlen > l_maxPrefix ? l_maxPrefix : l_info->ifa_prefixlen); - char l_mask[16] = {0}; - unsigned i; - for(i=0; i<(l_prefix/8); ++i) - { - l_mask[i] = 0xff; - } - if(l_prefix % 8) - { - l_mask[i] = 0xff << (8 - (l_prefix % 8)); - } - - makeSockaddr(l_entry->ifa_addr->sa_family, (struct sockaddr *)l_addr, l_mask, l_maxPrefix / 8); - l_entry->ifa_netmask = (struct sockaddr *)l_addr; - } - - addToEnd(p_resultList, l_entry); - return 0; -} - -static int interpretLinks(int p_socket, NetlinkList *p_netlinkList, struct ifaddrs **p_resultList) -{ - int l_numLinks = 0; - pid_t l_pid = getpid(); - for(; p_netlinkList; p_netlinkList = p_netlinkList->m_next) - { - unsigned int l_nlsize = p_netlinkList->m_size; - struct nlmsghdr *l_hdr; - for(l_hdr = p_netlinkList->m_data; NLMSG_OK(l_hdr, l_nlsize); l_hdr = NLMSG_NEXT(l_hdr, l_nlsize)) - { - if((pid_t)l_hdr->nlmsg_pid != l_pid || (int)l_hdr->nlmsg_seq != p_socket) - { - continue; - } - - if(l_hdr->nlmsg_type == NLMSG_DONE) - { - break; - } - - if(l_hdr->nlmsg_type == RTM_NEWLINK) - { - if(interpretLink(l_hdr, p_resultList) == -1) - { - return -1; - } - ++l_numLinks; - } - } - } - return l_numLinks; -} - -static int interpretAddrs(int p_socket, NetlinkList *p_netlinkList, struct ifaddrs **p_resultList, int p_numLinks) -{ - pid_t l_pid = getpid(); - for(; p_netlinkList; p_netlinkList = p_netlinkList->m_next) - { - unsigned int l_nlsize = p_netlinkList->m_size; - struct nlmsghdr *l_hdr; - for(l_hdr = p_netlinkList->m_data; NLMSG_OK(l_hdr, l_nlsize); l_hdr = NLMSG_NEXT(l_hdr, l_nlsize)) - { - if((pid_t)l_hdr->nlmsg_pid != l_pid || (int)l_hdr->nlmsg_seq != p_socket) - { - continue; - } - - if(l_hdr->nlmsg_type == NLMSG_DONE) - { - break; - } - - if(l_hdr->nlmsg_type == RTM_NEWADDR) - { - if (interpretAddr(l_hdr, p_resultList, p_numLinks) == -1) - { - return -1; - } - } - } - } - return 0; -} - -int getifaddrs(struct ifaddrs **ifap) -{ - if(!ifap) - { - return -1; - } - *ifap = NULL; - - int l_socket = netlink_socket(); - if(l_socket < 0) - { - return -1; - } - - NetlinkList *l_linkResults = getResultList(l_socket, RTM_GETLINK); - if(!l_linkResults) - { - close(l_socket); - return -1; - } - - NetlinkList *l_addrResults = getResultList(l_socket, RTM_GETADDR); - if(!l_addrResults) - { - close(l_socket); - freeResultList(l_linkResults); - return -1; - } - - int l_result = 0; - int l_numLinks = interpretLinks(l_socket, l_linkResults, ifap); - if(l_numLinks == -1 || interpretAddrs(l_socket, l_addrResults, ifap, l_numLinks) == -1) - { - l_result = -1; - } - - freeResultList(l_linkResults); - freeResultList(l_addrResults); - close(l_socket); - return l_result; -} - -void freeifaddrs(struct ifaddrs *ifa) -{ - struct ifaddrs *l_cur; - while(ifa) - { - l_cur = ifa; - ifa = ifa->ifa_next; - free(l_cur); - } -} diff --git a/core/deps/ifaddrs/ifaddrs.h b/core/deps/ifaddrs/ifaddrs.h deleted file mode 100644 index 7c044c0bc..000000000 --- a/core/deps/ifaddrs/ifaddrs.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 1995, 1999 - * Berkeley Software Design, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * THIS SOFTWARE IS PROVIDED BY Berkeley Software Design, Inc. ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL Berkeley Software Design, Inc. BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * BSDI ifaddrs.h,v 2.5 2000/02/23 14:51:59 dab Exp - */ - -#ifndef _IFADDRS_H_ -#define _IFADDRS_H_ - -struct ifaddrs { - struct ifaddrs *ifa_next; - char *ifa_name; - unsigned int ifa_flags; - struct sockaddr *ifa_addr; - struct sockaddr *ifa_netmask; - struct sockaddr *ifa_dstaddr; - void *ifa_data; -}; - -/* - * This may have been defined in . Note that if is - * to be included it must be included before this header file. - */ -#ifndef ifa_broadaddr -#define ifa_broadaddr ifa_dstaddr /* broadcast address interface */ -#endif - -#ifdef _cplusplus -extern "C" { -#endif -extern int getifaddrs(struct ifaddrs **ifap); -extern void freeifaddrs(struct ifaddrs *ifa); -#ifdef _cplusplus -} -#endif - -#endif diff --git a/core/deps/libwebsocket/LICENSE b/core/deps/libwebsocket/LICENSE deleted file mode 100644 index 7c8986558..000000000 --- a/core/deps/libwebsocket/LICENSE +++ /dev/null @@ -1,526 +0,0 @@ -Libwebsockets and included programs are provided under the terms of the GNU -Library General Public License (LGPL) 2.1, with the following exceptions: - -1) Static linking of programs with the libwebsockets library does not -constitute a derivative work and does not require the author to provide -source code for the program, use the shared libwebsockets libraries, or -link their program against a user-supplied version of libwebsockets. - -If you link the program to a modified version of libwebsockets, then the -changes to libwebsockets must be provided under the terms of the LGPL in -sections 1, 2, and 4. - -2) You do not have to provide a copy of the libwebsockets license with -programs that are linked to the libwebsockets library, nor do you have to -identify the libwebsockets license in your program or documentation as -required by section 6 of the LGPL. - -However, programs must still identify their use of libwebsockets. The -following example statement can be included in user documentation to -satisfy this requirement: - -"[program] is based in part on the work of the libwebsockets project -(http://libwebsockets.org)" - - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! diff --git a/core/deps/libwebsocket/README b/core/deps/libwebsocket/README deleted file mode 100644 index 37436e83f..000000000 --- a/core/deps/libwebsocket/README +++ /dev/null @@ -1,20 +0,0 @@ -This is the libwebsockets C library for lightweight websocket clients and -servers. For support, visit - - http://libwebsockets.org - -and consider joining the project mailing list at - - http://ml.libwebsockets.org/mailman/listinfo/libwebsockets - -You can get the latest version of the library from git - -http://git.libwebsockets.org -https://github.com/warmcat/libwebsockets - -for more information: - -README.build - information on building the library -README.coding - information for writing code using the library -README.test-apps - information about the test apps built with the library - diff --git a/core/deps/libwebsocket/base64-decode.c b/core/deps/libwebsocket/base64-decode.c deleted file mode 100644 index b89db7ac3..000000000 --- a/core/deps/libwebsocket/base64-decode.c +++ /dev/null @@ -1,93 +0,0 @@ -/* - * This code originally came from here - * - * http://base64.sourceforge.net/b64.c - * - * with the following license: - * - * LICENCE: Copyright (c) 2001 Bob Trower, Trantor Standard Systems Inc. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated - * documentation files (the "Software"), to deal in the - * Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, - * sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall - * be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY - * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE - * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR - * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS - * OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR - * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * VERSION HISTORY: - * Bob Trower 08/04/01 -- Create Version 0.00.00B - * - * I cleaned it up quite a bit to match the (linux kernel) style of the rest - * of libwebsockets; this version is under LGPL2 like the rest of libwebsockets - * since he explictly allows sublicensing, but I give the URL above so you can - * get the original with Bob's super-liberal terms directly if you prefer. - */ - - -#include -#include -#include "private-libwebsockets.h" - -static const char encode[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "abcdefghijklmnopqrstuvwxyz0123456789+/"; -static const char decode[] = "|$$$}rstuvwxyz{$$$$$$$>?@ABCDEFGHIJKLMNOPQRSTUVW" - "$$$$$$XYZ[\\]^_`abcdefghijklmnopq"; - -LWS_VISIBLE int -lws_b64_encode_string(const char *in, int in_len, char *out, int out_size) -{ - unsigned char triple[3]; - int i; - int len; - int line = 0; - int done = 0; - - while (in_len) { - len = 0; - for (i = 0; i < 3; i++) { - if (in_len) { - triple[i] = *in++; - len++; - in_len--; - } else - triple[i] = 0; - } - if (!len) - continue; - - if (done + 4 >= out_size) - return -1; - - *out++ = encode[triple[0] >> 2]; - *out++ = encode[((triple[0] & 0x03) << 4) | - ((triple[1] & 0xf0) >> 4)]; - *out++ = (len > 1 ? encode[((triple[1] & 0x0f) << 2) | - ((triple[2] & 0xc0) >> 6)] : '='); - *out++ = (len > 2 ? encode[triple[2] & 0x3f] : '='); - - done += 4; - line += 4; - } - - if (done + 1 >= out_size) - return -1; - - *out++ = '\0'; - - return done; -} diff --git a/core/deps/libwebsocket/client-handshake.c b/core/deps/libwebsocket/client-handshake.c deleted file mode 100644 index 2e51bb4d1..000000000 --- a/core/deps/libwebsocket/client-handshake.c +++ /dev/null @@ -1,441 +0,0 @@ -#include "private-libwebsockets.h" - -struct libwebsocket *libwebsocket_client_connect_2( - struct libwebsocket_context *context, - struct libwebsocket *wsi -) { - struct libwebsocket_pollfd pfd; -#ifdef LWS_USE_IPV6 - struct sockaddr_in6 server_addr6; - struct sockaddr_in6 client_addr6; - struct addrinfo hints, *result; -#endif - struct sockaddr_in server_addr4; - struct sockaddr_in client_addr4; - struct hostent *server_hostent; - - struct sockaddr *v; - int n; - int plen = 0; - const char *ads; - - lwsl_client("libwebsocket_client_connect_2\n"); - - /* - * proxy? - */ - - if (context->http_proxy_port) { - plen = sprintf((char *)context->service_buffer, - "CONNECT %s:%u HTTP/1.0\x0d\x0a" - "User-agent: libwebsockets\x0d\x0a" -/*Proxy-authorization: basic aGVsbG86d29ybGQ= */ - "\x0d\x0a", - lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_PEER_ADDRESS), - wsi->u.hdr.ah->c_port); - ads = context->http_proxy_address; - -#ifdef LWS_USE_IPV6 - if (LWS_IPV6_ENABLED(context)) - server_addr6.sin6_port = htons(context->http_proxy_port); - else -#endif - server_addr4.sin_port = htons(context->http_proxy_port); - - } else { - ads = lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_PEER_ADDRESS); -#ifdef LWS_USE_IPV6 - if (LWS_IPV6_ENABLED(context)) - server_addr6.sin6_port = htons(wsi->u.hdr.ah->c_port); - else -#endif - server_addr4.sin_port = htons(wsi->u.hdr.ah->c_port); - } - - /* - * prepare the actual connection (to the proxy, if any) - */ - lwsl_client("libwebsocket_client_connect_2: address %s\n", ads); - -#ifdef LWS_USE_IPV6 - if (LWS_IPV6_ENABLED(context)) { - memset(&hints, 0, sizeof(struct addrinfo)); - n = getaddrinfo(ads, NULL, &hints, &result); - if (n) { -#ifdef _WIN32 - lwsl_err("getaddrinfo: %ls\n", gai_strerrorW(n)); -#else - lwsl_err("getaddrinfo: %s\n", gai_strerror(n)); -#endif - goto oom4; - } - - server_addr6.sin6_family = AF_INET6; - switch (result->ai_family) { - case AF_INET: - /* map IPv4 to IPv6 */ - bzero((char *)&server_addr6.sin6_addr, - sizeof(struct in6_addr)); - server_addr6.sin6_addr.s6_addr[10] = 0xff; - server_addr6.sin6_addr.s6_addr[11] = 0xff; - memcpy(&server_addr6.sin6_addr.s6_addr[12], - &((struct sockaddr_in *)result->ai_addr)->sin_addr, - sizeof(struct in_addr)); - break; - case AF_INET6: - memcpy(&server_addr6.sin6_addr, - &((struct sockaddr_in6 *)result->ai_addr)->sin6_addr, - sizeof(struct in6_addr)); - break; - default: - lwsl_err("Unknown address family\n"); - freeaddrinfo(result); - goto oom4; - } - - freeaddrinfo(result); - } else -#endif - { - server_hostent = gethostbyname(ads); - if (!server_hostent) { - lwsl_err("Unable to get host name from %s\n", ads); - goto oom4; - } - - server_addr4.sin_family = AF_INET; - server_addr4.sin_addr = - *((struct in_addr *)server_hostent->h_addr); - bzero(&server_addr4.sin_zero, 8); - } - - if (wsi->sock < 0) { - -#ifdef LWS_USE_IPV6 - if (LWS_IPV6_ENABLED(context)) - wsi->sock = socket(AF_INET6, SOCK_STREAM, 0); - else -#endif - wsi->sock = socket(AF_INET, SOCK_STREAM, 0); - - if (wsi->sock < 0) { - lwsl_warn("Unable to open socket\n"); - goto oom4; - } - - if (lws_plat_set_socket_options(context, wsi->sock)) { - lwsl_err("Failed to set wsi socket options\n"); - compatible_close(wsi->sock); - goto oom4; - } - - wsi->mode = LWS_CONNMODE_WS_CLIENT_WAITING_CONNECT; - - insert_wsi_socket_into_fds(context, wsi); - - libwebsocket_set_timeout(wsi, - PENDING_TIMEOUT_AWAITING_CONNECT_RESPONSE, - AWAITING_TIMEOUT); -#ifdef LWS_USE_IPV6 - if (LWS_IPV6_ENABLED(context)) { - v = (struct sockaddr *)&client_addr6; - n = sizeof(client_addr6); - bzero((char *)v, n); - client_addr6.sin6_family = AF_INET6; - } else -#endif - { - v = (struct sockaddr *)&client_addr4; - n = sizeof(client_addr4); - bzero((char *)v, n); - client_addr4.sin_family = AF_INET; - } - - if (context->iface) { - if (interface_to_sa(context, context->iface, - (struct sockaddr_in *)v, n) < 0) { - lwsl_err("Unable to find interface %s\n", - context->iface); - compatible_close(wsi->sock); - goto failed; - } - - if (bind(wsi->sock, v, n) < 0) { - lwsl_err("Error binding to interface %s", - context->iface); - compatible_close(wsi->sock); - goto failed; - } - } - } - -#ifdef LWS_USE_IPV6 - if (LWS_IPV6_ENABLED(context)) { - v = (struct sockaddr *)&server_addr6; - n = sizeof(struct sockaddr_in6); - } else -#endif - { - v = (struct sockaddr *)&server_addr4; - n = sizeof(struct sockaddr); - } - - if (connect(wsi->sock, v, n) == -1 || LWS_ERRNO == LWS_EISCONN) { - - if (LWS_ERRNO == LWS_EALREADY || LWS_ERRNO == LWS_EINPROGRESS - || LWS_ERRNO == LWS_EWOULDBLOCK) { - lwsl_client("nonblocking connect retry\n"); - - /* - * must do specifically a POLLOUT poll to hear - * about the connect completion - */ - if (lws_change_pollfd(wsi, 0, LWS_POLLOUT)) - goto oom4; - - return wsi; - } - - if (LWS_ERRNO != LWS_EISCONN) { - lwsl_debug("Connect failed errno=%d\n", LWS_ERRNO); - goto failed; - } - } - - lwsl_client("connected\n"); - - /* we are connected to server, or proxy */ - - if (context->http_proxy_port) { - - /* OK from now on we talk via the proxy, so connect to that */ - - /* - * (will overwrite existing pointer, - * leaving old string/frag there but unreferenced) - */ - if (lws_hdr_simple_create(wsi, _WSI_TOKEN_CLIENT_PEER_ADDRESS, - context->http_proxy_address)) - goto failed; - wsi->u.hdr.ah->c_port = context->http_proxy_port; - - n = send(wsi->sock, context->service_buffer, plen, MSG_NOSIGNAL); - if (n < 0) { - lwsl_debug("ERROR writing to proxy socket\n"); - goto failed; - } - - libwebsocket_set_timeout(wsi, - PENDING_TIMEOUT_AWAITING_PROXY_RESPONSE, - AWAITING_TIMEOUT); - - wsi->mode = LWS_CONNMODE_WS_CLIENT_WAITING_PROXY_REPLY; - - return wsi; - } - - /* - * provoke service to issue the handshake directly - * we need to do it this way because in the proxy case, this is the - * next state and executed only if and when we get a good proxy - * response inside the state machine... but notice in SSL case this - * may not have sent anything yet with 0 return, and won't until some - * many retries from main loop. To stop that becoming endless, - * cover with a timeout. - */ - - libwebsocket_set_timeout(wsi, - PENDING_TIMEOUT_SENT_CLIENT_HANDSHAKE, AWAITING_TIMEOUT); - - wsi->mode = LWS_CONNMODE_WS_CLIENT_ISSUE_HANDSHAKE; - pfd.fd = wsi->sock; - pfd.revents = LWS_POLLIN; - - n = libwebsocket_service_fd(context, &pfd); - - if (n < 0) - goto failed; - - if (n) /* returns 1 on failure after closing wsi */ - return NULL; - - return wsi; - -oom4: - free(wsi->u.hdr.ah); - free(wsi); - return NULL; - -failed: - libwebsocket_close_and_free_session(context, wsi, - LWS_CLOSE_STATUS_NOSTATUS); - return NULL; -} - -/** - * libwebsocket_client_connect() - Connect to another websocket server - * @context: Websocket context - * @address: Remote server address, eg, "myserver.com" - * @port: Port to connect to on the remote server, eg, 80 - * @ssl_connection: 0 = ws://, 1 = wss:// encrypted, 2 = wss:// allow self - * signed certs - * @path: Websocket path on server - * @host: Hostname on server - * @origin: Socket origin name - * @protocol: Comma-separated list of protocols being asked for from - * the server, or just one. The server will pick the one it - * likes best. - * @ietf_version_or_minus_one: -1 to ask to connect using the default, latest - * protocol supported, or the specific protocol ordinal - * - * This function creates a connection to a remote server - */ - -LWS_VISIBLE struct libwebsocket * -libwebsocket_client_connect(struct libwebsocket_context *context, - const char *address, - int port, - int ssl_connection, - const char *path, - const char *host, - const char *origin, - const char *protocol, - int ietf_version_or_minus_one) -{ - struct libwebsocket *wsi; - - wsi = (struct libwebsocket *) malloc(sizeof(struct libwebsocket)); - if (wsi == NULL) - goto bail; - - memset(wsi, 0, sizeof(*wsi)); - wsi->sock = -1; - - /* -1 means just use latest supported */ - - if (ietf_version_or_minus_one == -1) - ietf_version_or_minus_one = SPEC_LATEST_SUPPORTED; - - wsi->ietf_spec_revision = ietf_version_or_minus_one; - wsi->user_space = NULL; - wsi->state = WSI_STATE_CLIENT_UNCONNECTED; - wsi->protocol = NULL; - wsi->pending_timeout = NO_PENDING_TIMEOUT; - -#ifdef LWS_OPENSSL_SUPPORT - wsi->use_ssl = ssl_connection; -#else - if (ssl_connection) { - lwsl_err("libwebsockets not configured for ssl\n"); - goto bail; - } -#endif - - if (lws_allocate_header_table(wsi)) - goto bail; - - /* - * we're not necessarily in a position to action these right away, - * stash them... we only need during connect phase so u.hdr is fine - */ - wsi->u.hdr.ah->c_port = port; - if (lws_hdr_simple_create(wsi, _WSI_TOKEN_CLIENT_PEER_ADDRESS, address)) - goto bail1; - - /* these only need u.hdr lifetime as well */ - - if (lws_hdr_simple_create(wsi, _WSI_TOKEN_CLIENT_URI, path)) - goto bail1; - - if (lws_hdr_simple_create(wsi, _WSI_TOKEN_CLIENT_HOST, host)) - goto bail1; - - if (origin) - if (lws_hdr_simple_create(wsi, - _WSI_TOKEN_CLIENT_ORIGIN, origin)) - goto bail1; - /* - * this is a list of protocols we tell the server we're okay with - * stash it for later when we compare server response with it - */ - if (protocol) - if (lws_hdr_simple_create(wsi, - _WSI_TOKEN_CLIENT_SENT_PROTOCOLS, protocol)) - goto bail1; - - wsi->protocol = &context->protocols[0]; - - /* - * Check with each extension if it is able to route and proxy this - * connection for us. For example, an extension like x-google-mux - * can handle this and then we don't need an actual socket for this - * connection. - */ - - if (lws_ext_callback_for_each_extension_type(context, wsi, - LWS_EXT_CALLBACK_CAN_PROXY_CLIENT_CONNECTION, - (void *)address, port) > 0) { - lwsl_client("libwebsocket_client_connect: ext handling conn\n"); - - libwebsocket_set_timeout(wsi, - PENDING_TIMEOUT_AWAITING_EXTENSION_CONNECT_RESPONSE, - AWAITING_TIMEOUT); - - wsi->mode = LWS_CONNMODE_WS_CLIENT_WAITING_EXTENSION_CONNECT; - return wsi; - } - lwsl_client("libwebsocket_client_connect: direct conn\n"); - - return libwebsocket_client_connect_2(context, wsi); - -bail1: - free(wsi->u.hdr.ah); -bail: - free(wsi); - - return NULL; -} - - -/** - * libwebsocket_client_connect_extended() - Connect to another websocket server - * @context: Websocket context - * @address: Remote server address, eg, "myserver.com" - * @port: Port to connect to on the remote server, eg, 80 - * @ssl_connection: 0 = ws://, 1 = wss:// encrypted, 2 = wss:// allow self - * signed certs - * @path: Websocket path on server - * @host: Hostname on server - * @origin: Socket origin name - * @protocol: Comma-separated list of protocols being asked for from - * the server, or just one. The server will pick the one it - * likes best. - * @ietf_version_or_minus_one: -1 to ask to connect using the default, latest - * protocol supported, or the specific protocol ordinal - * @userdata: Pre-allocated user data - * - * This function creates a connection to a remote server - */ - -LWS_VISIBLE struct libwebsocket * -libwebsocket_client_connect_extended(struct libwebsocket_context *context, - const char *address, - int port, - int ssl_connection, - const char *path, - const char *host, - const char *origin, - const char *protocol, - int ietf_version_or_minus_one, - void *userdata) -{ - struct libwebsocket *ws = - libwebsocket_client_connect(context, address, port, - ssl_connection, path, host, origin, protocol, - ietf_version_or_minus_one); - - if (ws && !ws->user_space && userdata) - ws->user_space = userdata ; - - return ws ; -} diff --git a/core/deps/libwebsocket/client-parser.c b/core/deps/libwebsocket/client-parser.c deleted file mode 100644 index d7b97cc3e..000000000 --- a/core/deps/libwebsocket/client-parser.c +++ /dev/null @@ -1,402 +0,0 @@ -/* - * libwebsockets - small server side websockets and web server implementation - * - * Copyright (C) 2010-2014 Andy Green - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation: - * version 2.1 of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301 USA - */ - -#include "private-libwebsockets.h" - -int libwebsocket_client_rx_sm(struct libwebsocket *wsi, unsigned char c) -{ - int callback_action = LWS_CALLBACK_CLIENT_RECEIVE; - int handled; - struct lws_tokens eff_buf; - int m; - - switch (wsi->lws_rx_parse_state) { - case LWS_RXPS_NEW: - - switch (wsi->ietf_spec_revision) { - - case 13: - wsi->u.ws.opcode = c & 0xf; - wsi->u.ws.rsv = (c & 0x70); - wsi->u.ws.final = !!((c >> 7) & 1); - switch (wsi->u.ws.opcode) { - case LWS_WS_OPCODE_07__TEXT_FRAME: - case LWS_WS_OPCODE_07__BINARY_FRAME: - wsi->u.ws.frame_is_binary = wsi->u.ws.opcode == - LWS_WS_OPCODE_07__BINARY_FRAME; - break; - } - wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN; - break; - - default: - lwsl_err("unknown spec version %02d\n", - wsi->ietf_spec_revision); - break; - } - break; - - - case LWS_RXPS_04_FRAME_HDR_LEN: - - wsi->u.ws.this_frame_masked = !!(c & 0x80); - - switch (c & 0x7f) { - case 126: - /* control frames are not allowed to have big lengths */ - if (wsi->u.ws.opcode & 8) - goto illegal_ctl_length; - wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN16_2; - break; - case 127: - /* control frames are not allowed to have big lengths */ - if (wsi->u.ws.opcode & 8) - goto illegal_ctl_length; - wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN64_8; - break; - default: - wsi->u.ws.rx_packet_length = c; - if (wsi->u.ws.this_frame_masked) - wsi->lws_rx_parse_state = - LWS_RXPS_07_COLLECT_FRAME_KEY_1; - else { - if (c) - wsi->lws_rx_parse_state = - LWS_RXPS_PAYLOAD_UNTIL_LENGTH_EXHAUSTED; - else { - wsi->lws_rx_parse_state = LWS_RXPS_NEW; - goto spill; - } - } - break; - } - break; - - case LWS_RXPS_04_FRAME_HDR_LEN16_2: - wsi->u.ws.rx_packet_length = c << 8; - wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN16_1; - break; - - case LWS_RXPS_04_FRAME_HDR_LEN16_1: - wsi->u.ws.rx_packet_length |= c; - if (wsi->u.ws.this_frame_masked) - wsi->lws_rx_parse_state = - LWS_RXPS_07_COLLECT_FRAME_KEY_1; - else { - if (wsi->u.ws.rx_packet_length) - wsi->lws_rx_parse_state = - LWS_RXPS_PAYLOAD_UNTIL_LENGTH_EXHAUSTED; - else { - wsi->lws_rx_parse_state = LWS_RXPS_NEW; - goto spill; - } - } - break; - - case LWS_RXPS_04_FRAME_HDR_LEN64_8: - if (c & 0x80) { - lwsl_warn("b63 of length must be zero\n"); - /* kill the connection */ - return -1; - } -#if defined __LP64__ - wsi->u.ws.rx_packet_length = ((size_t)c) << 56; -#else - wsi->u.ws.rx_packet_length = 0; -#endif - wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN64_7; - break; - - case LWS_RXPS_04_FRAME_HDR_LEN64_7: -#if defined __LP64__ - wsi->u.ws.rx_packet_length |= ((size_t)c) << 48; -#endif - wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN64_6; - break; - - case LWS_RXPS_04_FRAME_HDR_LEN64_6: -#if defined __LP64__ - wsi->u.ws.rx_packet_length |= ((size_t)c) << 40; -#endif - wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN64_5; - break; - - case LWS_RXPS_04_FRAME_HDR_LEN64_5: -#if defined __LP64__ - wsi->u.ws.rx_packet_length |= ((size_t)c) << 32; -#endif - wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN64_4; - break; - - case LWS_RXPS_04_FRAME_HDR_LEN64_4: - wsi->u.ws.rx_packet_length |= ((size_t)c) << 24; - wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN64_3; - break; - - case LWS_RXPS_04_FRAME_HDR_LEN64_3: - wsi->u.ws.rx_packet_length |= ((size_t)c) << 16; - wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN64_2; - break; - - case LWS_RXPS_04_FRAME_HDR_LEN64_2: - wsi->u.ws.rx_packet_length |= ((size_t)c) << 8; - wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN64_1; - break; - - case LWS_RXPS_04_FRAME_HDR_LEN64_1: - wsi->u.ws.rx_packet_length |= (size_t)c; - if (wsi->u.ws.this_frame_masked) - wsi->lws_rx_parse_state = - LWS_RXPS_07_COLLECT_FRAME_KEY_1; - else { - if (wsi->u.ws.rx_packet_length) - wsi->lws_rx_parse_state = - LWS_RXPS_PAYLOAD_UNTIL_LENGTH_EXHAUSTED; - else { - wsi->lws_rx_parse_state = LWS_RXPS_NEW; - goto spill; - } - } - break; - - case LWS_RXPS_07_COLLECT_FRAME_KEY_1: - wsi->u.ws.frame_masking_nonce_04[0] = c; - if (c) - wsi->u.ws.all_zero_nonce = 0; - wsi->lws_rx_parse_state = LWS_RXPS_07_COLLECT_FRAME_KEY_2; - break; - - case LWS_RXPS_07_COLLECT_FRAME_KEY_2: - wsi->u.ws.frame_masking_nonce_04[1] = c; - if (c) - wsi->u.ws.all_zero_nonce = 0; - wsi->lws_rx_parse_state = LWS_RXPS_07_COLLECT_FRAME_KEY_3; - break; - - case LWS_RXPS_07_COLLECT_FRAME_KEY_3: - wsi->u.ws.frame_masking_nonce_04[2] = c; - if (c) - wsi->u.ws.all_zero_nonce = 0; - wsi->lws_rx_parse_state = LWS_RXPS_07_COLLECT_FRAME_KEY_4; - break; - - case LWS_RXPS_07_COLLECT_FRAME_KEY_4: - wsi->u.ws.frame_masking_nonce_04[3] = c; - if (c) - wsi->u.ws.all_zero_nonce = 0; - - if (wsi->u.ws.rx_packet_length) - wsi->lws_rx_parse_state = - LWS_RXPS_PAYLOAD_UNTIL_LENGTH_EXHAUSTED; - else { - wsi->lws_rx_parse_state = LWS_RXPS_NEW; - goto spill; - } - break; - - case LWS_RXPS_PAYLOAD_UNTIL_LENGTH_EXHAUSTED: - - if (!wsi->u.ws.rx_user_buffer) - lwsl_err("NULL client rx_user_buffer\n"); - - if ((!wsi->u.ws.this_frame_masked) || wsi->u.ws.all_zero_nonce) - wsi->u.ws.rx_user_buffer[LWS_SEND_BUFFER_PRE_PADDING + - (wsi->u.ws.rx_user_buffer_head++)] = c; - else - wsi->u.ws.rx_user_buffer[LWS_SEND_BUFFER_PRE_PADDING + - (wsi->u.ws.rx_user_buffer_head++)] = - c ^ wsi->u.ws.frame_masking_nonce_04[ - (wsi->u.ws.frame_mask_index++) & 3]; - - if (--wsi->u.ws.rx_packet_length == 0) { - /* spill because we have the whole frame */ - wsi->lws_rx_parse_state = LWS_RXPS_NEW; - goto spill; - } - - /* - * if there's no protocol max frame size given, we are - * supposed to default to LWS_MAX_SOCKET_IO_BUF - */ - - if (!wsi->protocol->rx_buffer_size && - wsi->u.ws.rx_user_buffer_head != - LWS_MAX_SOCKET_IO_BUF) - break; - else - if (wsi->protocol->rx_buffer_size && - wsi->u.ws.rx_user_buffer_head != - wsi->protocol->rx_buffer_size) - break; - - /* spill because we filled our rx buffer */ -spill: - - handled = 0; - - /* - * is this frame a control packet we should take care of at this - * layer? If so service it and hide it from the user callback - */ - - switch (wsi->u.ws.opcode) { - case LWS_WS_OPCODE_07__CLOSE: - /* is this an acknowledgement of our close? */ - if (wsi->state == WSI_STATE_AWAITING_CLOSE_ACK) { - /* - * fine he has told us he is closing too, let's - * finish our close - */ - lwsl_parser("seen server's close ack\n"); - return -1; - } - lwsl_parser("client sees server close len = %d\n", - wsi->u.ws.rx_user_buffer_head); - /* - * parrot the close packet payload back - * we do not care about how it went, we are closing - * immediately afterwards - */ - libwebsocket_write(wsi, (unsigned char *) - &wsi->u.ws.rx_user_buffer[ - LWS_SEND_BUFFER_PRE_PADDING], - wsi->u.ws.rx_user_buffer_head, LWS_WRITE_CLOSE); - wsi->state = WSI_STATE_RETURNED_CLOSE_ALREADY; - /* close the connection */ - return -1; - - case LWS_WS_OPCODE_07__PING: - lwsl_info("client received ping, doing pong\n"); - /* - * parrot the ping packet payload back as a pong - * !!! this may block or have partial write or fail - * !!! very unlikely if the ping size is small - */ - libwebsocket_write(wsi, (unsigned char *) - &wsi->u.ws.rx_user_buffer[ - LWS_SEND_BUFFER_PRE_PADDING], - wsi->u.ws.rx_user_buffer_head, - LWS_WRITE_PONG); - handled = 1; - break; - - case LWS_WS_OPCODE_07__PONG: - lwsl_info("client receied pong\n"); - lwsl_hexdump(&wsi->u.ws.rx_user_buffer[ - LWS_SEND_BUFFER_PRE_PADDING], - wsi->u.ws.rx_user_buffer_head); - - /* issue it */ - callback_action = LWS_CALLBACK_CLIENT_RECEIVE_PONG; - break; - - case LWS_WS_OPCODE_07__CONTINUATION: - case LWS_WS_OPCODE_07__TEXT_FRAME: - case LWS_WS_OPCODE_07__BINARY_FRAME: - break; - - default: - - lwsl_parser("Reserved opc 0x%2X\n", wsi->u.ws.opcode); - - /* - * It's something special we can't understand here. - * Pass the payload up to the extension's parsing - * state machine. - */ - - eff_buf.token = &wsi->u.ws.rx_user_buffer[ - LWS_SEND_BUFFER_PRE_PADDING]; - eff_buf.token_len = wsi->u.ws.rx_user_buffer_head; - - if (lws_ext_callback_for_each_active(wsi, - LWS_EXT_CALLBACK_EXTENDED_PAYLOAD_RX, - &eff_buf, 0) <= 0) { /* not handle or fail */ - - lwsl_ext("Unhandled ext opc 0x%x\n", - wsi->u.ws.opcode); - wsi->u.ws.rx_user_buffer_head = 0; - - return 0; - } - handled = 1; - break; - } - - /* - * No it's real payload, pass it up to the user callback. - * It's nicely buffered with the pre-padding taken care of - * so it can be sent straight out again using libwebsocket_write - */ - if (handled) - goto already_done; - - eff_buf.token = &wsi->u.ws.rx_user_buffer[ - LWS_SEND_BUFFER_PRE_PADDING]; - eff_buf.token_len = wsi->u.ws.rx_user_buffer_head; - - if (lws_ext_callback_for_each_active(wsi, - LWS_EXT_CALLBACK_PAYLOAD_RX, - &eff_buf, 0) < 0) /* fail */ - return -1; - - if (eff_buf.token_len <= 0 && - callback_action != LWS_CALLBACK_CLIENT_RECEIVE_PONG) - goto already_done; - - eff_buf.token[eff_buf.token_len] = '\0'; - - if (!wsi->protocol->callback) - goto already_done; - - if (callback_action == LWS_CALLBACK_CLIENT_RECEIVE_PONG) - lwsl_info("Client doing pong callback\n"); - - m = wsi->protocol->callback( - wsi->protocol->owning_server, - wsi, - (enum libwebsocket_callback_reasons)callback_action, - wsi->user_space, - eff_buf.token, - eff_buf.token_len); - - /* if user code wants to close, let caller know */ - if (m) - return 1; - -already_done: - wsi->u.ws.rx_user_buffer_head = 0; - break; - default: - lwsl_err("client rx illegal state\n"); - return 1; - } - - return 0; - -illegal_ctl_length: - - lwsl_warn("Control frame asking for extended length is illegal\n"); - /* kill the connection */ - return -1; -} - - diff --git a/core/deps/libwebsocket/client.c b/core/deps/libwebsocket/client.c deleted file mode 100644 index ffad490ac..000000000 --- a/core/deps/libwebsocket/client.c +++ /dev/null @@ -1,953 +0,0 @@ -/* - * libwebsockets - small server side websockets and web server implementation - * - * Copyright (C) 2010-2014 Andy Green - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation: - * version 2.1 of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301 USA - */ - -#include "private-libwebsockets.h" - -int lws_handshake_client(struct libwebsocket *wsi, unsigned char **buf, size_t len) -{ - int n; - - switch (wsi->mode) { - case LWS_CONNMODE_WS_CLIENT_WAITING_PROXY_REPLY: - case LWS_CONNMODE_WS_CLIENT_ISSUE_HANDSHAKE: - case LWS_CONNMODE_WS_CLIENT_WAITING_SERVER_REPLY: - case LWS_CONNMODE_WS_CLIENT_WAITING_EXTENSION_CONNECT: - case LWS_CONNMODE_WS_CLIENT: - for (n = 0; n < len; n++) - if (libwebsocket_client_rx_sm(wsi, *(*buf)++)) { - lwsl_debug("client_rx_sm failed\n"); - return 1; - } - return 0; - default: - break; - } - return 0; -} - -int lws_client_socket_service(struct libwebsocket_context *context, - struct libwebsocket *wsi, struct libwebsocket_pollfd *pollfd) -{ - int n; - char *p = (char *)&context->service_buffer[0]; - int len; - unsigned char c; - - switch (wsi->mode) { - - case LWS_CONNMODE_WS_CLIENT_WAITING_CONNECT: - - /* - * we are under PENDING_TIMEOUT_SENT_CLIENT_HANDSHAKE - * timeout protection set in client-handshake.c - */ - - if (libwebsocket_client_connect_2(context, wsi) == NULL) { - /* closed */ - lwsl_client("closed\n"); - return -1; - } - - /* either still pending connection, or changed mode */ - return 0; - - case LWS_CONNMODE_WS_CLIENT_WAITING_PROXY_REPLY: - - /* handle proxy hung up on us */ - - if (pollfd->revents & LWS_POLLHUP) { - - lwsl_warn("Proxy connection %p (fd=%d) dead\n", - (void *)wsi, pollfd->fd); - - libwebsocket_close_and_free_session(context, wsi, - LWS_CLOSE_STATUS_NOSTATUS); - return 0; - } - - n = recv(wsi->sock, context->service_buffer, - sizeof(context->service_buffer), 0); - if (n < 0) { - - if (LWS_ERRNO == LWS_EAGAIN) { - lwsl_debug( - "Proxy read returned EAGAIN... retrying\n"); - return 0; - } - - libwebsocket_close_and_free_session(context, wsi, - LWS_CLOSE_STATUS_NOSTATUS); - lwsl_err("ERROR reading from proxy socket\n"); - return 0; - } - - context->service_buffer[13] = '\0'; - if (strcmp((char *)context->service_buffer, "HTTP/1.0 200 ")) { - libwebsocket_close_and_free_session(context, wsi, - LWS_CLOSE_STATUS_NOSTATUS); - lwsl_err("ERROR proxy: %s\n", context->service_buffer); - return 0; - } - - /* clear his proxy connection timeout */ - - libwebsocket_set_timeout(wsi, NO_PENDING_TIMEOUT, 0); - - /* fallthru */ - - case LWS_CONNMODE_WS_CLIENT_ISSUE_HANDSHAKE: - - /* - * we are under PENDING_TIMEOUT_SENT_CLIENT_HANDSHAKE - * timeout protection set in client-handshake.c - */ - - /* - * take care of our libwebsocket_callback_on_writable - * happening at a time when there's no real connection yet - */ - if (lws_change_pollfd(wsi, LWS_POLLOUT, 0)) - return -1; - -#ifdef LWS_OPENSSL_SUPPORT - /* we can retry this... just cook the SSL BIO the first time */ - - if (wsi->use_ssl && !wsi->ssl) { - const char *hostname = lws_hdr_simple_ptr(wsi, - _WSI_TOKEN_CLIENT_PEER_ADDRESS); - - wsi->ssl = SSL_new(context->ssl_client_ctx); -#ifndef USE_CYASSL - SSL_set_mode(wsi->ssl, - SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER); -#endif - /* - * use server name indication (SNI), if supported, - * when establishing connection - */ -#ifdef USE_CYASSL -#ifdef CYASSL_SNI_HOST_NAME - CyaSSL_UseSNI(wsi->ssl, CYASSL_SNI_HOST_NAME, - hostname, strlen(hostname)); -#endif -#else - SSL_set_tlsext_host_name(wsi->ssl, hostname); -#endif - -#ifdef USE_CYASSL - /* - * CyaSSL does certificate verification differently - * from OpenSSL. - * If we should ignore the certificate, we need to set - * this before SSL_new and SSL_connect is called. - * Otherwise the connect will simply fail with error - * code -155 - */ - if (wsi->use_ssl == 2) - CyaSSL_set_verify(wsi->ssl, - SSL_VERIFY_NONE, NULL); -#endif /* USE_CYASSL */ - - wsi->client_bio = - BIO_new_socket(wsi->sock, BIO_NOCLOSE); - SSL_set_bio(wsi->ssl, wsi->client_bio, wsi->client_bio); - -#ifdef USE_CYASSL - CyaSSL_set_using_nonblock(wsi->ssl, 1); -#else - BIO_set_nbio(wsi->client_bio, 1); /* nonblocking */ -#endif - - SSL_set_ex_data(wsi->ssl, - openssl_websocket_private_data_index, - context); - } - - if (wsi->use_ssl) { - lws_latency_pre(context, wsi); - n = SSL_connect(wsi->ssl); - lws_latency(context, wsi, - "SSL_connect LWS_CONNMODE_WS_CLIENT_ISSUE_HANDSHAKE", - n, n > 0); - - if (n < 0) { - n = SSL_get_error(wsi->ssl, n); - - if (n == SSL_ERROR_WANT_READ || - n == SSL_ERROR_WANT_WRITE) { - /* - * wants us to retry connect due to - * state of the underlying ssl layer... - * but since it may be stalled on - * blocked write, no incoming data may - * arrive to trigger the retry. - * Force (possibly many times if the SSL - * state persists in returning the - * condition code, but other sockets - * are getting serviced inbetweentimes) - * us to get called back when writable. - */ - - lwsl_info( - "SSL_connect WANT_... retrying\n"); - libwebsocket_callback_on_writable( - context, wsi); - - wsi->mode = LWS_CONNMODE_WS_CLIENT_WAITING_SSL; - - return 0; /* no error */ - } - n = -1; - } - - if (n <= 0) { - /* - * retry if new data comes until we - * run into the connection timeout or win - */ - - n = ERR_get_error(); - if (n != SSL_ERROR_NONE) { - lwsl_err("SSL connect error %lu: %s\n", - n, - ERR_error_string(n, - (char *)context->service_buffer)); - return 0; - } - } - } else - wsi->ssl = NULL; - - /* fallthru */ - - case LWS_CONNMODE_WS_CLIENT_WAITING_SSL: - - if (wsi->use_ssl) { - - if (wsi->mode == LWS_CONNMODE_WS_CLIENT_WAITING_SSL) { - lws_latency_pre(context, wsi); - n = SSL_connect(wsi->ssl); - lws_latency(context, wsi, - "SSL_connect LWS_CONNMODE_WS_CLIENT_WAITING_SSL", - n, n > 0); - - if (n < 0) { - n = SSL_get_error(wsi->ssl, n); - - if (n == SSL_ERROR_WANT_READ || - n == SSL_ERROR_WANT_WRITE) { - /* - * wants us to retry connect due to - * state of the underlying ssl layer... - * but since it may be stalled on - * blocked write, no incoming data may - * arrive to trigger the retry. - * Force (possibly many times if the SSL - * state persists in returning the - * condition code, but other sockets - * are getting serviced inbetweentimes) - * us to get called back when writable. - */ - - lwsl_info( - "SSL_connect WANT_... retrying\n"); - libwebsocket_callback_on_writable( - context, wsi); - - wsi->mode = LWS_CONNMODE_WS_CLIENT_WAITING_SSL; - - return 0; /* no error */ - } - n = -1; - } - - if (n <= 0) { - /* - * retry if new data comes until we - * run into the connection timeout or win - */ - n = ERR_get_error(); - if (n != SSL_ERROR_NONE) { - lwsl_err("SSL connect error %lu: %s\n", - n, - ERR_error_string(n, - (char *)context->service_buffer)); - return 0; - } - } - } - - #ifndef USE_CYASSL - /* - * See comment above about CyaSSL certificate - * verification - */ - lws_latency_pre(context, wsi); - n = SSL_get_verify_result(wsi->ssl); - lws_latency(context, wsi, - "SSL_get_verify_result LWS_CONNMODE..HANDSHAKE", - n, n > 0); - if ((n != X509_V_OK) && ( - n != X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT || - wsi->use_ssl != 2)) { - - lwsl_err( - "server's cert didn't look good %d\n", n); - libwebsocket_close_and_free_session(context, - wsi, LWS_CLOSE_STATUS_NOSTATUS); - return 0; - } -#endif /* USE_CYASSL */ - } else - wsi->ssl = NULL; -#endif - - wsi->mode = LWS_CONNMODE_WS_CLIENT_ISSUE_HANDSHAKE2; - libwebsocket_set_timeout(wsi, - PENDING_TIMEOUT_AWAITING_CLIENT_HS_SEND, - AWAITING_TIMEOUT); - - /* fallthru */ - - case LWS_CONNMODE_WS_CLIENT_ISSUE_HANDSHAKE2: - p = libwebsockets_generate_client_handshake(context, wsi, p); - if (p == NULL) { - lwsl_err("Failed to generate handshake for client\n"); - libwebsocket_close_and_free_session(context, wsi, - LWS_CLOSE_STATUS_NOSTATUS); - return 0; - } - - /* send our request to the server */ - - lws_latency_pre(context, wsi); - - n = lws_ssl_capable_write(wsi, context->service_buffer, p - (char *)context->service_buffer); - lws_latency(context, wsi, "send lws_issue_raw", n, n == p - (char *)context->service_buffer); - switch (n) { - case LWS_SSL_CAPABLE_ERROR: - lwsl_debug("ERROR writing to client socket\n"); - libwebsocket_close_and_free_session(context, wsi, - LWS_CLOSE_STATUS_NOSTATUS); - return 0; - case LWS_SSL_CAPABLE_MORE_SERVICE: - libwebsocket_callback_on_writable(context, wsi); - break; - } - - wsi->u.hdr.parser_state = WSI_TOKEN_NAME_PART; - wsi->u.hdr.lextable_pos = 0; - wsi->mode = LWS_CONNMODE_WS_CLIENT_WAITING_SERVER_REPLY; - libwebsocket_set_timeout(wsi, - PENDING_TIMEOUT_AWAITING_SERVER_RESPONSE, - AWAITING_TIMEOUT); - break; - - case LWS_CONNMODE_WS_CLIENT_WAITING_SERVER_REPLY: - - /* handle server hung up on us */ - - if (pollfd->revents & LWS_POLLHUP) { - - lwsl_debug("Server connection %p (fd=%d) dead\n", - (void *)wsi, pollfd->fd); - - goto bail3; - } - - if (!(pollfd->revents & LWS_POLLIN)) - break; - - /* interpret the server response */ - - /* - * HTTP/1.1 101 Switching Protocols - * Upgrade: websocket - * Connection: Upgrade - * Sec-WebSocket-Accept: me89jWimTRKTWwrS3aRrL53YZSo= - * Sec-WebSocket-Nonce: AQIDBAUGBwgJCgsMDQ4PEC== - * Sec-WebSocket-Protocol: chat - */ - - /* - * we have to take some care here to only take from the - * socket bytewise. The browser may (and has been seen to - * in the case that onopen() performs websocket traffic) - * coalesce both handshake response and websocket traffic - * in one packet, since at that point the connection is - * definitively ready from browser pov. - */ - len = 1; - while (wsi->u.hdr.parser_state != WSI_PARSING_COMPLETE) { - n = lws_ssl_capable_read(wsi, &c, 1); - lws_latency(context, wsi, "send lws_issue_raw", n, n == 1); - switch (n) { - case LWS_SSL_CAPABLE_ERROR: - goto bail3; - case LWS_SSL_CAPABLE_MORE_SERVICE: - return 0; - } - - if (libwebsocket_parse(wsi, c)) { - lwsl_warn("problems parsing header\n"); - goto bail3; - } - } - - /* - * hs may also be coming in multiple packets, there is a 5-sec - * libwebsocket timeout still active here too, so if parsing did - * not complete just wait for next packet coming in this state - */ - - if (wsi->u.hdr.parser_state != WSI_PARSING_COMPLETE) - break; - - /* - * otherwise deal with the handshake. If there's any - * packet traffic already arrived we'll trigger poll() again - * right away and deal with it that way - */ - - return lws_client_interpret_server_handshake(context, wsi); - -bail3: - lwsl_info( - "closing connection at LWS_CONNMODE...SERVER_REPLY\n"); - libwebsocket_close_and_free_session(context, wsi, - LWS_CLOSE_STATUS_NOSTATUS); - return -1; - - case LWS_CONNMODE_WS_CLIENT_WAITING_EXTENSION_CONNECT: - lwsl_ext("LWS_CONNMODE_WS_CLIENT_WAITING_EXTENSION_CONNECT\n"); - break; - - case LWS_CONNMODE_WS_CLIENT_PENDING_CANDIDATE_CHILD: - lwsl_ext("LWS_CONNMODE_WS_CLIENT_PENDING_CANDIDATE_CHILD\n"); - break; - default: - break; - } - - return 0; -} - - -/* - * In-place str to lower case - */ - -static void -strtolower(char *s) -{ - while (*s) { - *s = tolower((int)*s); - s++; - } -} - -int -lws_client_interpret_server_handshake(struct libwebsocket_context *context, - struct libwebsocket *wsi) -{ - const char *pc; - int okay = 0; - char *p; - int len; -#ifndef LWS_NO_EXTENSIONS - char ext_name[128]; - struct libwebsocket_extension *ext; - void *v; - int more = 1; - const char *c; -#endif - int n; - int close_reason = LWS_CLOSE_STATUS_PROTOCOL_ERR; - - /* - * well, what the server sent looked reasonable for syntax. - * Now let's confirm it sent all the necessary headers - */ - - if (lws_hdr_total_length(wsi, WSI_TOKEN_ACCEPT) == 0) { - lwsl_info("no ACCEPT\n"); - goto bail3; - } - - p = lws_hdr_simple_ptr(wsi, WSI_TOKEN_HTTP); - if (!p) { - lwsl_info("no URI\n"); - goto bail3; - } - if (p && strncmp(p, "101", 3)) { - lwsl_warn( - "lws_client_handshake: got bad HTTP response '%s'\n", p); - goto bail3; - } - - p = lws_hdr_simple_ptr(wsi, WSI_TOKEN_UPGRADE); - if (!p) { - lwsl_info("no UPGRADE\n"); - goto bail3; - } - strtolower(p); - if (strcmp(p, "websocket")) { - lwsl_warn( - "lws_client_handshake: got bad Upgrade header '%s'\n", p); - goto bail3; - } - - p = lws_hdr_simple_ptr(wsi, WSI_TOKEN_CONNECTION); - if (!p) { - lwsl_info("no Connection hdr\n"); - goto bail3; - } - strtolower(p); - if (strcmp(p, "upgrade")) { - lwsl_warn("lws_client_int_s_hs: bad header %s\n", p); - goto bail3; - } - - pc = lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_SENT_PROTOCOLS); - if (pc == NULL) - lwsl_parser("lws_client_int_s_hs: no protocol list\n"); - else - lwsl_parser("lws_client_int_s_hs: protocol list '%s'\n", pc); - - /* - * confirm the protocol the server wants to talk was in the list - * of protocols we offered - */ - - len = lws_hdr_total_length(wsi, WSI_TOKEN_PROTOCOL); - if (!len) { - - lwsl_info("lws_client_int_s_hs: WSI_TOKEN_PROTOCOL is null\n"); - /* - * no protocol name to work from, - * default to first protocol - */ - wsi->protocol = &context->protocols[0]; - goto check_extensions; - } - - p = lws_hdr_simple_ptr(wsi, WSI_TOKEN_PROTOCOL); - len = strlen(p); - - while (*pc && !okay) { - if (!strncmp(pc, p, len) && - (pc[len] == ',' || pc[len] == '\0')) { - okay = 1; - continue; - } - while (*pc && *pc != ',') - pc++; - while (*pc && *pc != ' ') - pc++; - } - - if (!okay) { - lwsl_err("lws_client_int_s_hs: got bad protocol %s\n", p); - goto bail2; - } - - /* - * identify the selected protocol struct and set it - */ - n = 0; - wsi->protocol = NULL; - while (context->protocols[n].callback && !wsi->protocol) { - if (strcmp(p, context->protocols[n].name) == 0) { - wsi->protocol = &context->protocols[n]; - break; - } - n++; - } - - if (wsi->protocol == NULL) { - lwsl_err("lws_client_int_s_hs: fail protocol %s\n", p); - goto bail2; - } - - -check_extensions: -#ifndef LWS_NO_EXTENSIONS - /* instantiate the accepted extensions */ - - if (!lws_hdr_total_length(wsi, WSI_TOKEN_EXTENSIONS)) { - lwsl_ext("no client extenstions allowed by server\n"); - goto check_accept; - } - - /* - * break down the list of server accepted extensions - * and go through matching them or identifying bogons - */ - - if (lws_hdr_copy(wsi, (char *)context->service_buffer, - sizeof(context->service_buffer), WSI_TOKEN_EXTENSIONS) < 0) { - lwsl_warn("ext list from server failed to copy\n"); - goto bail2; - } - - c = (char *)context->service_buffer; - n = 0; - while (more) { - - if (*c && (*c != ',' && *c != ' ' && *c != '\t')) { - ext_name[n] = *c++; - if (n < sizeof(ext_name) - 1) - n++; - continue; - } - ext_name[n] = '\0'; - if (!*c) - more = 0; - else { - c++; - if (!n) - continue; - } - - /* check we actually support it */ - - lwsl_ext("checking client ext %s\n", ext_name); - - n = 0; - ext = wsi->protocol->owning_server->extensions; - while (ext && ext->callback) { - - if (strcmp(ext_name, ext->name)) { - ext++; - continue; - } - - n = 1; - - lwsl_ext("instantiating client ext %s\n", ext_name); - - /* instantiate the extension on this conn */ - - wsi->active_extensions_user[ - wsi->count_active_extensions] = - malloc(ext->per_session_data_size); - if (wsi->active_extensions_user[ - wsi->count_active_extensions] == NULL) { - lwsl_err("Out of mem\n"); - goto bail2; - } - memset(wsi->active_extensions_user[ - wsi->count_active_extensions], 0, - ext->per_session_data_size); - wsi->active_extensions[ - wsi->count_active_extensions] = ext; - - /* allow him to construct his context */ - - ext->callback(wsi->protocol->owning_server, - ext, wsi, - LWS_EXT_CALLBACK_CLIENT_CONSTRUCT, - wsi->active_extensions_user[ - wsi->count_active_extensions], - NULL, 0); - - wsi->count_active_extensions++; - - ext++; - } - - if (n == 0) { - lwsl_warn("Unknown ext '%s'!\n", ext_name); - goto bail2; - } - - n = 0; - } - -check_accept: -#endif - - /* - * Confirm his accept token is the one we precomputed - */ - - p = lws_hdr_simple_ptr(wsi, WSI_TOKEN_ACCEPT); - if (strcmp(p, wsi->u.hdr.ah->initial_handshake_hash_base64)) { - lwsl_warn("lws_client_int_s_hs: accept %s wrong vs %s\n", p, - wsi->u.hdr.ah->initial_handshake_hash_base64); - goto bail2; - } - - /* allocate the per-connection user memory (if any) */ - if (libwebsocket_ensure_user_space(wsi)) { - lwsl_err("Problem allocating wsi user mem\n"); - goto bail2; - } - - /* - * we seem to be good to go, give client last chance to check - * headers and OK it - */ - - wsi->protocol->callback(context, wsi, - LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH, - wsi->user_space, NULL, 0); - - /* clear his proxy connection timeout */ - - libwebsocket_set_timeout(wsi, NO_PENDING_TIMEOUT, 0); - - /* free up his parsing allocations */ - if (wsi->u.hdr.ah) - free(wsi->u.hdr.ah); - - /* mark him as being alive */ - - wsi->state = WSI_STATE_ESTABLISHED; - wsi->mode = LWS_CONNMODE_WS_CLIENT; - - /* union transition */ - - memset(&wsi->u, 0, sizeof(wsi->u)); - - wsi->u.ws.rxflow_change_to = LWS_RXFLOW_ALLOW; - - /* - * create the frame buffer for this connection according to the - * size mentioned in the protocol definition. If 0 there, then - * use a big default for compatibility - */ - - n = wsi->protocol->rx_buffer_size; - if (!n) - n = LWS_MAX_SOCKET_IO_BUF; - n += LWS_SEND_BUFFER_PRE_PADDING + LWS_SEND_BUFFER_POST_PADDING; - wsi->u.ws.rx_user_buffer = malloc(n); - if (!wsi->u.ws.rx_user_buffer) { - lwsl_err("Out of Mem allocating rx buffer %d\n", n); - goto bail2; - } - lwsl_info("Allocating client RX buffer %d\n", n); - - if (setsockopt(wsi->sock, SOL_SOCKET, SO_SNDBUF, (const char *)&n, sizeof n)) { - lwsl_warn("Failed to set SNDBUF to %d", n); - goto bail3; - } - - lwsl_debug("handshake OK for protocol %s\n", wsi->protocol->name); - - /* call him back to inform him he is up */ - - wsi->protocol->callback(context, wsi, - LWS_CALLBACK_CLIENT_ESTABLISHED, - wsi->user_space, NULL, 0); -#ifndef LWS_NO_EXTENSIONS - /* - * inform all extensions, not just active ones since they - * already know - */ - - ext = context->extensions; - - while (ext && ext->callback) { - v = NULL; - for (n = 0; n < wsi->count_active_extensions; n++) - if (wsi->active_extensions[n] == ext) - v = wsi->active_extensions_user[n]; - - ext->callback(context, ext, wsi, - LWS_EXT_CALLBACK_ANY_WSI_ESTABLISHED, v, NULL, 0); - ext++; - } -#endif - - return 0; - -bail3: - free(wsi->u.ws.rx_user_buffer); - wsi->u.ws.rx_user_buffer = NULL; - close_reason = LWS_CLOSE_STATUS_NOSTATUS; - -bail2: - if (wsi->protocol) - wsi->protocol->callback(context, wsi, - LWS_CALLBACK_CLIENT_CONNECTION_ERROR, - wsi->user_space, NULL, 0); - - lwsl_info("closing connection due to bail2 connection error\n"); - - /* free up his parsing allocations */ - - if (wsi->u.hdr.ah) - free(wsi->u.hdr.ah); - - libwebsocket_close_and_free_session(context, wsi, close_reason); - - return 1; -} - - -char * -libwebsockets_generate_client_handshake(struct libwebsocket_context *context, - struct libwebsocket *wsi, char *pkt) -{ - char buf[128]; - char hash[20]; - char key_b64[40]; - char *p = pkt; - int n; -#ifndef LWS_NO_EXTENSIONS - struct libwebsocket_extension *ext; - int ext_count = 0; -#endif - - /* - * create the random key - */ - - n = libwebsockets_get_random(context, hash, 16); - if (n != 16) { - lwsl_err("Unable to read from random dev %s\n", - SYSTEM_RANDOM_FILEPATH); - libwebsocket_close_and_free_session(context, wsi, - LWS_CLOSE_STATUS_NOSTATUS); - return NULL; - } - - lws_b64_encode_string(hash, 16, key_b64, sizeof(key_b64)); - - /* - * 00 example client handshake - * - * GET /socket.io/websocket HTTP/1.1 - * Upgrade: WebSocket - * Connection: Upgrade - * Host: 127.0.0.1:9999 - * Origin: http://127.0.0.1 - * Sec-WebSocket-Key1: 1 0 2#0W 9 89 7 92 ^ - * Sec-WebSocket-Key2: 7 7Y 4328 B2v[8(z1 - * Cookie: socketio=websocket - * - * (Á®Ä0¶†≥ - * - * 04 example client handshake - * - * GET /chat HTTP/1.1 - * Host: server.example.com - * Upgrade: websocket - * Connection: Upgrade - * Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== - * Sec-WebSocket-Origin: http://example.com - * Sec-WebSocket-Protocol: chat, superchat - * Sec-WebSocket-Version: 4 - */ - - p += sprintf(p, "GET %s HTTP/1.1\x0d\x0a", - lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_URI)); - - p += sprintf(p, - "Pragma: no-cache\x0d\x0a""Cache-Control: no-cache\x0d\x0a"); - - p += sprintf(p, "Host: %s\x0d\x0a", - lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_HOST)); - p += sprintf(p, -"Upgrade: websocket\x0d\x0a""Connection: Upgrade\x0d\x0a""Sec-WebSocket-Key: "); - strcpy(p, key_b64); - p += strlen(key_b64); - p += sprintf(p, "\x0d\x0a"); - if (lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_ORIGIN)) - p += sprintf(p, "Origin: http://%s\x0d\x0a", - lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_ORIGIN)); - - if (lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_SENT_PROTOCOLS)) - p += sprintf(p, "Sec-WebSocket-Protocol: %s\x0d\x0a", - lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_SENT_PROTOCOLS)); - - /* tell the server what extensions we could support */ - - p += sprintf(p, "Sec-WebSocket-Extensions: "); -#ifndef LWS_NO_EXTENSIONS - ext = context->extensions; - while (ext && ext->callback) { - - n = lws_ext_callback_for_each_extension_type(context, wsi, - LWS_EXT_CALLBACK_CHECK_OK_TO_PROPOSE_EXTENSION, - (char *)ext->name, 0); - if (n) { /* an extension vetos us */ - lwsl_ext("ext %s vetoed\n", (char *)ext->name); - ext++; - continue; - } - - n = context->protocols[0].callback(context, wsi, - LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED, - wsi->user_space, (char *)ext->name, 0); - - /* - * zero return from callback means - * go ahead and allow the extension, - * it's what we get if the callback is - * unhandled - */ - - if (n) { - ext++; - continue; - } - - /* apply it */ - - if (ext_count) - *p++ = ','; - p += sprintf(p, "%s", ext->name); - ext_count++; - - ext++; - } -#endif - p += sprintf(p, "\x0d\x0a"); - - if (wsi->ietf_spec_revision) - p += sprintf(p, "Sec-WebSocket-Version: %d\x0d\x0a", - wsi->ietf_spec_revision); - - /* give userland a chance to append, eg, cookies */ - - context->protocols[0].callback(context, wsi, - LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER, - NULL, &p, (pkt + sizeof(context->service_buffer)) - p - 12); - - p += sprintf(p, "\x0d\x0a"); - - /* prepare the expected server accept response */ - - key_b64[39] = '\0'; /* enforce composed length below buf sizeof */ - n = sprintf(buf, "%s258EAFA5-E914-47DA-95CA-C5AB0DC85B11", key_b64); - - SHA1((unsigned char *)buf, n, (unsigned char *)hash); - - lws_b64_encode_string(hash, 20, - wsi->u.hdr.ah->initial_handshake_hash_base64, - sizeof(wsi->u.hdr.ah->initial_handshake_hash_base64)); - - return p; -} - diff --git a/core/deps/libwebsocket/config.h b/core/deps/libwebsocket/config.h deleted file mode 100644 index 67d08541f..000000000 --- a/core/deps/libwebsocket/config.h +++ /dev/null @@ -1,4 +0,0 @@ -#include "build.h" - -#define LWS_BUILTIN_GETIFADDRS -#define LWS_NO_DAEMONIZE \ No newline at end of file diff --git a/core/deps/libwebsocket/context.c b/core/deps/libwebsocket/context.c deleted file mode 100644 index c63ab271c..000000000 --- a/core/deps/libwebsocket/context.c +++ /dev/null @@ -1,348 +0,0 @@ -/* - * libwebsockets - small server side websockets and web server implementation - * - * Copyright (C) 2010-2014 Andy Green - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation: - * version 2.1 of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301 USA - */ - -#include "private-libwebsockets.h" - -#ifndef LWS_BUILD_HASH -#define LWS_BUILD_HASH "unknown-build-hash" -#endif - -#ifdef WIN32 -#define getdtablesize() 30000 -#endif - -static const char *library_version = LWS_LIBRARY_VERSION " " LWS_BUILD_HASH; - -/** - * lws_get_library_version: get version and git hash library built from - * - * returns a const char * to a string like "1.1 178d78c" - * representing the library version followed by the git head hash it - * was built from - */ - -LWS_VISIBLE const char * -lws_get_library_version(void) -{ - return library_version; -} - -/** - * libwebsocket_create_context() - Create the websocket handler - * @info: pointer to struct with parameters - * - * This function creates the listening socket (if serving) and takes care - * of all initialization in one step. - * - * After initialization, it returns a struct libwebsocket_context * that - * represents this server. After calling, user code needs to take care - * of calling libwebsocket_service() with the context pointer to get the - * server's sockets serviced. This must be done in the same process - * context as the initialization call. - * - * The protocol callback functions are called for a handful of events - * including http requests coming in, websocket connections becoming - * established, and data arriving; it's also called periodically to allow - * async transmission. - * - * HTTP requests are sent always to the FIRST protocol in @protocol, since - * at that time websocket protocol has not been negotiated. Other - * protocols after the first one never see any HTTP callack activity. - * - * The server created is a simple http server by default; part of the - * websocket standard is upgrading this http connection to a websocket one. - * - * This allows the same server to provide files like scripts and favicon / - * images or whatever over http and dynamic data over websockets all in - * one place; they're all handled in the user callback. - */ - -LWS_VISIBLE struct libwebsocket_context * -libwebsocket_create_context(struct lws_context_creation_info *info) -{ - struct libwebsocket_context *context = NULL; - char *p; - - int pid_daemon = get_daemonize_pid(); - - lwsl_notice("Initial logging level %d\n", log_level); - lwsl_notice("Library version: %s\n", library_version); -#ifdef LWS_USE_IPV6 - if (!(info->options & LWS_SERVER_OPTION_DISABLE_IPV6)) - lwsl_notice("IPV6 compiled in and enabled\n"); - else - lwsl_notice("IPV6 compiled in but disabled\n"); -#else - lwsl_notice("IPV6 not compiled in\n"); -#endif - lws_feature_status_libev(info); - lwsl_info(" LWS_MAX_HEADER_LEN: %u\n", LWS_MAX_HEADER_LEN); - lwsl_info(" LWS_MAX_PROTOCOLS: %u\n", LWS_MAX_PROTOCOLS); - - lwsl_info(" SPEC_LATEST_SUPPORTED: %u\n", SPEC_LATEST_SUPPORTED); - lwsl_info(" AWAITING_TIMEOUT: %u\n", AWAITING_TIMEOUT); - lwsl_info(" SYSTEM_RANDOM_FILEPATH: '%s'\n", SYSTEM_RANDOM_FILEPATH); - lwsl_info(" LWS_MAX_ZLIB_CONN_BUFFER: %u\n", LWS_MAX_ZLIB_CONN_BUFFER); - - if (lws_plat_context_early_init()) - return NULL; - - context = (struct libwebsocket_context *) - malloc(sizeof(struct libwebsocket_context)); - if (!context) { - lwsl_err("No memory for websocket context\n"); - return NULL; - } - memset(context, 0, sizeof(*context)); - - if (pid_daemon) { - context->started_with_parent = pid_daemon; - lwsl_notice(" Started with daemon pid %d\n", pid_daemon); - } - - context->listen_service_extraseen = 0; - context->protocols = info->protocols; - context->listen_port = info->port; - context->http_proxy_port = 0; - context->http_proxy_address[0] = '\0'; - context->options = info->options; - context->iface = info->iface; - /* to reduce this allocation, */ -#ifdef WIN32 - context->max_fds = getdtablesize (); -#else - context->max_fds = sysconf(_SC_OPEN_MAX); -#endif - lwsl_notice(" static allocation: %u + (%u x %u fds) = %u bytes\n", - sizeof(struct libwebsocket_context), - sizeof(struct libwebsocket_pollfd) + - sizeof(struct libwebsocket *), - context->max_fds, - sizeof(struct libwebsocket_context) + - ((sizeof(struct libwebsocket_pollfd) + - sizeof(struct libwebsocket *)) * - context->max_fds)); - - context->fds = (struct libwebsocket_pollfd *) - malloc(sizeof(struct libwebsocket_pollfd) * - context->max_fds); - if (context->fds == NULL) { - lwsl_err("Unable to allocate fds array for %d connections\n", - context->max_fds); - free(context); - return NULL; - } - - context->lws_lookup = (struct libwebsocket **) - malloc(sizeof(struct libwebsocket *) * context->max_fds); - if (context->lws_lookup == NULL) { - lwsl_err( - "Unable to allocate lws_lookup array for %d connections\n", - context->max_fds); - free(context->fds); - free(context); - return NULL; - } - memset(context->lws_lookup, 0, sizeof(struct libwebsocket *) * - context->max_fds); - - if (lws_plat_init_fd_tables(context)) { - free(context->lws_lookup); - free(context->fds); - free(context); - return NULL; - } - - lws_context_init_extensions(info, context); - - context->user_space = info->user; - - strcpy(context->canonical_hostname, "unknown"); - - lws_server_get_canonical_hostname(context, info); - - /* split the proxy ads:port if given */ - - if (info->http_proxy_address) { - strncpy(context->http_proxy_address, info->http_proxy_address, - sizeof(context->http_proxy_address) - 1); - context->http_proxy_address[ - sizeof(context->http_proxy_address) - 1] = '\0'; - context->http_proxy_port = info->http_proxy_port; - } else { -#ifdef HAVE_GETENV - p = getenv("http_proxy"); - if (p) { - strncpy(context->http_proxy_address, p, - sizeof(context->http_proxy_address) - 1); - context->http_proxy_address[ - sizeof(context->http_proxy_address) - 1] = '\0'; - - p = strchr(context->http_proxy_address, ':'); - if (p == NULL) { - lwsl_err("http_proxy needs to be ads:port\n"); - goto bail; - } - *p = '\0'; - context->http_proxy_port = atoi(p + 1); - } -#endif - } - - if (context->http_proxy_address[0]) - lwsl_notice(" Proxy %s:%u\n", - context->http_proxy_address, - context->http_proxy_port); - - lwsl_notice( - " per-conn mem: %u + %u headers + protocol rx buf\n", - sizeof(struct libwebsocket), - sizeof(struct allocated_headers)); - - if (lws_context_init_server_ssl(info, context)) - goto bail; - - if (lws_context_init_client_ssl(info, context)) - goto bail; - - if (lws_context_init_server(info, context)) - goto bail; - - /* - * drop any root privs for this process - * to listen on port < 1023 we would have needed root, but now we are - * listening, we don't want the power for anything else - */ - lws_plat_drop_app_privileges(info); - - /* initialize supported protocols */ - - for (context->count_protocols = 0; - info->protocols[context->count_protocols].callback; - context->count_protocols++) { - - lwsl_parser(" Protocol: %s\n", - info->protocols[context->count_protocols].name); - - info->protocols[context->count_protocols].owning_server = - context; - info->protocols[context->count_protocols].protocol_index = - context->count_protocols; - - /* - * inform all the protocols that they are doing their one-time - * initialization if they want to - */ - info->protocols[context->count_protocols].callback(context, - NULL, LWS_CALLBACK_PROTOCOL_INIT, NULL, NULL, 0); - } - - /* - * give all extensions a chance to create any per-context - * allocations they need - */ - - if (info->port != CONTEXT_PORT_NO_LISTEN) { - if (lws_ext_callback_for_each_extension_type(context, NULL, - LWS_EXT_CALLBACK_SERVER_CONTEXT_CONSTRUCT, - NULL, 0) < 0) - goto bail; - } else - if (lws_ext_callback_for_each_extension_type(context, NULL, - LWS_EXT_CALLBACK_CLIENT_CONTEXT_CONSTRUCT, - NULL, 0) < 0) - goto bail; - - return context; - -bail: - libwebsocket_context_destroy(context); - return NULL; -} - -/** - * libwebsocket_context_destroy() - Destroy the websocket context - * @context: Websocket context - * - * This function closes any active connections and then frees the - * context. After calling this, any further use of the context is - * undefined. - */ -LWS_VISIBLE void -libwebsocket_context_destroy(struct libwebsocket_context *context) -{ - int n; - struct libwebsocket_protocols *protocol = context->protocols; - - lwsl_notice("%s\n", __func__); - -#ifdef LWS_LATENCY - if (context->worst_latency_info[0]) - lwsl_notice("Worst latency: %s\n", context->worst_latency_info); -#endif - - for (n = 0; n < context->fds_count; n++) { - struct libwebsocket *wsi = - context->lws_lookup[context->fds[n].fd]; - if (!wsi) - continue; - libwebsocket_close_and_free_session(context, - wsi, LWS_CLOSE_STATUS_NOSTATUS /* no protocol close */); - n--; - } - - /* - * give all extensions a chance to clean up any per-context - * allocations they might have made - */ - if (context->listen_port) { - if (lws_ext_callback_for_each_extension_type(context, NULL, - LWS_EXT_CALLBACK_SERVER_CONTEXT_DESTRUCT, NULL, 0) < 0) - return; - } else - if (lws_ext_callback_for_each_extension_type(context, NULL, - LWS_EXT_CALLBACK_CLIENT_CONTEXT_DESTRUCT, NULL, 0) < 0) - return; - - /* - * inform all the protocols that they are done and will have no more - * callbacks - */ - - while (protocol->callback) { - protocol->callback(context, NULL, LWS_CALLBACK_PROTOCOL_DESTROY, - NULL, NULL, 0); - protocol++; - } - - lws_plat_context_early_destroy(context); - - lws_ssl_context_destroy(context); - - if (context->fds) - free(context->fds); - if (context->lws_lookup) - free(context->lws_lookup); - - lws_plat_context_late_destroy(context); - - free(context); -} diff --git a/core/deps/libwebsocket/extension-deflate-frame.c b/core/deps/libwebsocket/extension-deflate-frame.c deleted file mode 100644 index 6cf6ac016..000000000 --- a/core/deps/libwebsocket/extension-deflate-frame.c +++ /dev/null @@ -1,294 +0,0 @@ -#include "private-libwebsockets.h" -#include "extension-deflate-frame.h" -#include -#include -#include - -#define LWS_ZLIB_WINDOW_BITS 15 -#define LWS_ZLIB_MEMLEVEL 8 - -int lws_extension_callback_deflate_frame( - struct libwebsocket_context *context, - struct libwebsocket_extension *ext, - struct libwebsocket *wsi, - enum libwebsocket_extension_callback_reasons reason, - void *user, void *in, size_t len) -{ - struct lws_ext_deflate_frame_conn *conn = - (struct lws_ext_deflate_frame_conn *)user; - struct lws_tokens *eff_buf = (struct lws_tokens *)in; - size_t current_payload, remaining_payload, total_payload; - int n; - size_t len_so_far; - - switch (reason) { - - /* - * for deflate-frame, both client and server sides act the same - */ - - case LWS_EXT_CALLBACK_CLIENT_CONSTRUCT: - case LWS_EXT_CALLBACK_CONSTRUCT: - conn->zs_in.zalloc = conn->zs_out.zalloc = Z_NULL; - conn->zs_in.zfree = conn->zs_out.zfree = Z_NULL; - conn->zs_in.opaque = conn->zs_out.opaque = Z_NULL; - n = inflateInit2(&conn->zs_in, -LWS_ZLIB_WINDOW_BITS); - if (n != Z_OK) { - lwsl_ext("deflateInit returned %d\n", n); - return 1; - } - n = deflateInit2(&conn->zs_out, - (context->listen_port ? - DEFLATE_FRAME_COMPRESSION_LEVEL_SERVER : - DEFLATE_FRAME_COMPRESSION_LEVEL_CLIENT), - Z_DEFLATED, - -LWS_ZLIB_WINDOW_BITS, LWS_ZLIB_MEMLEVEL, - Z_DEFAULT_STRATEGY); - if (n != Z_OK) { - lwsl_ext("deflateInit2 returned %d\n", n); - return 1; - } - conn->buf_pre_used = 0; - conn->buf_pre_length = 0; - conn->buf_in_length = sizeof(conn->buf_in); - conn->buf_out_length = sizeof(conn->buf_out); - conn->compressed_out = 0; - conn->buf_pre = NULL; - conn->buf_in = (unsigned char *) - malloc(LWS_SEND_BUFFER_PRE_PADDING + - conn->buf_in_length + - LWS_SEND_BUFFER_POST_PADDING); - if (!conn->buf_in) - goto bail; - conn->buf_out = (unsigned char *) - malloc(LWS_SEND_BUFFER_PRE_PADDING + - conn->buf_out_length + - LWS_SEND_BUFFER_POST_PADDING); - if (!conn->buf_out) - goto bail; - lwsl_ext("zlibs constructed\n"); - break; -bail: - lwsl_err("Out of mem\n"); - (void)inflateEnd(&conn->zs_in); - (void)deflateEnd(&conn->zs_out); - return -1; - - case LWS_EXT_CALLBACK_DESTROY: - if (conn->buf_pre) - free(conn->buf_pre); - free(conn->buf_in); - free(conn->buf_out); - conn->buf_pre_used = 0; - conn->buf_pre_length = 0; - conn->buf_in_length = 0; - conn->buf_out_length = 0; - conn->compressed_out = 0; - (void)inflateEnd(&conn->zs_in); - (void)deflateEnd(&conn->zs_out); - lwsl_ext("zlibs destructed\n"); - break; - - case LWS_EXT_CALLBACK_PAYLOAD_RX: - if (!(wsi->u.ws.rsv & 0x40)) - return 0; - - /* - * inflate the incoming payload - */ - current_payload = eff_buf->token_len; - - remaining_payload = wsi->u.ws.rx_packet_length; - if (remaining_payload) { - total_payload = conn->buf_pre_used + - current_payload + - remaining_payload; - - if (conn->buf_pre_length < total_payload) { - conn->buf_pre_length = total_payload; - if (conn->buf_pre) - free(conn->buf_pre); - conn->buf_pre = - (unsigned char *)malloc(total_payload + 4); - if (!conn->buf_pre) { - lwsl_err("Out of memory\n"); - return -1; - } - } - - memcpy(conn->buf_pre + conn->buf_pre_used, - eff_buf->token, current_payload); - conn->buf_pre_used += current_payload; - - eff_buf->token = NULL; - eff_buf->token_len = 0; - - return 0; - } - if (conn->buf_pre_used) { - total_payload = conn->buf_pre_used + - current_payload; - - memcpy(conn->buf_pre + conn->buf_pre_used, - eff_buf->token, current_payload); - conn->buf_pre_used = 0; - - conn->zs_in.next_in = conn->buf_pre; - } else { - total_payload = current_payload; - - conn->zs_in.next_in = (unsigned char *)eff_buf->token; - } - - conn->zs_in.next_in[total_payload + 0] = 0; - conn->zs_in.next_in[total_payload + 1] = 0; - conn->zs_in.next_in[total_payload + 2] = 0xff; - conn->zs_in.next_in[total_payload + 3] = 0xff; - - conn->zs_in.avail_in = total_payload + 4; - - conn->zs_in.next_out = - conn->buf_in + LWS_SEND_BUFFER_PRE_PADDING; - conn->zs_in.avail_out = conn->buf_in_length; - - while (1) { - n = inflate(&conn->zs_in, Z_SYNC_FLUSH); - switch (n) { - case Z_NEED_DICT: - case Z_STREAM_ERROR: - case Z_DATA_ERROR: - case Z_MEM_ERROR: - /* - * screwed.. close the connection... - * we will get a destroy callback to take care - * of closing nicely - */ - lwsl_info("zlib error inflate %d: %s\n", - n, conn->zs_in.msg); - return -1; - } - - if (conn->zs_in.avail_out) - break; - - len_so_far = conn->zs_in.next_out - - (conn->buf_in + LWS_SEND_BUFFER_PRE_PADDING); - - conn->buf_in_length *= 2; - if (conn->buf_in_length > LWS_MAX_ZLIB_CONN_BUFFER) { - lwsl_ext("zlib in buffer hit limit %u\n", - LWS_MAX_ZLIB_CONN_BUFFER); - return -1; - } - conn->buf_in = (unsigned char *)realloc(conn->buf_in, - LWS_SEND_BUFFER_PRE_PADDING + - conn->buf_in_length + - LWS_SEND_BUFFER_POST_PADDING); - if (!conn->buf_in) { - lwsl_err("Out of memory\n"); - return -1; - } - lwsl_debug( - "deflate-frame ext RX did realloc to %ld\n", - conn->buf_in_length); - conn->zs_in.next_out = conn->buf_in + - LWS_SEND_BUFFER_PRE_PADDING + len_so_far; - conn->zs_in.avail_out = - conn->buf_in_length - len_so_far; - } - - /* rewrite the buffer pointers and length */ - eff_buf->token = - (char *)(conn->buf_in + LWS_SEND_BUFFER_PRE_PADDING); - eff_buf->token_len = (int)(conn->zs_in.next_out - - (conn->buf_in + LWS_SEND_BUFFER_PRE_PADDING)); - - return 0; - - case LWS_EXT_CALLBACK_PAYLOAD_TX: - /* - * deflate the outgoing payload - */ - current_payload = eff_buf->token_len; - - conn->zs_out.next_in = (unsigned char *)eff_buf->token; - conn->zs_out.avail_in = current_payload; - - conn->zs_out.next_out = - conn->buf_out + LWS_SEND_BUFFER_PRE_PADDING; - conn->zs_out.avail_out = conn->buf_out_length; - - while (1) { - n = deflate(&conn->zs_out, Z_SYNC_FLUSH); - if (n == Z_STREAM_ERROR) { - /* - * screwed.. close the connection... we will - * get a destroy callback to take care of - * closing nicely - */ - lwsl_ext("zlib error deflate\n"); - - return -1; - } - - if (conn->zs_out.avail_out) - break; - - len_so_far = (conn->zs_out.next_out - - (conn->buf_out + - LWS_SEND_BUFFER_PRE_PADDING)); - conn->buf_out_length *= 2; - if (conn->buf_out_length > LWS_MAX_ZLIB_CONN_BUFFER) { - lwsl_ext("zlib out hit limit %u\n", - LWS_MAX_ZLIB_CONN_BUFFER); - return -1; - } - conn->buf_out = (unsigned char *)realloc( - conn->buf_out, - LWS_SEND_BUFFER_PRE_PADDING + - conn->buf_out_length + - LWS_SEND_BUFFER_POST_PADDING); - if (!conn->buf_out) { - lwsl_err("Out of memory\n"); - return -1; - } - lwsl_debug( - "deflate-frame ext TX did realloc to %ld\n", - conn->buf_in_length); - - conn->zs_out.next_out = (conn->buf_out + - LWS_SEND_BUFFER_PRE_PADDING + len_so_far); - conn->zs_out.avail_out = - (conn->buf_out_length - len_so_far); - } - - conn->compressed_out = 1; - - /* rewrite the buffer pointers and length */ - eff_buf->token = (char *)(conn->buf_out + - LWS_SEND_BUFFER_PRE_PADDING); - eff_buf->token_len = (int)(conn->zs_out.next_out - - (conn->buf_out + LWS_SEND_BUFFER_PRE_PADDING)) - 4; - - return 0; - - case LWS_EXT_CALLBACK_PACKET_TX_PRESEND: - if (conn->compressed_out) { - conn->compressed_out = 0; - *((unsigned char *)eff_buf->token) |= 0x40; - } - break; - - case LWS_EXT_CALLBACK_CHECK_OK_TO_PROPOSE_EXTENSION: - /* Avoid x-webkit-deflate-frame extension on client */ - if (!strcmp((char *)in, "x-webkit-deflate-frame")) - return 1; - break; - - default: - break; - } - - return 0; -} - diff --git a/core/deps/libwebsocket/extension-deflate-frame.h b/core/deps/libwebsocket/extension-deflate-frame.h deleted file mode 100644 index 685cdebf9..000000000 --- a/core/deps/libwebsocket/extension-deflate-frame.h +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once -#include "deps/zlib/zlib.h" - -#define DEFLATE_FRAME_COMPRESSION_LEVEL_SERVER 1 -#define DEFLATE_FRAME_COMPRESSION_LEVEL_CLIENT Z_DEFAULT_COMPRESSION - -struct lws_ext_deflate_frame_conn { - z_stream zs_in; - z_stream zs_out; - size_t buf_pre_used; - size_t buf_pre_length; - size_t buf_in_length; - size_t buf_out_length; - int compressed_out; - unsigned char *buf_pre; - unsigned char *buf_in; - unsigned char *buf_out; -}; - -extern int lws_extension_callback_deflate_frame( - struct libwebsocket_context *context, - struct libwebsocket_extension *ext, - struct libwebsocket *wsi, - enum libwebsocket_extension_callback_reasons reason, - void *user, void *in, size_t len); diff --git a/core/deps/libwebsocket/extension-deflate-stream.c b/core/deps/libwebsocket/extension-deflate-stream.c deleted file mode 100644 index addaa2c7e..000000000 --- a/core/deps/libwebsocket/extension-deflate-stream.c +++ /dev/null @@ -1,166 +0,0 @@ -#include "private-libwebsockets.h" -#include "extension-deflate-stream.h" -#include -#include -#include - -#define LWS_ZLIB_WINDOW_BITS 15 -#define LWS_ZLIB_MEMLEVEL 8 - -int lws_extension_callback_deflate_stream( - struct libwebsocket_context *context, - struct libwebsocket_extension *ext, - struct libwebsocket *wsi, - enum libwebsocket_extension_callback_reasons reason, - void *user, void *in, size_t len) -{ - struct lws_ext_deflate_stream_conn *conn = - (struct lws_ext_deflate_stream_conn *)user; - int n; - struct lws_tokens *eff_buf = (struct lws_tokens *)in; - - switch (reason) { - - /* - * for deflate-stream, both client and server sides act the same - */ - - case LWS_EXT_CALLBACK_CLIENT_CONSTRUCT: - case LWS_EXT_CALLBACK_CONSTRUCT: - conn->zs_in.zalloc = conn->zs_out.zalloc = Z_NULL; - conn->zs_in.zfree = conn->zs_out.zfree = Z_NULL; - conn->zs_in.opaque = conn->zs_out.opaque = Z_NULL; - n = inflateInit2(&conn->zs_in, -LWS_ZLIB_WINDOW_BITS); - if (n != Z_OK) { - lwsl_err("deflateInit returned %d\n", n); - return 1; - } - n = deflateInit2(&conn->zs_out, - DEFLATE_STREAM_COMPRESSION_LEVEL, Z_DEFLATED, - -LWS_ZLIB_WINDOW_BITS, LWS_ZLIB_MEMLEVEL, - Z_DEFAULT_STRATEGY); - if (n != Z_OK) { - lwsl_err("deflateInit returned %d\n", n); - return 1; - } - lwsl_ext("zlibs constructed\n"); - conn->remaining_in = 0; - break; - - case LWS_EXT_CALLBACK_DESTROY: - (void)inflateEnd(&conn->zs_in); - (void)deflateEnd(&conn->zs_out); - lwsl_ext("zlibs destructed\n"); - break; - - case LWS_EXT_CALLBACK_PACKET_RX_PREPARSE: - - /* - * inflate the incoming compressed data - * Notice, length may be 0 and pointer NULL - * in the case we are flushing with nothing new coming in - */ - if (conn->remaining_in) { - conn->zs_in.next_in = conn->buf_in; - conn->zs_in.avail_in = conn->remaining_in; - conn->remaining_in = 0; - } else { - conn->zs_in.next_in = (unsigned char *)eff_buf->token; - conn->zs_in.avail_in = eff_buf->token_len; - } - - conn->zs_in.next_out = conn->buf_out; - conn->zs_in.avail_out = sizeof(conn->buf_out); - - n = inflate(&conn->zs_in, Z_SYNC_FLUSH); - switch (n) { - case Z_NEED_DICT: - case Z_DATA_ERROR: - case Z_MEM_ERROR: - /* - * screwed.. close the connection... we will get a - * destroy callback to take care of closing nicely - */ - lwsl_err("zlib error inflate %d\n", n); - return -1; - } - - /* rewrite the buffer pointers and length */ - - eff_buf->token = (char *)conn->buf_out; - eff_buf->token_len = - sizeof(conn->buf_out) - conn->zs_in.avail_out; - - /* copy avail data if not consumed */ - if (conn->zs_in.avail_in > 0) { - conn->remaining_in = conn->zs_in.avail_in; - memcpy(conn->buf_in, conn->zs_in.next_in, - conn->zs_in.avail_in); - return 1; - } - - /* - * if we filled the output buffer, signal that we likely have - * more and need to be called again - */ - - if (eff_buf->token_len == sizeof(conn->buf_out)) - return 1; - - /* we don't need calling again until new input data comes */ - - return 0; - - case LWS_EXT_CALLBACK_FLUSH_PENDING_TX: - case LWS_EXT_CALLBACK_PACKET_TX_PRESEND: - - /* - * deflate the outgoing compressed data - */ - - conn->zs_out.next_in = (unsigned char *)eff_buf->token; - conn->zs_out.avail_in = eff_buf->token_len; - - conn->zs_out.next_out = conn->buf_out; - conn->zs_out.avail_out = sizeof(conn->buf_out); - - n = Z_PARTIAL_FLUSH; - if (reason == LWS_EXT_CALLBACK_FLUSH_PENDING_TX) - n = Z_FULL_FLUSH; - - n = deflate(&conn->zs_out, n); - if (n == Z_STREAM_ERROR) { - /* - * screwed.. close the connection... we will get a - * destroy callback to take care of closing nicely - */ - lwsl_ext("zlib error deflate\n"); - - return -1; - } - - /* rewrite the buffer pointers and length */ - - eff_buf->token = (char *)conn->buf_out; - eff_buf->token_len = - sizeof(conn->buf_out) - conn->zs_out.avail_out; - - /* - * if we filled the output buffer, signal that we likely have - * more and need to be called again... even in deflate case - * we might sometimes need to spill more than came in - */ - - if (eff_buf->token_len == sizeof(conn->buf_out)) - return 1; - - /* we don't need calling again until new input data comes */ - - return 0; - - default: - break; - } - - return 0; -} diff --git a/core/deps/libwebsocket/extension-deflate-stream.h b/core/deps/libwebsocket/extension-deflate-stream.h deleted file mode 100644 index ff17741fd..000000000 --- a/core/deps/libwebsocket/extension-deflate-stream.h +++ /dev/null @@ -1,20 +0,0 @@ - -#include "deps/zlib/zlib.h" - -#define DEFLATE_STREAM_CHUNK 128 -#define DEFLATE_STREAM_COMPRESSION_LEVEL 1 - -struct lws_ext_deflate_stream_conn { - z_stream zs_in; - z_stream zs_out; - int remaining_in; - unsigned char buf_in[LWS_MAX_SOCKET_IO_BUF]; - unsigned char buf_out[LWS_MAX_SOCKET_IO_BUF]; -}; - -extern int lws_extension_callback_deflate_stream( - struct libwebsocket_context *context, - struct libwebsocket_extension *ext, - struct libwebsocket *wsi, - enum libwebsocket_extension_callback_reasons reason, - void *user, void *in, size_t len); diff --git a/core/deps/libwebsocket/extension.c b/core/deps/libwebsocket/extension.c deleted file mode 100644 index 52510a919..000000000 --- a/core/deps/libwebsocket/extension.c +++ /dev/null @@ -1,206 +0,0 @@ -#include "private-libwebsockets.h" - -#include "extension-deflate-frame.h" -#include "extension-deflate-stream.h" - -struct libwebsocket_extension libwebsocket_internal_extensions[] = { -#ifdef LWS_EXT_DEFLATE_STREAM - { - "deflate-stream", - lws_extension_callback_deflate_stream, - sizeof(struct lws_ext_deflate_stream_conn) - }, -#else - { - "x-webkit-deflate-frame", - lws_extension_callback_deflate_frame, - sizeof(struct lws_ext_deflate_frame_conn) - }, - { - "deflate-frame", - lws_extension_callback_deflate_frame, - sizeof(struct lws_ext_deflate_frame_conn) - }, -#endif - { /* terminator */ - NULL, NULL, 0 - } -}; - -LWS_VISIBLE void -lws_context_init_extensions(struct lws_context_creation_info *info, - struct libwebsocket_context *context) -{ - context->extensions = info->extensions; - lwsl_info(" LWS_MAX_EXTENSIONS_ACTIVE: %u\n", LWS_MAX_EXTENSIONS_ACTIVE); -} - -LWS_VISIBLE struct libwebsocket_extension *libwebsocket_get_internal_extensions() -{ - return libwebsocket_internal_extensions; -} - - -/* 0 = nobody had nonzero return, 1 = somebody had positive return, -1 = fail */ - -int lws_ext_callback_for_each_active(struct libwebsocket *wsi, int reason, - void *arg, int len) -{ - int n, m, handled = 0; - - for (n = 0; n < wsi->count_active_extensions; n++) { - m = wsi->active_extensions[n]->callback( - wsi->protocol->owning_server, - wsi->active_extensions[n], wsi, - reason, - wsi->active_extensions_user[n], - arg, len); - if (m < 0) { - lwsl_ext( - "Extension '%s' failed to handle callback %d!\n", - wsi->active_extensions[n]->name, reason); - return -1; - } - if (m > handled) - handled = m; - } - - return handled; -} - -int lws_ext_callback_for_each_extension_type( - struct libwebsocket_context *context, struct libwebsocket *wsi, - int reason, void *arg, int len) -{ - int n = 0, m, handled = 0; - struct libwebsocket_extension *ext = context->extensions; - - while (ext && ext->callback && !handled) { - m = ext->callback(context, ext, wsi, reason, - (void *)(long)n, arg, len); - if (m < 0) { - lwsl_ext( - "Extension '%s' failed to handle callback %d!\n", - wsi->active_extensions[n]->name, reason); - return -1; - } - if (m) - handled = 1; - - ext++; - n++; - } - - return 0; -} - -int -lws_issue_raw_ext_access(struct libwebsocket *wsi, - unsigned char *buf, size_t len) -{ - int ret; - struct lws_tokens eff_buf; - int m; - int n; - - eff_buf.token = (char *)buf; - eff_buf.token_len = len; - - /* - * while we have original buf to spill ourselves, or extensions report - * more in their pipeline - */ - - ret = 1; - while (ret == 1) { - - /* default to nobody has more to spill */ - - ret = 0; - - /* show every extension the new incoming data */ - m = lws_ext_callback_for_each_active(wsi, - LWS_EXT_CALLBACK_PACKET_TX_PRESEND, &eff_buf, 0); - if (m < 0) - return -1; - if (m) /* handled */ - ret = 1; - - if ((char *)buf != eff_buf.token) - /* - * extension recreated it: - * need to buffer this if not all sent - */ - wsi->u.ws.clean_buffer = 0; - - /* assuming they left us something to send, send it */ - - if (eff_buf.token_len) { - n = lws_issue_raw(wsi, (unsigned char *)eff_buf.token, - eff_buf.token_len); - if (n < 0) { - lwsl_info("closing from ext access\n"); - return -1; - } - - /* always either sent it all or privately buffered */ - } - - lwsl_parser("written %d bytes to client\n", eff_buf.token_len); - - /* no extension has more to spill? Then we can go */ - - if (!ret) - break; - - /* we used up what we had */ - - eff_buf.token = NULL; - eff_buf.token_len = 0; - - /* - * Did that leave the pipe choked? - * Or we had to hold on to some of it? - */ - - if (!lws_send_pipe_choked(wsi) && !wsi->truncated_send_len) - /* no we could add more, lets's do that */ - continue; - - lwsl_debug("choked\n"); - - /* - * Yes, he's choked. Don't spill the rest now get a callback - * when he is ready to send and take care of it there - */ - libwebsocket_callback_on_writable( - wsi->protocol->owning_server, wsi); - wsi->extension_data_pending = 1; - ret = 0; - } - - return len; -} - -int -lws_any_extension_handled(struct libwebsocket_context *context, - struct libwebsocket *wsi, - enum libwebsocket_extension_callback_reasons r, - void *v, size_t len) -{ - int n; - int handled = 0; - - /* maybe an extension will take care of it for us */ - - for (n = 0; n < wsi->count_active_extensions && !handled; n++) { - if (!wsi->active_extensions[n]->callback) - continue; - - handled |= wsi->active_extensions[n]->callback(context, - wsi->active_extensions[n], wsi, - r, wsi->active_extensions_user[n], v, len); - } - - return handled; -} diff --git a/core/deps/libwebsocket/handshake.c b/core/deps/libwebsocket/handshake.c deleted file mode 100644 index 25dd3cc6f..000000000 --- a/core/deps/libwebsocket/handshake.c +++ /dev/null @@ -1,171 +0,0 @@ -/* - * libwebsockets - small server side websockets and web server implementation - * - * Copyright (C) 2010-2013 Andy Green - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation: - * version 2.1 of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301 USA - */ - -#include "private-libwebsockets.h" - -/* - * -04 of the protocol (actually the 80th version) has a radically different - * handshake. The 04 spec gives the following idea - * - * The handshake from the client looks as follows: - * - * GET /chat HTTP/1.1 - * Host: server.example.com - * Upgrade: websocket - * Connection: Upgrade - * Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== - * Sec-WebSocket-Origin: http://example.com - * Sec-WebSocket-Protocol: chat, superchat - * Sec-WebSocket-Version: 4 - * - * The handshake from the server looks as follows: - * - * HTTP/1.1 101 Switching Protocols - * Upgrade: websocket - * Connection: Upgrade - * Sec-WebSocket-Accept: me89jWimTRKTWwrS3aRrL53YZSo= - * Sec-WebSocket-Nonce: AQIDBAUGBwgJCgsMDQ4PEC== - * Sec-WebSocket-Protocol: chat - */ - -/* - * We have to take care about parsing because the headers may be split - * into multiple fragments. They may contain unknown headers with arbitrary - * argument lengths. So, we parse using a single-character at a time state - * machine that is completely independent of packet size. - */ - -LWS_VISIBLE int -libwebsocket_read(struct libwebsocket_context *context, - struct libwebsocket *wsi, unsigned char *buf, size_t len) -{ - size_t n; - - switch (wsi->state) { - - case WSI_STATE_HTTP_BODY: -http_postbody: - while (len--) { - - if (wsi->u.http.content_length_seen >= wsi->u.http.content_length) - break; - - wsi->u.http.post_buffer[wsi->u.http.body_index++] = *buf++; - wsi->u.http.content_length_seen++; - n = wsi->protocol->rx_buffer_size; - if (!n) - n = LWS_MAX_SOCKET_IO_BUF; - - if (wsi->u.http.body_index != n && - wsi->u.http.content_length_seen != wsi->u.http.content_length) - continue; - - if (wsi->protocol->callback) { - n = wsi->protocol->callback( - wsi->protocol->owning_server, wsi, - LWS_CALLBACK_HTTP_BODY, - wsi->user_space, wsi->u.http.post_buffer, - wsi->u.http.body_index); - wsi->u.http.body_index = 0; - if (n) - goto bail; - } - - if (wsi->u.http.content_length_seen == wsi->u.http.content_length) { - /* he sent the content in time */ - libwebsocket_set_timeout(wsi, NO_PENDING_TIMEOUT, 0); - n = wsi->protocol->callback( - wsi->protocol->owning_server, wsi, - LWS_CALLBACK_HTTP_BODY_COMPLETION, - wsi->user_space, NULL, 0); - wsi->u.http.body_index = 0; - if (n) - goto bail; - } - - } - - /* - * we need to spill here so everything is seen in the case - * there is no content-length - */ - if (wsi->u.http.body_index && wsi->protocol->callback) { - n = wsi->protocol->callback( - wsi->protocol->owning_server, wsi, - LWS_CALLBACK_HTTP_BODY, - wsi->user_space, wsi->u.http.post_buffer, - wsi->u.http.body_index); - wsi->u.http.body_index = 0; - if (n) - goto bail; - } - break; - - case WSI_STATE_HTTP_ISSUING_FILE: - case WSI_STATE_HTTP: - wsi->state = WSI_STATE_HTTP_HEADERS; - wsi->u.hdr.parser_state = WSI_TOKEN_NAME_PART; - wsi->u.hdr.lextable_pos = 0; - /* fallthru */ - case WSI_STATE_HTTP_HEADERS: - - lwsl_parser("issuing %d bytes to parser\n", (int)len); - - if (lws_handshake_client(wsi, &buf, len)) - goto bail; - - switch (lws_handshake_server(context, wsi, &buf, len)) { - case 1: - goto bail; - case 2: - goto http_postbody; - } - break; - - case WSI_STATE_AWAITING_CLOSE_ACK: - case WSI_STATE_ESTABLISHED: - if (lws_handshake_client(wsi, &buf, len)) - goto bail; - switch (wsi->mode) { - case LWS_CONNMODE_WS_SERVING: - - if (libwebsocket_interpret_incoming_packet(wsi, buf, len) < 0) { - lwsl_info("interpret_incoming_packet has bailed\n"); - goto bail; - } - break; - } - break; - default: - lwsl_err("libwebsocket_read: Unhandled state\n"); - break; - } - - return 0; - -bail: - lwsl_debug("closing connection at libwebsocket_read bail:\n"); - - libwebsocket_close_and_free_session(context, wsi, - LWS_CLOSE_STATUS_NOSTATUS); - - return -1; -} diff --git a/core/deps/libwebsocket/lextable.h b/core/deps/libwebsocket/lextable.h deleted file mode 100644 index 43dbda9ab..000000000 --- a/core/deps/libwebsocket/lextable.h +++ /dev/null @@ -1,287 +0,0 @@ -/* pos 0000: 0 */ 0x67 /* 'g' */, 0x25, 0x00 /* (to 0x0025 state 1) */, - 0x70 /* 'p' */, 0x27, 0x00 /* (to 0x002A state 5) */, - 0x68 /* 'h' */, 0x30, 0x00 /* (to 0x0036 state 10) */, - 0x63 /* 'c' */, 0x39, 0x00 /* (to 0x0042 state 15) */, - 0x73 /* 's' */, 0x54, 0x00 /* (to 0x0060 state 26) */, - 0x75 /* 'u' */, 0x93, 0x00 /* (to 0x00A2 state 56) */, - 0x6F /* 'o' */, 0x99, 0x00 /* (to 0x00AB state 64) */, - 0x0D /* '.' */, 0xA5, 0x00 /* (to 0x00BA state 77) */, - 0x61 /* 'a' */, 0xDC, 0x00 /* (to 0x00F4 state 127) */, - 0x69 /* 'i' */, 0xED, 0x00 /* (to 0x0108 state 134) */, - 0x64 /* 'd' */, 0x5A, 0x01 /* (to 0x0178 state 225) */, - 0x72 /* 'r' */, 0x5D, 0x01 /* (to 0x017E state 230) */, - 0x08, /* fail */ -/* pos 0025: 1 */ 0xE5 /* 'e' -> */, -/* pos 0026: 2 */ 0xF4 /* 't' -> */, -/* pos 0027: 3 */ 0xA0 /* ' ' -> */, -/* pos 0028: 4 */ 0x00, 0x00 /* - terminal marker 0 - */, -/* pos 002a: 5 */ 0x6F /* 'o' */, 0x07, 0x00 /* (to 0x0031 state 6) */, - 0x72 /* 'r' */, 0x09, 0x01 /* (to 0x0136 state 171) */, - 0x08, /* fail */ -/* pos 0031: 6 */ 0xF3 /* 's' -> */, -/* pos 0032: 7 */ 0xF4 /* 't' -> */, -/* pos 0033: 8 */ 0xA0 /* ' ' -> */, -/* pos 0034: 9 */ 0x00, 0x01 /* - terminal marker 1 - */, -/* pos 0036: 10 */ 0x6F /* 'o' */, 0x07, 0x00 /* (to 0x003D state 11) */, - 0x74 /* 't' */, 0xB2, 0x00 /* (to 0x00EB state 119) */, - 0x08, /* fail */ -/* pos 003d: 11 */ 0xF3 /* 's' -> */, -/* pos 003e: 12 */ 0xF4 /* 't' -> */, -/* pos 003f: 13 */ 0xBA /* ':' -> */, -/* pos 0040: 14 */ 0x00, 0x02 /* - terminal marker 2 - */, -/* pos 0042: 15 */ 0x6F /* 'o' */, 0x07, 0x00 /* (to 0x0049 state 16) */, - 0x61 /* 'a' */, 0xF8, 0x00 /* (to 0x013D state 177) */, - 0x08, /* fail */ -/* pos 0049: 16 */ 0x6E /* 'n' */, 0x07, 0x00 /* (to 0x0050 state 17) */, - 0x6F /* 'o' */, 0x0D, 0x01 /* (to 0x0159 state 203) */, - 0x08, /* fail */ -/* pos 0050: 17 */ 0x6E /* 'n' */, 0x07, 0x00 /* (to 0x0057 state 18) */, - 0x74 /* 't' */, 0x0C, 0x01 /* (to 0x015F state 208) */, - 0x08, /* fail */ -/* pos 0057: 18 */ 0xE5 /* 'e' -> */, -/* pos 0058: 19 */ 0xE3 /* 'c' -> */, -/* pos 0059: 20 */ 0xF4 /* 't' -> */, -/* pos 005a: 21 */ 0xE9 /* 'i' -> */, -/* pos 005b: 22 */ 0xEF /* 'o' -> */, -/* pos 005c: 23 */ 0xEE /* 'n' -> */, -/* pos 005d: 24 */ 0xBA /* ':' -> */, -/* pos 005e: 25 */ 0x00, 0x03 /* - terminal marker 3 - */, -/* pos 0060: 26 */ 0xE5 /* 'e' -> */, -/* pos 0061: 27 */ 0xE3 /* 'c' -> */, -/* pos 0062: 28 */ 0xAD /* '-' -> */, -/* pos 0063: 29 */ 0xF7 /* 'w' -> */, -/* pos 0064: 30 */ 0xE5 /* 'e' -> */, -/* pos 0065: 31 */ 0xE2 /* 'b' -> */, -/* pos 0066: 32 */ 0xF3 /* 's' -> */, -/* pos 0067: 33 */ 0xEF /* 'o' -> */, -/* pos 0068: 34 */ 0xE3 /* 'c' -> */, -/* pos 0069: 35 */ 0xEB /* 'k' -> */, -/* pos 006a: 36 */ 0xE5 /* 'e' -> */, -/* pos 006b: 37 */ 0xF4 /* 't' -> */, -/* pos 006c: 38 */ 0xAD /* '-' -> */, -/* pos 006d: 39 */ 0x6B /* 'k' */, 0x19, 0x00 /* (to 0x0086 state 40) */, - 0x70 /* 'p' */, 0x28, 0x00 /* (to 0x0098 state 47) */, - 0x64 /* 'd' */, 0x40, 0x00 /* (to 0x00B3 state 71) */, - 0x76 /* 'v' */, 0x49, 0x00 /* (to 0x00BF state 80) */, - 0x6F /* 'o' */, 0x4F, 0x00 /* (to 0x00C8 state 88) */, - 0x65 /* 'e' */, 0x54, 0x00 /* (to 0x00D0 state 95) */, - 0x61 /* 'a' */, 0x5D, 0x00 /* (to 0x00DC state 106) */, - 0x6E /* 'n' */, 0x62, 0x00 /* (to 0x00E4 state 113) */, - 0x08, /* fail */ -/* pos 0086: 40 */ 0xE5 /* 'e' -> */, -/* pos 0087: 41 */ 0xF9 /* 'y' -> */, -/* pos 0088: 42 */ 0x31 /* '1' */, 0x0A, 0x00 /* (to 0x0092 state 43) */, - 0x32 /* '2' */, 0x0A, 0x00 /* (to 0x0095 state 45) */, - 0x3A /* ':' */, 0x2F, 0x00 /* (to 0x00BD state 79) */, - 0x08, /* fail */ -/* pos 0092: 43 */ 0xBA /* ':' -> */, -/* pos 0093: 44 */ 0x00, 0x04 /* - terminal marker 4 - */, -/* pos 0095: 45 */ 0xBA /* ':' -> */, -/* pos 0096: 46 */ 0x00, 0x05 /* - terminal marker 5 - */, -/* pos 0098: 47 */ 0xF2 /* 'r' -> */, -/* pos 0099: 48 */ 0xEF /* 'o' -> */, -/* pos 009a: 49 */ 0xF4 /* 't' -> */, -/* pos 009b: 50 */ 0xEF /* 'o' -> */, -/* pos 009c: 51 */ 0xE3 /* 'c' -> */, -/* pos 009d: 52 */ 0xEF /* 'o' -> */, -/* pos 009e: 53 */ 0xEC /* 'l' -> */, -/* pos 009f: 54 */ 0xBA /* ':' -> */, -/* pos 00a0: 55 */ 0x00, 0x06 /* - terminal marker 6 - */, -/* pos 00a2: 56 */ 0xF0 /* 'p' -> */, -/* pos 00a3: 57 */ 0xE7 /* 'g' -> */, -/* pos 00a4: 58 */ 0xF2 /* 'r' -> */, -/* pos 00a5: 59 */ 0xE1 /* 'a' -> */, -/* pos 00a6: 60 */ 0xE4 /* 'd' -> */, -/* pos 00a7: 61 */ 0xE5 /* 'e' -> */, -/* pos 00a8: 62 */ 0xBA /* ':' -> */, -/* pos 00a9: 63 */ 0x00, 0x07 /* - terminal marker 7 - */, -/* pos 00ab: 64 */ 0xF2 /* 'r' -> */, -/* pos 00ac: 65 */ 0xE9 /* 'i' -> */, -/* pos 00ad: 66 */ 0xE7 /* 'g' -> */, -/* pos 00ae: 67 */ 0xE9 /* 'i' -> */, -/* pos 00af: 68 */ 0xEE /* 'n' -> */, -/* pos 00b0: 69 */ 0xBA /* ':' -> */, -/* pos 00b1: 70 */ 0x00, 0x08 /* - terminal marker 8 - */, -/* pos 00b3: 71 */ 0xF2 /* 'r' -> */, -/* pos 00b4: 72 */ 0xE1 /* 'a' -> */, -/* pos 00b5: 73 */ 0xE6 /* 'f' -> */, -/* pos 00b6: 74 */ 0xF4 /* 't' -> */, -/* pos 00b7: 75 */ 0xBA /* ':' -> */, -/* pos 00b8: 76 */ 0x00, 0x09 /* - terminal marker 9 - */, -/* pos 00ba: 77 */ 0x8A /* '.' -> */, -/* pos 00bb: 78 */ 0x00, 0x0A /* - terminal marker 10 - */, -/* pos 00bd: 79 */ 0x00, 0x0B /* - terminal marker 11 - */, -/* pos 00bf: 80 */ 0xE5 /* 'e' -> */, -/* pos 00c0: 81 */ 0xF2 /* 'r' -> */, -/* pos 00c1: 82 */ 0xF3 /* 's' -> */, -/* pos 00c2: 83 */ 0xE9 /* 'i' -> */, -/* pos 00c3: 84 */ 0xEF /* 'o' -> */, -/* pos 00c4: 85 */ 0xEE /* 'n' -> */, -/* pos 00c5: 86 */ 0xBA /* ':' -> */, -/* pos 00c6: 87 */ 0x00, 0x0C /* - terminal marker 12 - */, -/* pos 00c8: 88 */ 0xF2 /* 'r' -> */, -/* pos 00c9: 89 */ 0xE9 /* 'i' -> */, -/* pos 00ca: 90 */ 0xE7 /* 'g' -> */, -/* pos 00cb: 91 */ 0xE9 /* 'i' -> */, -/* pos 00cc: 92 */ 0xEE /* 'n' -> */, -/* pos 00cd: 93 */ 0xBA /* ':' -> */, -/* pos 00ce: 94 */ 0x00, 0x0D /* - terminal marker 13 - */, -/* pos 00d0: 95 */ 0xF8 /* 'x' -> */, -/* pos 00d1: 96 */ 0xF4 /* 't' -> */, -/* pos 00d2: 97 */ 0xE5 /* 'e' -> */, -/* pos 00d3: 98 */ 0xEE /* 'n' -> */, -/* pos 00d4: 99 */ 0xF3 /* 's' -> */, -/* pos 00d5: 100 */ 0xE9 /* 'i' -> */, -/* pos 00d6: 101 */ 0xEF /* 'o' -> */, -/* pos 00d7: 102 */ 0xEE /* 'n' -> */, -/* pos 00d8: 103 */ 0xF3 /* 's' -> */, -/* pos 00d9: 104 */ 0xBA /* ':' -> */, -/* pos 00da: 105 */ 0x00, 0x0E /* - terminal marker 14 - */, -/* pos 00dc: 106 */ 0xE3 /* 'c' -> */, -/* pos 00dd: 107 */ 0xE3 /* 'c' -> */, -/* pos 00de: 108 */ 0xE5 /* 'e' -> */, -/* pos 00df: 109 */ 0xF0 /* 'p' -> */, -/* pos 00e0: 110 */ 0xF4 /* 't' -> */, -/* pos 00e1: 111 */ 0xBA /* ':' -> */, -/* pos 00e2: 112 */ 0x00, 0x0F /* - terminal marker 15 - */, -/* pos 00e4: 113 */ 0xEF /* 'o' -> */, -/* pos 00e5: 114 */ 0xEE /* 'n' -> */, -/* pos 00e6: 115 */ 0xE3 /* 'c' -> */, -/* pos 00e7: 116 */ 0xE5 /* 'e' -> */, -/* pos 00e8: 117 */ 0xBA /* ':' -> */, -/* pos 00e9: 118 */ 0x00, 0x10 /* - terminal marker 16 - */, -/* pos 00eb: 119 */ 0xF4 /* 't' -> */, -/* pos 00ec: 120 */ 0xF0 /* 'p' -> */, -/* pos 00ed: 121 */ 0xAF /* '/' -> */, -/* pos 00ee: 122 */ 0xB1 /* '1' -> */, -/* pos 00ef: 123 */ 0xAE /* '.' -> */, -/* pos 00f0: 124 */ 0xB1 /* '1' -> */, -/* pos 00f1: 125 */ 0xA0 /* ' ' -> */, -/* pos 00f2: 126 */ 0x00, 0x11 /* - terminal marker 17 - */, -/* pos 00f4: 127 */ 0x63 /* 'c' */, 0x07, 0x00 /* (to 0x00FB state 128) */, - 0x75 /* 'u' */, 0x54, 0x00 /* (to 0x014B state 190) */, - 0x08, /* fail */ -/* pos 00fb: 128 */ 0xE3 /* 'c' -> */, -/* pos 00fc: 129 */ 0xE5 /* 'e' -> */, -/* pos 00fd: 130 */ 0xF0 /* 'p' -> */, -/* pos 00fe: 131 */ 0xF4 /* 't' -> */, -/* pos 00ff: 132 */ 0x3A /* ':' */, 0x07, 0x00 /* (to 0x0106 state 133) */, - 0x2D /* '-' */, 0x19, 0x00 /* (to 0x011B state 152) */, - 0x08, /* fail */ -/* pos 0106: 133 */ 0x00, 0x12 /* - terminal marker 18 - */, -/* pos 0108: 134 */ 0xE6 /* 'f' -> */, -/* pos 0109: 135 */ 0xAD /* '-' -> */, -/* pos 010a: 136 */ 0xED /* 'm' -> */, -/* pos 010b: 137 */ 0xEF /* 'o' -> */, -/* pos 010c: 138 */ 0xE4 /* 'd' -> */, -/* pos 010d: 139 */ 0xE9 /* 'i' -> */, -/* pos 010e: 140 */ 0xE6 /* 'f' -> */, -/* pos 010f: 141 */ 0xE9 /* 'i' -> */, -/* pos 0110: 142 */ 0xE5 /* 'e' -> */, -/* pos 0111: 143 */ 0xE4 /* 'd' -> */, -/* pos 0112: 144 */ 0xAD /* '-' -> */, -/* pos 0113: 145 */ 0xF3 /* 's' -> */, -/* pos 0114: 146 */ 0xE9 /* 'i' -> */, -/* pos 0115: 147 */ 0xEE /* 'n' -> */, -/* pos 0116: 148 */ 0xE3 /* 'c' -> */, -/* pos 0117: 149 */ 0xE5 /* 'e' -> */, -/* pos 0118: 150 */ 0xBA /* ':' -> */, -/* pos 0119: 151 */ 0x00, 0x13 /* - terminal marker 19 - */, -/* pos 011b: 152 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x0122 state 153) */, - 0x6C /* 'l' */, 0x0E, 0x00 /* (to 0x012C state 162) */, - 0x08, /* fail */ -/* pos 0122: 153 */ 0xEE /* 'n' -> */, -/* pos 0123: 154 */ 0xE3 /* 'c' -> */, -/* pos 0124: 155 */ 0xEF /* 'o' -> */, -/* pos 0125: 156 */ 0xE4 /* 'd' -> */, -/* pos 0126: 157 */ 0xE9 /* 'i' -> */, -/* pos 0127: 158 */ 0xEE /* 'n' -> */, -/* pos 0128: 159 */ 0xE7 /* 'g' -> */, -/* pos 0129: 160 */ 0xBA /* ':' -> */, -/* pos 012a: 161 */ 0x00, 0x14 /* - terminal marker 20 - */, -/* pos 012c: 162 */ 0xE1 /* 'a' -> */, -/* pos 012d: 163 */ 0xEE /* 'n' -> */, -/* pos 012e: 164 */ 0xE7 /* 'g' -> */, -/* pos 012f: 165 */ 0xF5 /* 'u' -> */, -/* pos 0130: 166 */ 0xE1 /* 'a' -> */, -/* pos 0131: 167 */ 0xE7 /* 'g' -> */, -/* pos 0132: 168 */ 0xE5 /* 'e' -> */, -/* pos 0133: 169 */ 0xBA /* ':' -> */, -/* pos 0134: 170 */ 0x00, 0x15 /* - terminal marker 21 - */, -/* pos 0136: 171 */ 0xE1 /* 'a' -> */, -/* pos 0137: 172 */ 0xE7 /* 'g' -> */, -/* pos 0138: 173 */ 0xED /* 'm' -> */, -/* pos 0139: 174 */ 0xE1 /* 'a' -> */, -/* pos 013a: 175 */ 0xBA /* ':' -> */, -/* pos 013b: 176 */ 0x00, 0x16 /* - terminal marker 22 - */, -/* pos 013d: 177 */ 0xE3 /* 'c' -> */, -/* pos 013e: 178 */ 0xE8 /* 'h' -> */, -/* pos 013f: 179 */ 0xE5 /* 'e' -> */, -/* pos 0140: 180 */ 0xAD /* '-' -> */, -/* pos 0141: 181 */ 0xE3 /* 'c' -> */, -/* pos 0142: 182 */ 0xEF /* 'o' -> */, -/* pos 0143: 183 */ 0xEE /* 'n' -> */, -/* pos 0144: 184 */ 0xF4 /* 't' -> */, -/* pos 0145: 185 */ 0xF2 /* 'r' -> */, -/* pos 0146: 186 */ 0xEF /* 'o' -> */, -/* pos 0147: 187 */ 0xEC /* 'l' -> */, -/* pos 0148: 188 */ 0xBA /* ':' -> */, -/* pos 0149: 189 */ 0x00, 0x17 /* - terminal marker 23 - */, -/* pos 014b: 190 */ 0xF4 /* 't' -> */, -/* pos 014c: 191 */ 0xE8 /* 'h' -> */, -/* pos 014d: 192 */ 0xEF /* 'o' -> */, -/* pos 014e: 193 */ 0xF2 /* 'r' -> */, -/* pos 014f: 194 */ 0xE9 /* 'i' -> */, -/* pos 0150: 195 */ 0xFA /* 'z' -> */, -/* pos 0151: 196 */ 0xE1 /* 'a' -> */, -/* pos 0152: 197 */ 0xF4 /* 't' -> */, -/* pos 0153: 198 */ 0xE9 /* 'i' -> */, -/* pos 0154: 199 */ 0xEF /* 'o' -> */, -/* pos 0155: 200 */ 0xEE /* 'n' -> */, -/* pos 0156: 201 */ 0xBA /* ':' -> */, -/* pos 0157: 202 */ 0x00, 0x18 /* - terminal marker 24 - */, -/* pos 0159: 203 */ 0xEB /* 'k' -> */, -/* pos 015a: 204 */ 0xE9 /* 'i' -> */, -/* pos 015b: 205 */ 0xE5 /* 'e' -> */, -/* pos 015c: 206 */ 0xBA /* ':' -> */, -/* pos 015d: 207 */ 0x00, 0x19 /* - terminal marker 25 - */, -/* pos 015f: 208 */ 0xE5 /* 'e' -> */, -/* pos 0160: 209 */ 0xEE /* 'n' -> */, -/* pos 0161: 210 */ 0xF4 /* 't' -> */, -/* pos 0162: 211 */ 0xAD /* '-' -> */, -/* pos 0163: 212 */ 0x6C /* 'l' */, 0x07, 0x00 /* (to 0x016A state 213) */, - 0x74 /* 't' */, 0x0C, 0x00 /* (to 0x0172 state 220) */, - 0x08, /* fail */ -/* pos 016a: 213 */ 0xE5 /* 'e' -> */, -/* pos 016b: 214 */ 0xEE /* 'n' -> */, -/* pos 016c: 215 */ 0xE7 /* 'g' -> */, -/* pos 016d: 216 */ 0xF4 /* 't' -> */, -/* pos 016e: 217 */ 0xE8 /* 'h' -> */, -/* pos 016f: 218 */ 0xBA /* ':' -> */, -/* pos 0170: 219 */ 0x00, 0x1A /* - terminal marker 26 - */, -/* pos 0172: 220 */ 0xF9 /* 'y' -> */, -/* pos 0173: 221 */ 0xF0 /* 'p' -> */, -/* pos 0174: 222 */ 0xE5 /* 'e' -> */, -/* pos 0175: 223 */ 0xBA /* ':' -> */, -/* pos 0176: 224 */ 0x00, 0x1B /* - terminal marker 27 - */, -/* pos 0178: 225 */ 0xE1 /* 'a' -> */, -/* pos 0179: 226 */ 0xF4 /* 't' -> */, -/* pos 017a: 227 */ 0xE5 /* 'e' -> */, -/* pos 017b: 228 */ 0xBA /* ':' -> */, -/* pos 017c: 229 */ 0x00, 0x1C /* - terminal marker 28 - */, -/* pos 017e: 230 */ 0x61 /* 'a' */, 0x07, 0x00 /* (to 0x0185 state 231) */, - 0x65 /* 'e' */, 0x0A, 0x00 /* (to 0x018B state 236) */, - 0x08, /* fail */ -/* pos 0185: 231 */ 0xEE /* 'n' -> */, -/* pos 0186: 232 */ 0xE7 /* 'g' -> */, -/* pos 0187: 233 */ 0xE5 /* 'e' -> */, -/* pos 0188: 234 */ 0xBA /* ':' -> */, -/* pos 0189: 235 */ 0x00, 0x1D /* - terminal marker 29 - */, -/* pos 018b: 236 */ 0xE6 /* 'f' -> */, -/* pos 018c: 237 */ 0xE5 /* 'e' -> */, -/* pos 018d: 238 */ 0xF2 /* 'r' -> */, -/* pos 018e: 239 */ 0xE5 /* 'e' -> */, -/* pos 018f: 240 */ 0xF2 /* 'r' -> */, -/* pos 0190: 241 */ 0xBA /* ':' -> */, -/* pos 0191: 242 */ 0x00, 0x1E /* - terminal marker 30 - */, -/* total size 403 bytes */ diff --git a/core/deps/libwebsocket/libwebsockets.c b/core/deps/libwebsocket/libwebsockets.c deleted file mode 100644 index 3e02529eb..000000000 --- a/core/deps/libwebsocket/libwebsockets.c +++ /dev/null @@ -1,766 +0,0 @@ -/* - * libwebsockets - small server side websockets and web server implementation - * - * Copyright (C) 2010-2014 Andy Green - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation: - * version 2.1 of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301 USA - */ - - -#include "private-libwebsockets.h" - -#if HOST_OS == OS_WINDOWS - #pragma comment(lib, "Ws2_32.lib") -#endif - -int log_level = LLL_ERR | LLL_WARN | LLL_NOTICE; -static void (*lwsl_emit)(int level, const char *line) = lwsl_emit_stderr; - -static const char * const log_level_names[] = { - "ERR", - "WARN", - "NOTICE", - "INFO", - "DEBUG", - "PARSER", - "HEADER", - "EXTENSION", - "CLIENT", - "LATENCY", -}; - - -void -libwebsocket_close_and_free_session(struct libwebsocket_context *context, - struct libwebsocket *wsi, enum lws_close_status reason) -{ - int n, m, ret; - int old_state; - unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + 2 + - LWS_SEND_BUFFER_POST_PADDING]; - struct lws_tokens eff_buf; - - if (!wsi) - return; - - old_state = wsi->state; - - switch (old_state) { - case WSI_STATE_DEAD_SOCKET: - return; - - /* we tried the polite way... */ - case WSI_STATE_AWAITING_CLOSE_ACK: - goto just_kill_connection; - - case WSI_STATE_FLUSHING_STORED_SEND_BEFORE_CLOSE: - if (wsi->truncated_send_len) { - libwebsocket_callback_on_writable(context, wsi); - return; - } - lwsl_info("wsi %p completed WSI_STATE_FLUSHING_STORED_SEND_BEFORE_CLOSE\n", wsi); - goto just_kill_connection; - default: - if (wsi->truncated_send_len) { - lwsl_info("wsi %p entering WSI_STATE_FLUSHING_STORED_SEND_BEFORE_CLOSE\n", wsi); - wsi->state = WSI_STATE_FLUSHING_STORED_SEND_BEFORE_CLOSE; - return; - } - break; - } - - wsi->u.ws.close_reason = reason; - - if (wsi->mode == LWS_CONNMODE_WS_CLIENT_WAITING_CONNECT || - wsi->mode == LWS_CONNMODE_WS_CLIENT_ISSUE_HANDSHAKE) { - - context->protocols[0].callback(context, wsi, - LWS_CALLBACK_CLIENT_CONNECTION_ERROR, NULL, NULL, 0); - - free(wsi->u.hdr.ah); - goto just_kill_connection; - } - - if (wsi->mode == LWS_CONNMODE_HTTP_SERVING_ACCEPTED) { - if (wsi->u.http.post_buffer) { - free(wsi->u.http.post_buffer); - wsi->u.http.post_buffer = NULL; - } - if (wsi->u.http.fd != LWS_INVALID_FILE) { - lwsl_debug("closing http file\n"); - compatible_file_close(wsi->u.http.fd); - wsi->u.http.fd = LWS_INVALID_FILE; - context->protocols[0].callback(context, wsi, - LWS_CALLBACK_CLOSED_HTTP, wsi->user_space, NULL, 0); - } - } - - /* - * are his extensions okay with him closing? Eg he might be a mux - * parent and just his ch1 aspect is closing? - */ - - if (lws_ext_callback_for_each_active(wsi, - LWS_EXT_CALLBACK_CHECK_OK_TO_REALLY_CLOSE, NULL, 0) > 0) { - lwsl_ext("extension vetoed close\n"); - return; - } - - /* - * flush any tx pending from extensions, since we may send close packet - * if there are problems with send, just nuke the connection - */ - - do { - ret = 0; - eff_buf.token = NULL; - eff_buf.token_len = 0; - - /* show every extension the new incoming data */ - - m = lws_ext_callback_for_each_active(wsi, - LWS_EXT_CALLBACK_FLUSH_PENDING_TX, &eff_buf, 0); - if (m < 0) { - lwsl_ext("Extension reports fatal error\n"); - goto just_kill_connection; - } - if (m) - /* - * at least one extension told us he has more - * to spill, so we will go around again after - */ - ret = 1; - - /* assuming they left us something to send, send it */ - - if (eff_buf.token_len) - if (lws_issue_raw(wsi, (unsigned char *)eff_buf.token, - eff_buf.token_len) != eff_buf.token_len) { - lwsl_debug("close: ext spill failed\n"); - goto just_kill_connection; - } - } while (ret); - - /* - * signal we are closing, libsocket_write will - * add any necessary version-specific stuff. If the write fails, - * no worries we are closing anyway. If we didn't initiate this - * close, then our state has been changed to - * WSI_STATE_RETURNED_CLOSE_ALREADY and we will skip this. - * - * Likewise if it's a second call to close this connection after we - * sent the close indication to the peer already, we are in state - * WSI_STATE_AWAITING_CLOSE_ACK and will skip doing this a second time. - */ - - if (old_state == WSI_STATE_ESTABLISHED && - reason != LWS_CLOSE_STATUS_NOSTATUS) { - - lwsl_debug("sending close indication...\n"); - - /* make valgrind happy */ - memset(buf, 0, sizeof(buf)); - n = libwebsocket_write(wsi, - &buf[LWS_SEND_BUFFER_PRE_PADDING + 2], - 0, LWS_WRITE_CLOSE); - if (n >= 0) { - /* - * we have sent a nice protocol level indication we - * now wish to close, we should not send anything more - */ - - wsi->state = WSI_STATE_AWAITING_CLOSE_ACK; - - /* - * ...and we should wait for a reply for a bit - * out of politeness - */ - - libwebsocket_set_timeout(wsi, - PENDING_TIMEOUT_CLOSE_ACK, 1); - - lwsl_debug("sent close indication, awaiting ack\n"); - - return; - } - - lwsl_info("close: sending close packet failed, hanging up\n"); - - /* else, the send failed and we should just hang up */ - } - -just_kill_connection: - - lwsl_debug("close: just_kill_connection\n"); - - /* - * we won't be servicing or receiving anything further from this guy - * delete socket from the internal poll list if still present - */ - - remove_wsi_socket_from_fds(context, wsi); - - wsi->state = WSI_STATE_DEAD_SOCKET; - - if ((old_state == WSI_STATE_ESTABLISHED || - wsi->mode == LWS_CONNMODE_WS_SERVING || - wsi->mode == LWS_CONNMODE_WS_CLIENT)) { - - if (wsi->u.ws.rx_user_buffer) { - free(wsi->u.ws.rx_user_buffer); - wsi->u.ws.rx_user_buffer = NULL; - } - if (wsi->u.ws.rxflow_buffer) { - free(wsi->u.ws.rxflow_buffer); - wsi->u.ws.rxflow_buffer = NULL; - } - if (wsi->truncated_send_malloc) { - /* not going to be completed... nuke it */ - free(wsi->truncated_send_malloc); - wsi->truncated_send_malloc = NULL; - wsi->truncated_send_len = 0; - } - } - - /* tell the user it's all over for this guy */ - - if (wsi->protocol && wsi->protocol->callback && - ((old_state == WSI_STATE_ESTABLISHED) || - (old_state == WSI_STATE_RETURNED_CLOSE_ALREADY) || - (old_state == WSI_STATE_AWAITING_CLOSE_ACK))) { - lwsl_debug("calling back CLOSED\n"); - wsi->protocol->callback(context, wsi, LWS_CALLBACK_CLOSED, - wsi->user_space, NULL, 0); - } else if (wsi->mode == LWS_CONNMODE_HTTP_SERVING_ACCEPTED) { - lwsl_debug("calling back CLOSED_HTTP\n"); - context->protocols[0].callback(context, wsi, - LWS_CALLBACK_CLOSED_HTTP, wsi->user_space, NULL, 0 ); - } else - lwsl_debug("not calling back closed\n"); - - /* deallocate any active extension contexts */ - - if (lws_ext_callback_for_each_active(wsi, LWS_EXT_CALLBACK_DESTROY, NULL, 0) < 0) - lwsl_warn("extension destruction failed\n"); -#ifndef LWS_NO_EXTENSIONS - for (n = 0; n < wsi->count_active_extensions; n++) - free(wsi->active_extensions_user[n]); -#endif - /* - * inform all extensions in case they tracked this guy out of band - * even though not active on him specifically - */ - if (lws_ext_callback_for_each_extension_type(context, wsi, - LWS_EXT_CALLBACK_DESTROY_ANY_WSI_CLOSING, NULL, 0) < 0) - lwsl_warn("ext destroy wsi failed\n"); - -/* lwsl_info("closing fd=%d\n", wsi->sock); */ - - if (!lws_ssl_close(wsi) && wsi->sock >= 0) { - n = shutdown(wsi->sock, SHUT_RDWR); - if (n) - lwsl_debug("closing: shutdown ret %d\n", LWS_ERRNO); - - n = compatible_close(wsi->sock); - if (n) - lwsl_debug("closing: close ret %d\n", LWS_ERRNO); - } - - /* outermost destroy notification for wsi (user_space still intact) */ - context->protocols[0].callback(context, wsi, - LWS_CALLBACK_WSI_DESTROY, wsi->user_space, NULL, 0); - - if (wsi->protocol && wsi->protocol->per_session_data_size && - wsi->user_space) /* user code may own */ - free(wsi->user_space); - - free(wsi); -} - -/** - * libwebsockets_get_peer_addresses() - Get client address information - * @context: Libwebsockets context - * @wsi: Local struct libwebsocket associated with - * @fd: Connection socket descriptor - * @name: Buffer to take client address name - * @name_len: Length of client address name buffer - * @rip: Buffer to take client address IP qotted quad - * @rip_len: Length of client address IP buffer - * - * This function fills in @name and @rip with the name and IP of - * the client connected with socket descriptor @fd. Names may be - * truncated if there is not enough room. If either cannot be - * determined, they will be returned as valid zero-length strings. - */ - -LWS_VISIBLE void -libwebsockets_get_peer_addresses(struct libwebsocket_context *context, - struct libwebsocket *wsi, int fd, char *name, int name_len, - char *rip, int rip_len) -{ - socklen_t len; -#ifdef LWS_USE_IPV6 - struct sockaddr_in6 sin6; -#endif - struct sockaddr_in sin4; - struct hostent *host; - struct hostent *host1; - char ip[128]; - unsigned char *p; - int n; -#ifdef AF_LOCAL - struct sockaddr_un *un; -#endif - int ret = -1; - - rip[0] = '\0'; - name[0] = '\0'; - - lws_latency_pre(context, wsi); - -#ifdef LWS_USE_IPV6 - if (LWS_IPV6_ENABLED(context)) { - - len = sizeof(sin6); - if (getpeername(fd, (struct sockaddr *) &sin6, &len) < 0) { - lwsl_warn("getpeername: %s\n", strerror(LWS_ERRNO)); - goto bail; - } - - if (!lws_plat_inet_ntop(AF_INET6, &sin6.sin6_addr, rip, rip_len)) { - lwsl_err("inet_ntop", strerror(LWS_ERRNO)); - goto bail; - } - - // Strip off the IPv4 to IPv6 header if one exists - if (strncmp(rip, "::ffff:", 7) == 0) - memmove(rip, rip + 7, strlen(rip) - 6); - - getnameinfo((struct sockaddr *)&sin6, - sizeof(struct sockaddr_in6), name, - name_len, NULL, 0, 0); - - } else -#endif - { - len = sizeof(sin4); - if (getpeername(fd, (struct sockaddr *) &sin4, &len) < 0) { - lwsl_warn("getpeername: %s\n", strerror(LWS_ERRNO)); - goto bail; - } - host = gethostbyaddr((char *) &sin4.sin_addr, - sizeof(sin4.sin_addr), AF_INET); - if (host == NULL) { - lwsl_warn("gethostbyaddr: %s\n", strerror(LWS_ERRNO)); - goto bail; - } - - strncpy(name, host->h_name, name_len); - name[name_len - 1] = '\0'; - - host1 = gethostbyname(host->h_name); - if (host1 == NULL) - goto bail; - p = (unsigned char *)host1; - n = 0; - while (p != NULL) { - p = (unsigned char *)host1->h_addr_list[n++]; - if (p == NULL) - continue; - if ((host1->h_addrtype != AF_INET) -#ifdef AF_LOCAL - && (host1->h_addrtype != AF_LOCAL) -#endif - ) - continue; - - if (host1->h_addrtype == AF_INET) - sprintf(ip, "%u.%u.%u.%u", - p[0], p[1], p[2], p[3]); -#ifdef AF_LOCAL - else { - un = (struct sockaddr_un *)p; - strncpy(ip, un->sun_path, sizeof(ip) - 1); - ip[sizeof(ip) - 1] = '\0'; - } -#endif - p = NULL; - strncpy(rip, ip, rip_len); - rip[rip_len - 1] = '\0'; - } - } - - ret = 0; -bail: - lws_latency(context, wsi, "libwebsockets_get_peer_addresses", ret, 1); -} - - - -/** - * libwebsocket_context_user() - get the user data associated with the context - * @context: Websocket context - * - * This returns the optional user allocation that can be attached to - * the context the sockets live in at context_create time. It's a way - * to let all sockets serviced in the same context share data without - * using globals statics in the user code. - */ -LWS_EXTERN void * -libwebsocket_context_user(struct libwebsocket_context *context) -{ - return context->user_space; -} - - -/** - * libwebsocket_callback_all_protocol() - Callback all connections using - * the given protocol with the given reason - * - * @protocol: Protocol whose connections will get callbacks - * @reason: Callback reason index - */ - -LWS_VISIBLE int -libwebsocket_callback_all_protocol( - const struct libwebsocket_protocols *protocol, int reason) -{ - struct libwebsocket_context *context = protocol->owning_server; - int n; - struct libwebsocket *wsi; - - for (n = 0; n < context->fds_count; n++) { - wsi = context->lws_lookup[context->fds[n].fd]; - if (!wsi) - continue; - if (wsi->protocol == protocol) - protocol->callback(context, wsi, - reason, wsi->user_space, NULL, 0); - } - - return 0; -} - -/** - * libwebsocket_set_timeout() - marks the wsi as subject to a timeout - * - * You will not need this unless you are doing something special - * - * @wsi: Websocket connection instance - * @reason: timeout reason - * @secs: how many seconds - */ - -LWS_VISIBLE void -libwebsocket_set_timeout(struct libwebsocket *wsi, - enum pending_timeout reason, int secs) -{ - time_t now; - - time(&now); - - wsi->pending_timeout_limit = now + secs; - wsi->pending_timeout = reason; -} - - -/** - * libwebsocket_get_socket_fd() - returns the socket file descriptor - * - * You will not need this unless you are doing something special - * - * @wsi: Websocket connection instance - */ - -LWS_VISIBLE int -libwebsocket_get_socket_fd(struct libwebsocket *wsi) -{ - return wsi->sock; -} - -#ifdef LWS_LATENCY -void -lws_latency(struct libwebsocket_context *context, struct libwebsocket *wsi, - const char *action, int ret, int completed) -{ - unsigned long long u; - char buf[256]; - - u = time_in_microseconds(); - - if (!action) { - wsi->latency_start = u; - if (!wsi->action_start) - wsi->action_start = u; - return; - } - if (completed) { - if (wsi->action_start == wsi->latency_start) - sprintf(buf, - "Completion first try lat %luus: %p: ret %d: %s\n", - u - wsi->latency_start, - (void *)wsi, ret, action); - else - sprintf(buf, - "Completion %luus: lat %luus: %p: ret %d: %s\n", - u - wsi->action_start, - u - wsi->latency_start, - (void *)wsi, ret, action); - wsi->action_start = 0; - } else - sprintf(buf, "lat %luus: %p: ret %d: %s\n", - u - wsi->latency_start, (void *)wsi, ret, action); - - if (u - wsi->latency_start > context->worst_latency) { - context->worst_latency = u - wsi->latency_start; - strcpy(context->worst_latency_info, buf); - } - lwsl_latency("%s", buf); -} -#endif - - - -/** - * libwebsocket_rx_flow_control() - Enable and disable socket servicing for - * receieved packets. - * - * If the output side of a server process becomes choked, this allows flow - * control for the input side. - * - * @wsi: Websocket connection instance to get callback for - * @enable: 0 = disable read servicing for this connection, 1 = enable - */ - -LWS_VISIBLE int -libwebsocket_rx_flow_control(struct libwebsocket *wsi, int enable) -{ - if (enable == (wsi->u.ws.rxflow_change_to & LWS_RXFLOW_ALLOW)) - return 0; - - lwsl_info("libwebsocket_rx_flow_control(0x%p, %d)\n", wsi, enable); - wsi->u.ws.rxflow_change_to = LWS_RXFLOW_PENDING_CHANGE | !!enable; - - return 0; -} - -/** - * libwebsocket_rx_flow_allow_all_protocol() - Allow all connections with this protocol to receive - * - * When the user server code realizes it can accept more input, it can - * call this to have the RX flow restriction removed from all connections using - * the given protocol. - * - * @protocol: all connections using this protocol will be allowed to receive - */ - -LWS_VISIBLE void -libwebsocket_rx_flow_allow_all_protocol( - const struct libwebsocket_protocols *protocol) -{ - struct libwebsocket_context *context = protocol->owning_server; - int n; - struct libwebsocket *wsi; - - for (n = 0; n < context->fds_count; n++) { - wsi = context->lws_lookup[context->fds[n].fd]; - if (!wsi) - continue; - if (wsi->protocol == protocol) - libwebsocket_rx_flow_control(wsi, LWS_RXFLOW_ALLOW); - } -} - - -/** - * libwebsocket_canonical_hostname() - returns this host's hostname - * - * This is typically used by client code to fill in the host parameter - * when making a client connection. You can only call it after the context - * has been created. - * - * @context: Websocket context - */ -LWS_VISIBLE extern const char * -libwebsocket_canonical_hostname(struct libwebsocket_context *context) -{ - return (const char *)context->canonical_hostname; -} - -int user_callback_handle_rxflow(callback_function callback_function, - struct libwebsocket_context *context, - struct libwebsocket *wsi, - enum libwebsocket_callback_reasons reason, void *user, - void *in, size_t len) -{ - int n; - - n = callback_function(context, wsi, reason, user, in, len); - if (!n) - n = _libwebsocket_rx_flow_control(wsi); - - return n; -} - - -/** - * libwebsocket_set_proxy() - Setups proxy to libwebsocket_context. - * @context: pointer to struct libwebsocket_context you want set proxy to - * @proxy: pointer to c string containing proxy in format address:port - * - * Returns 0 if proxy string was parsed and proxy was setup. - * Returns -1 if @proxy is NULL or has incorrect format. - * - * This is only required if your OS does not provide the http_proxy - * enviroment variable (eg, OSX) - * - * IMPORTANT! You should call this function right after creation of the - * libwebsocket_context and before call to connect. If you call this - * function after connect behavior is undefined. - * This function will override proxy settings made on libwebsocket_context - * creation with genenv() call. - */ - -LWS_VISIBLE int -libwebsocket_set_proxy(struct libwebsocket_context *context, const char *proxy) -{ - char *p; - - if (!proxy) - return -1; - - strncpy(context->http_proxy_address, proxy, - sizeof(context->http_proxy_address) - 1); - context->http_proxy_address[ - sizeof(context->http_proxy_address) - 1] = '\0'; - - p = strchr(context->http_proxy_address, ':'); - if (!p) { - lwsl_err("http_proxy needs to be ads:port\n"); - - return -1; - } - *p = '\0'; - context->http_proxy_port = atoi(p + 1); - - lwsl_notice(" Proxy %s:%u\n", context->http_proxy_address, - context->http_proxy_port); - - return 0; -} - -/** - * libwebsockets_get_protocol() - Returns a protocol pointer from a websocket - * connection. - * @wsi: pointer to struct websocket you want to know the protocol of - * - * - * Some apis can act on all live connections of a given protocol, - * this is how you can get a pointer to the active protocol if needed. - */ - -LWS_VISIBLE const struct libwebsocket_protocols * -libwebsockets_get_protocol(struct libwebsocket *wsi) -{ - return wsi->protocol; -} - -LWS_VISIBLE int -libwebsocket_is_final_fragment(struct libwebsocket *wsi) -{ - return wsi->u.ws.final; -} - -LWS_VISIBLE unsigned char -libwebsocket_get_reserved_bits(struct libwebsocket *wsi) -{ - return wsi->u.ws.rsv; -} - -int -libwebsocket_ensure_user_space(struct libwebsocket *wsi) -{ - if (!wsi->protocol) - return 1; - - /* allocate the per-connection user memory (if any) */ - - if (wsi->protocol->per_session_data_size && !wsi->user_space) { - wsi->user_space = malloc( - wsi->protocol->per_session_data_size); - if (wsi->user_space == NULL) { - lwsl_err("Out of memory for conn user space\n"); - return 1; - } - memset(wsi->user_space, 0, - wsi->protocol->per_session_data_size); - } - return 0; -} - -LWS_VISIBLE void lwsl_emit_stderr(int level, const char *line) -{ - char buf[300]; - unsigned long long now; - int n; - - buf[0] = '\0'; - for (n = 0; n < LLL_COUNT; n++) - if (level == (1 << n)) { - now = time_in_microseconds() / 100; - sprintf(buf, "[%lu:%04d] %s: ", (unsigned long) now / 10000, - (int)(now % 10000), log_level_names[n]); - break; - } - - fprintf(stderr, "%s%s", buf, line); -} - - -LWS_VISIBLE void _lws_log(int filter, const char *format, ...) -{ - char buf[256]; - va_list ap; - - if (!(log_level & filter)) - return; - - va_start(ap, format); - vsnprintf(buf, sizeof(buf), format, ap); - buf[sizeof(buf) - 1] = '\0'; - va_end(ap); - - lwsl_emit(filter, buf); -} - -/** - * lws_set_log_level() - Set the logging bitfield - * @level: OR together the LLL_ debug contexts you want output from - * @log_emit_function: NULL to leave it as it is, or a user-supplied - * function to perform log string emission instead of - * the default stderr one. - * - * log level defaults to "err", "warn" and "notice" contexts enabled and - * emission on stderr. - */ - -LWS_VISIBLE void lws_set_log_level(int level, void (*log_emit_function)(int level, - const char *line)) -{ - log_level = level; - if (log_emit_function) - lwsl_emit = log_emit_function; -} \ No newline at end of file diff --git a/core/deps/libwebsocket/libwebsockets.h b/core/deps/libwebsocket/libwebsockets.h deleted file mode 100644 index 27051bf17..000000000 --- a/core/deps/libwebsocket/libwebsockets.h +++ /dev/null @@ -1,1190 +0,0 @@ -/* - * libwebsockets - small server side websockets and web server implementation - * - * Copyright (C) 2010-2013 Andy Green - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation: - * version 2.1 of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301 USA - */ - -#ifndef LIBWEBSOCKET_H_3060898B846849FF9F88F5DB59B5950C -#define LIBWEBSOCKET_H_3060898B846849FF9F88F5DB59B5950C - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef CMAKE_BUILD -#include "lws_config.h" -#endif - -#if defined(WIN32) || defined(_WIN32) - -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#endif - -#include -#include -#include -#include - -#define strcasecmp stricmp -#define getdtablesize() 30000 - -#define LWS_VISIBLE - -#ifdef LWS_DLL -#ifdef LWS_INTERNAL -#define LWS_EXTERN extern __declspec(dllexport) -#else -#define LWS_EXTERN extern __declspec(dllimport) -#endif -#else -#define LWS_EXTERN -#endif - -#else // NOT WIN32 - -#include -#include - -#if defined(__GNUC__) -#define LWS_VISIBLE __attribute__((visibility("default"))) -#else -#define LWS_VISIBLE -#endif - -#endif - -#ifdef LWS_USE_LIBEV -#include -#endif /* LWS_USE_LIBEV */ - -#include - -#ifndef LWS_EXTERN -#define LWS_EXTERN extern -#endif - -#ifdef _WIN32 -#define random rand -#else -#include -#include -#endif - -#define CONTEXT_PORT_NO_LISTEN -1 -#define MAX_MUX_RECURSION 2 - -enum lws_log_levels { - LLL_ERR = 1 << 0, - LLL_WARN = 1 << 1, - LLL_NOTICE = 1 << 2, - LLL_INFO = 1 << 3, - LLL_DEBUG = 1 << 4, - LLL_PARSER = 1 << 5, - LLL_HEADER = 1 << 6, - LLL_EXT = 1 << 7, - LLL_CLIENT = 1 << 8, - LLL_LATENCY = 1 << 9, - - LLL_COUNT = 10 /* set to count of valid flags */ -}; - -LWS_VISIBLE LWS_EXTERN void _lws_log(int filter, const char *format, ...); - -/* notice, warn and log are always compiled in */ -#define lwsl_notice(...) _lws_log(LLL_NOTICE, __VA_ARGS__) -#define lwsl_warn(...) _lws_log(LLL_WARN, __VA_ARGS__) -#define lwsl_err(...) _lws_log(LLL_ERR, __VA_ARGS__) -/* - * weaker logging can be deselected at configure time using --disable-debug - * that gets rid of the overhead of checking while keeping _warn and _err - * active - */ -#ifdef _DEBUG - -#define lwsl_info(...) _lws_log(LLL_INFO, __VA_ARGS__) -#define lwsl_debug(...) _lws_log(LLL_DEBUG, __VA_ARGS__) -#define lwsl_parser(...) _lws_log(LLL_PARSER, __VA_ARGS__) -#define lwsl_header(...) _lws_log(LLL_HEADER, __VA_ARGS__) -#define lwsl_ext(...) _lws_log(LLL_EXT, __VA_ARGS__) -#define lwsl_client(...) _lws_log(LLL_CLIENT, __VA_ARGS__) -#define lwsl_latency(...) _lws_log(LLL_LATENCY, __VA_ARGS__) -LWS_VISIBLE LWS_EXTERN void lwsl_hexdump(void *buf, size_t len); - -#else /* no debug */ - -#define lwsl_info(...) -#define lwsl_debug(...) -#define lwsl_parser(...) -#define lwsl_header(...) -#define lwsl_ext(...) -#define lwsl_client(...) -#define lwsl_latency(...) -#define lwsl_hexdump(a, b) - -#endif - -#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) - -enum libwebsocket_context_options { - LWS_SERVER_OPTION_REQUIRE_VALID_OPENSSL_CLIENT_CERT = 2, - LWS_SERVER_OPTION_SKIP_SERVER_CANONICAL_NAME = 4, - LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT = 8, - LWS_SERVER_OPTION_LIBEV = 16, - LWS_SERVER_OPTION_DISABLE_IPV6 = 32, -}; - -enum libwebsocket_callback_reasons { - LWS_CALLBACK_ESTABLISHED, - LWS_CALLBACK_CLIENT_CONNECTION_ERROR, - LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH, - LWS_CALLBACK_CLIENT_ESTABLISHED, - LWS_CALLBACK_CLOSED, - LWS_CALLBACK_CLOSED_HTTP, - LWS_CALLBACK_RECEIVE, - LWS_CALLBACK_CLIENT_RECEIVE, - LWS_CALLBACK_CLIENT_RECEIVE_PONG, - LWS_CALLBACK_CLIENT_WRITEABLE, - LWS_CALLBACK_SERVER_WRITEABLE, - LWS_CALLBACK_HTTP, - LWS_CALLBACK_HTTP_BODY, - LWS_CALLBACK_HTTP_BODY_COMPLETION, - LWS_CALLBACK_HTTP_FILE_COMPLETION, - LWS_CALLBACK_HTTP_WRITEABLE, - LWS_CALLBACK_FILTER_NETWORK_CONNECTION, - LWS_CALLBACK_FILTER_HTTP_CONNECTION, - LWS_CALLBACK_SERVER_NEW_CLIENT_INSTANTIATED, - LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION, - LWS_CALLBACK_OPENSSL_LOAD_EXTRA_CLIENT_VERIFY_CERTS, - LWS_CALLBACK_OPENSSL_LOAD_EXTRA_SERVER_VERIFY_CERTS, - LWS_CALLBACK_OPENSSL_PERFORM_CLIENT_CERT_VERIFICATION, - LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER, - LWS_CALLBACK_CONFIRM_EXTENSION_OKAY, - LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED, - LWS_CALLBACK_PROTOCOL_INIT, - LWS_CALLBACK_PROTOCOL_DESTROY, - LWS_CALLBACK_WSI_CREATE, /* always protocol[0] */ - LWS_CALLBACK_WSI_DESTROY, /* always protocol[0] */ - LWS_CALLBACK_GET_THREAD_ID, - - /* external poll() management support */ - LWS_CALLBACK_ADD_POLL_FD, - LWS_CALLBACK_DEL_POLL_FD, - LWS_CALLBACK_CHANGE_MODE_POLL_FD, - LWS_CALLBACK_LOCK_POLL, - LWS_CALLBACK_UNLOCK_POLL, - - LWS_CALLBACK_USER = 1000, /* user code can use any including / above */ -}; - -// argument structure for all external poll related calls -// passed in via 'in' -struct libwebsocket_pollargs { - int fd; // applicable file descriptor - int events; // the new event mask - int prev_events; // the previous event mask -}; - -#ifdef _WIN32 -struct libwebsocket_pollfd { - SOCKET fd; - SHORT events; - SHORT revents; -}; -#else -#define libwebsocket_pollfd pollfd -#endif - -enum libwebsocket_extension_callback_reasons { - LWS_EXT_CALLBACK_SERVER_CONTEXT_CONSTRUCT, - LWS_EXT_CALLBACK_CLIENT_CONTEXT_CONSTRUCT, - LWS_EXT_CALLBACK_SERVER_CONTEXT_DESTRUCT, - LWS_EXT_CALLBACK_CLIENT_CONTEXT_DESTRUCT, - LWS_EXT_CALLBACK_CONSTRUCT, - LWS_EXT_CALLBACK_CLIENT_CONSTRUCT, - LWS_EXT_CALLBACK_CHECK_OK_TO_REALLY_CLOSE, - LWS_EXT_CALLBACK_CHECK_OK_TO_PROPOSE_EXTENSION, - LWS_EXT_CALLBACK_DESTROY, - LWS_EXT_CALLBACK_DESTROY_ANY_WSI_CLOSING, - LWS_EXT_CALLBACK_ANY_WSI_ESTABLISHED, - LWS_EXT_CALLBACK_PACKET_RX_PREPARSE, - LWS_EXT_CALLBACK_PACKET_TX_PRESEND, - LWS_EXT_CALLBACK_PACKET_TX_DO_SEND, - LWS_EXT_CALLBACK_HANDSHAKE_REPLY_TX, - LWS_EXT_CALLBACK_FLUSH_PENDING_TX, - LWS_EXT_CALLBACK_EXTENDED_PAYLOAD_RX, - LWS_EXT_CALLBACK_CAN_PROXY_CLIENT_CONNECTION, - LWS_EXT_CALLBACK_1HZ, - LWS_EXT_CALLBACK_REQUEST_ON_WRITEABLE, - LWS_EXT_CALLBACK_IS_WRITEABLE, - LWS_EXT_CALLBACK_PAYLOAD_TX, - LWS_EXT_CALLBACK_PAYLOAD_RX, -}; - -enum libwebsocket_write_protocol { - LWS_WRITE_TEXT, - LWS_WRITE_BINARY, - LWS_WRITE_CONTINUATION, - LWS_WRITE_HTTP, - - /* special 04+ opcodes */ - - LWS_WRITE_CLOSE, - LWS_WRITE_PING, - LWS_WRITE_PONG, - - /* flags */ - - LWS_WRITE_NO_FIN = 0x40, - /* - * client packet payload goes out on wire unmunged - * only useful for security tests since normal servers cannot - * decode the content if used - */ - LWS_WRITE_CLIENT_IGNORE_XOR_MASK = 0x80 -}; - -/* - * you need these to look at headers that have been parsed if using the - * LWS_CALLBACK_FILTER_CONNECTION callback. If a header from the enum - * list below is absent, .token = NULL and token_len = 0. Otherwise .token - * points to .token_len chars containing that header content. - */ - -struct lws_tokens { - char *token; - int token_len; -}; - -enum lws_token_indexes { - WSI_TOKEN_GET_URI, - WSI_TOKEN_POST_URI, - WSI_TOKEN_HOST, - WSI_TOKEN_CONNECTION, - WSI_TOKEN_KEY1, - WSI_TOKEN_KEY2, - WSI_TOKEN_PROTOCOL, - WSI_TOKEN_UPGRADE, - WSI_TOKEN_ORIGIN, - WSI_TOKEN_DRAFT, - WSI_TOKEN_CHALLENGE, - - /* new for 04 */ - WSI_TOKEN_KEY, - WSI_TOKEN_VERSION, - WSI_TOKEN_SWORIGIN, - - /* new for 05 */ - WSI_TOKEN_EXTENSIONS, - - /* client receives these */ - WSI_TOKEN_ACCEPT, - WSI_TOKEN_NONCE, - WSI_TOKEN_HTTP, - - /* http-related */ - WSI_TOKEN_HTTP_ACCEPT, - WSI_TOKEN_HTTP_IF_MODIFIED_SINCE, - WSI_TOKEN_HTTP_ACCEPT_ENCODING, - WSI_TOKEN_HTTP_ACCEPT_LANGUAGE, - WSI_TOKEN_HTTP_PRAGMA, - WSI_TOKEN_HTTP_CACHE_CONTROL, - WSI_TOKEN_HTTP_AUTHORIZATION, - WSI_TOKEN_HTTP_COOKIE, - WSI_TOKEN_HTTP_CONTENT_LENGTH, - WSI_TOKEN_HTTP_CONTENT_TYPE, - WSI_TOKEN_HTTP_DATE, - WSI_TOKEN_HTTP_RANGE, - WSI_TOKEN_HTTP_REFERER, - WSI_TOKEN_HTTP_URI_ARGS, - - - WSI_TOKEN_MUXURL, - - /* use token storage to stash these */ - - _WSI_TOKEN_CLIENT_SENT_PROTOCOLS, - _WSI_TOKEN_CLIENT_PEER_ADDRESS, - _WSI_TOKEN_CLIENT_URI, - _WSI_TOKEN_CLIENT_HOST, - _WSI_TOKEN_CLIENT_ORIGIN, - - /* always last real token index*/ - WSI_TOKEN_COUNT, - /* parser state additions */ - WSI_TOKEN_NAME_PART, - WSI_TOKEN_SKIPPING, - WSI_TOKEN_SKIPPING_SAW_CR, - WSI_PARSING_COMPLETE, - WSI_INIT_TOKEN_MUXURL, -}; - -/* - * From RFC 6455 - 1000 - - 1000 indicates a normal closure, meaning that the purpose for - which the connection was established has been fulfilled. - - 1001 - - 1001 indicates that an endpoint is "going away", such as a server - going down or a browser having navigated away from a page. - - 1002 - - 1002 indicates that an endpoint is terminating the connection due - to a protocol error. - - 1003 - - 1003 indicates that an endpoint is terminating the connection - because it has received a type of data it cannot accept (e.g., an - endpoint that understands only text data MAY send this if it - receives a binary message). - - 1004 - - Reserved. The specific meaning might be defined in the future. - - 1005 - - 1005 is a reserved value and MUST NOT be set as a status code in a - Close control frame by an endpoint. It is designated for use in - applications expecting a status code to indicate that no status - code was actually present. - - 1006 - - 1006 is a reserved value and MUST NOT be set as a status code in a - Close control frame by an endpoint. It is designated for use in - applications expecting a status code to indicate that the - connection was closed abnormally, e.g., without sending or - receiving a Close control frame. - - 1007 - - 1007 indicates that an endpoint is terminating the connection - because it has received data within a message that was not - consistent with the type of the message (e.g., non-UTF-8 [RFC3629] - data within a text message). - - 1008 - - 1008 indicates that an endpoint is terminating the connection - because it has received a message that violates its policy. This - is a generic status code that can be returned when there is no - other more suitable status code (e.g., 1003 or 1009) or if there - is a need to hide specific details about the policy. - - 1009 - - 1009 indicates that an endpoint is terminating the connection - because it has received a message that is too big for it to - process. - - 1010 - - 1010 indicates that an endpoint (client) is terminating the - connection because it has expected the server to negotiate one or - more extension, but the server didn't return them in the response - message of the WebSocket handshake. The list of extensions that - are needed SHOULD appear in the /reason/ part of the Close frame. - Note that this status code is not used by the server, because it - can fail the WebSocket handshake instead. - - 1011 - - 1011 indicates that a server is terminating the connection because - it encountered an unexpected condition that prevented it from - fulfilling the request. - - 1015 - - 1015 is a reserved value and MUST NOT be set as a status code in a - Close control frame by an endpoint. It is designated for use in - applications expecting a status code to indicate that the - connection was closed due to a failure to perform a TLS handshake - (e.g., the server certificate can't be verified). -*/ - -enum lws_close_status { - LWS_CLOSE_STATUS_NOSTATUS = 0, - LWS_CLOSE_STATUS_NORMAL = 1000, - LWS_CLOSE_STATUS_GOINGAWAY = 1001, - LWS_CLOSE_STATUS_PROTOCOL_ERR = 1002, - LWS_CLOSE_STATUS_UNACCEPTABLE_OPCODE = 1003, - LWS_CLOSE_STATUS_RESERVED = 1004, - LWS_CLOSE_STATUS_NO_STATUS = 1005, - LWS_CLOSE_STATUS_ABNORMAL_CLOSE = 1006, - LWS_CLOSE_STATUS_INVALID_PAYLOAD = 1007, - LWS_CLOSE_STATUS_POLICY_VIOLATION = 1008, - LWS_CLOSE_STATUS_MESSAGE_TOO_LARGE = 1009, - LWS_CLOSE_STATUS_EXTENSION_REQUIRED = 1010, - LWS_CLOSE_STATUS_UNEXPECTED_CONDITION = 1011, - LWS_CLOSE_STATUS_TLS_FAILURE = 1015, -}; - -enum http_status { - HTTP_STATUS_OK = 200, - - HTTP_STATUS_BAD_REQUEST = 400, - HTTP_STATUS_UNAUTHORIZED, - HTTP_STATUS_PAYMENT_REQUIRED, - HTTP_STATUS_FORBIDDEN, - HTTP_STATUS_NOT_FOUND, - HTTP_STATUS_METHOD_NOT_ALLOWED, - HTTP_STATUS_NOT_ACCEPTABLE, - HTTP_STATUS_PROXY_AUTH_REQUIRED, - HTTP_STATUS_REQUEST_TIMEOUT, - HTTP_STATUS_CONFLICT, - HTTP_STATUS_GONE, - HTTP_STATUS_LENGTH_REQUIRED, - HTTP_STATUS_PRECONDITION_FAILED, - HTTP_STATUS_REQ_ENTITY_TOO_LARGE, - HTTP_STATUS_REQ_URI_TOO_LONG, - HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE, - HTTP_STATUS_REQ_RANGE_NOT_SATISFIABLE, - HTTP_STATUS_EXPECTATION_FAILED, - - HTTP_STATUS_INTERNAL_SERVER_ERROR = 500, - HTTP_STATUS_NOT_IMPLEMENTED, - HTTP_STATUS_BAD_GATEWAY, - HTTP_STATUS_SERVICE_UNAVAILABLE, - HTTP_STATUS_GATEWAY_TIMEOUT, - HTTP_STATUS_HTTP_VERSION_NOT_SUPPORTED, -}; - -struct libwebsocket; -struct libwebsocket_context; -/* needed even with extensions disabled for create context */ -struct libwebsocket_extension; - -/** - * callback_function() - User server actions - * @context: Websockets context - * @wsi: Opaque websocket instance pointer - * @reason: The reason for the call - * @user: Pointer to per-session user data allocated by library - * @in: Pointer used for some callback reasons - * @len: Length set for some callback reasons - * - * This callback is the way the user controls what is served. All the - * protocol detail is hidden and handled by the library. - * - * For each connection / session there is user data allocated that is - * pointed to by "user". You set the size of this user data area when - * the library is initialized with libwebsocket_create_server. - * - * You get an opportunity to initialize user data when called back with - * LWS_CALLBACK_ESTABLISHED reason. - * - * LWS_CALLBACK_ESTABLISHED: after the server completes a handshake with - * an incoming client - * - * LWS_CALLBACK_CLIENT_CONNECTION_ERROR: the request client connection has - * been unable to complete a handshake with the remote server - * - * LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH: this is the last chance for the - * client user code to examine the http headers - * and decide to reject the connection. If the - * content in the headers is interesting to the - * client (url, etc) it needs to copy it out at - * this point since it will be destroyed before - * the CLIENT_ESTABLISHED call - * - * LWS_CALLBACK_CLIENT_ESTABLISHED: after your client connection completed - * a handshake with the remote server - * - * LWS_CALLBACK_CLOSED: when the websocket session ends - * - * LWS_CALLBACK_CLOSED_HTTP: when a HTTP (non-websocket) session ends - * - * LWS_CALLBACK_RECEIVE: data has appeared for this server endpoint from a - * remote client, it can be found at *in and is - * len bytes long - * - * LWS_CALLBACK_CLIENT_RECEIVE_PONG: if you elected to see PONG packets, - * they appear with this callback reason. PONG - * packets only exist in 04+ protocol - * - * LWS_CALLBACK_CLIENT_RECEIVE: data has appeared from the server for the - * client connection, it can be found at *in and - * is len bytes long - * - * LWS_CALLBACK_HTTP: an http request has come from a client that is not - * asking to upgrade the connection to a websocket - * one. This is a chance to serve http content, - * for example, to send a script to the client - * which will then open the websockets connection. - * @in points to the URI path requested and - * libwebsockets_serve_http_file() makes it very - * simple to send back a file to the client. - * Normally after sending the file you are done - * with the http connection, since the rest of the - * activity will come by websockets from the script - * that was delivered by http, so you will want to - * return 1; to close and free up the connection. - * That's important because it uses a slot in the - * total number of client connections allowed set - * by MAX_CLIENTS. - * - * LWS_CALLBACK_HTTP_BODY: the next @len bytes data from the http - * request body HTTP connection is now available in @in. - * - * LWS_CALLBACK_HTTP_BODY_COMPLETION: the expected amount of http request - * body has been delivered - * - * LWS_CALLBACK_HTTP_WRITEABLE: you can write more down the http protocol - * link now. - * - * LWS_CALLBACK_HTTP_FILE_COMPLETION: a file requested to be send down - * http link has completed. - * - * LWS_CALLBACK_CLIENT_WRITEABLE: - * LWS_CALLBACK_SERVER_WRITEABLE: If you call - * libwebsocket_callback_on_writable() on a connection, you will - * get one of these callbacks coming when the connection socket - * is able to accept another write packet without blocking. - * If it already was able to take another packet without blocking, - * you'll get this callback at the next call to the service loop - * function. Notice that CLIENTs get LWS_CALLBACK_CLIENT_WRITEABLE - * and servers get LWS_CALLBACK_SERVER_WRITEABLE. - * - * LWS_CALLBACK_FILTER_NETWORK_CONNECTION: called when a client connects to - * the server at network level; the connection is accepted but then - * passed to this callback to decide whether to hang up immediately - * or not, based on the client IP. @in contains the connection - * socket's descriptor. Since the client connection information is - * not available yet, @wsi still pointing to the main server socket. - * Return non-zero to terminate the connection before sending or - * receiving anything. Because this happens immediately after the - * network connection from the client, there's no websocket protocol - * selected yet so this callback is issued only to protocol 0. - * - * LWS_CALLBACK_SERVER_NEW_CLIENT_INSTANTIATED: A new client just had - * been connected, accepted, and instantiated into the pool. This - * callback allows setting any relevant property to it. Because this - * happens immediately after the instantiation of a new client, - * there's no websocket protocol selected yet so this callback is - * issued only to protocol 0. Only @wsi is defined, pointing to the - * new client, and the return value is ignored. - * - * LWS_CALLBACK_FILTER_HTTP_CONNECTION: called when the request has - * been received and parsed from the client, but the response is - * not sent yet. Return non-zero to disallow the connection. - * @user is a pointer to the connection user space allocation, - * @in is the URI, eg, "/" - * In your handler you can use the public APIs - * lws_hdr_total_length() / lws_hdr_copy() to access all of the - * headers using the header enums lws_token_indexes from - * libwebsockets.h to check for and read the supported header - * presence and content before deciding to allow the http - * connection to proceed or to kill the connection. - * - * LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION: called when the handshake has - * been received and parsed from the client, but the response is - * not sent yet. Return non-zero to disallow the connection. - * @user is a pointer to the connection user space allocation, - * @in is the requested protocol name - * In your handler you can use the public APIs - * lws_hdr_total_length() / lws_hdr_copy() to access all of the - * headers using the header enums lws_token_indexes from - * libwebsockets.h to check for and read the supported header - * presence and content before deciding to allow the handshake - * to proceed or to kill the connection. - * - * LWS_CALLBACK_OPENSSL_LOAD_EXTRA_CLIENT_VERIFY_CERTS: if configured for - * including OpenSSL support, this callback allows your user code - * to perform extra SSL_CTX_load_verify_locations() or similar - * calls to direct OpenSSL where to find certificates the client - * can use to confirm the remote server identity. @user is the - * OpenSSL SSL_CTX* - * - * LWS_CALLBACK_OPENSSL_LOAD_EXTRA_SERVER_VERIFY_CERTS: if configured for - * including OpenSSL support, this callback allows your user code - * to load extra certifcates into the server which allow it to - * verify the validity of certificates returned by clients. @user - * is the server's OpenSSL SSL_CTX* - * - * LWS_CALLBACK_OPENSSL_PERFORM_CLIENT_CERT_VERIFICATION: if the - * libwebsockets context was created with the option - * LWS_SERVER_OPTION_REQUIRE_VALID_OPENSSL_CLIENT_CERT, then this - * callback is generated during OpenSSL verification of the cert - * sent from the client. It is sent to protocol[0] callback as - * no protocol has been negotiated on the connection yet. - * Notice that the libwebsockets context and wsi are both NULL - * during this callback. See - * http://www.openssl.org/docs/ssl/SSL_CTX_set_verify.html - * to understand more detail about the OpenSSL callback that - * generates this libwebsockets callback and the meanings of the - * arguments passed. In this callback, @user is the x509_ctx, - * @in is the ssl pointer and @len is preverify_ok - * Notice that this callback maintains libwebsocket return - * conventions, return 0 to mean the cert is OK or 1 to fail it. - * This also means that if you don't handle this callback then - * the default callback action of returning 0 allows the client - * certificates. - * - * LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER: this callback happens - * when a client handshake is being compiled. @user is NULL, - * @in is a char **, it's pointing to a char * which holds the - * next location in the header buffer where you can add - * headers, and @len is the remaining space in the header buffer, - * which is typically some hundreds of bytes. So, to add a canned - * cookie, your handler code might look similar to: - * - * char **p = (char **)in; - * - * if (len < 100) - * return 1; - * - * *p += sprintf(*p, "Cookie: a=b\x0d\x0a"); - * - * return 0; - * - * Notice if you add anything, you just have to take care about - * the CRLF on the line you added. Obviously this callback is - * optional, if you don't handle it everything is fine. - * - * Notice the callback is coming to protocols[0] all the time, - * because there is no specific protocol handshook yet. - * - * LWS_CALLBACK_CONFIRM_EXTENSION_OKAY: When the server handshake code - * sees that it does support a requested extension, before - * accepting the extension by additing to the list sent back to - * the client it gives this callback just to check that it's okay - * to use that extension. It calls back to the requested protocol - * and with @in being the extension name, @len is 0 and @user is - * valid. Note though at this time the ESTABLISHED callback hasn't - * happened yet so if you initialize @user content there, @user - * content during this callback might not be useful for anything. - * Notice this callback comes to protocols[0]. - * - * LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED: When a client - * connection is being prepared to start a handshake to a server, - * each supported extension is checked with protocols[0] callback - * with this reason, giving the user code a chance to suppress the - * claim to support that extension by returning non-zero. If - * unhandled, by default 0 will be returned and the extension - * support included in the header to the server. Notice this - * callback comes to protocols[0]. - * - * LWS_CALLBACK_PROTOCOL_INIT: One-time call per protocol so it can - * do initial setup / allocations etc - * - * LWS_CALLBACK_PROTOCOL_DESTROY: One-time call per protocol indicating - * this protocol won't get used at all after this callback, the - * context is getting destroyed. Take the opportunity to - * deallocate everything that was allocated by the protocol. - * - * LWS_CALLBACK_WSI_CREATE: outermost (earliest) wsi create notification - * - * LWS_CALLBACK_WSI_DESTROY: outermost (latest) wsi destroy notification - * - * The next five reasons are optional and only need taking care of if you - * will be integrating libwebsockets sockets into an external polling - * array. - * - * For these calls, @in points to a struct libwebsocket_pollargs that - * contains @fd, @events and @prev_events members - * - * LWS_CALLBACK_ADD_POLL_FD: libwebsocket deals with its poll() loop - * internally, but in the case you are integrating with another - * server you will need to have libwebsocket sockets share a - * polling array with the other server. This and the other - * POLL_FD related callbacks let you put your specialized - * poll array interface code in the callback for protocol 0, the - * first protocol you support, usually the HTTP protocol in the - * serving case. - * This callback happens when a socket needs to be - * added to the polling loop: @in points to a struct - * libwebsocket_pollargs; the @fd member of the struct is the file - * descriptor, and @events contains the active events. - * - * If you are using the internal polling loop (the "service" - * callback), you can just ignore these callbacks. - * - * LWS_CALLBACK_DEL_POLL_FD: This callback happens when a socket descriptor - * needs to be removed from an external polling array. @in is - * again the struct libwebsocket_pollargs containing the @fd member - * to be removed. If you are using the internal polling - * loop, you can just ignore it. - * - * LWS_CALLBACK_CHANGE_MODE_POLL_FD: This callback happens when - * libwebsockets wants to modify the events for a connectiion. - * @in is the struct libwebsocket_pollargs with the @fd to change. - * The new event mask is in @events member and the old mask is in - * the @prev_events member. - * If you are using the internal polling loop, you can just ignore - * it. - * - * LWS_CALLBACK_LOCK_POLL: - * LWS_CALLBACK_UNLOCK_POLL: These allow the external poll changes driven - * by libwebsockets to participate in an external thread locking - * scheme around the changes, so the whole thing is threadsafe. - */ -LWS_VISIBLE LWS_EXTERN int callback(struct libwebsocket_context *context, - struct libwebsocket *wsi, - enum libwebsocket_callback_reasons reason, void *user, - void *in, size_t len); - -typedef int (callback_function)(struct libwebsocket_context *context, - struct libwebsocket *wsi, - enum libwebsocket_callback_reasons reason, void *user, - void *in, size_t len); - -#ifndef LWS_NO_EXTENSIONS -/** - * extension_callback_function() - Hooks to allow extensions to operate - * @context: Websockets context - * @ext: This extension - * @wsi: Opaque websocket instance pointer - * @reason: The reason for the call - * @user: Pointer to per-session user data allocated by library - * @in: Pointer used for some callback reasons - * @len: Length set for some callback reasons - * - * Each extension that is active on a particular connection receives - * callbacks during the connection lifetime to allow the extension to - * operate on websocket data and manage itself. - * - * Libwebsockets takes care of allocating and freeing "user" memory for - * each active extension on each connection. That is what is pointed to - * by the @user parameter. - * - * LWS_EXT_CALLBACK_CONSTRUCT: called when the server has decided to - * select this extension from the list provided by the client, - * just before the server will send back the handshake accepting - * the connection with this extension active. This gives the - * extension a chance to initialize its connection context found - * in @user. - * - * LWS_EXT_CALLBACK_CLIENT_CONSTRUCT: same as LWS_EXT_CALLBACK_CONSTRUCT - * but called when client is instantiating this extension. Some - * extensions will work the same on client and server side and then - * you can just merge handlers for both CONSTRUCTS. - * - * LWS_EXT_CALLBACK_DESTROY: called when the connection the extension was - * being used on is about to be closed and deallocated. It's the - * last chance for the extension to deallocate anything it has - * allocated in the user data (pointed to by @user) before the - * user data is deleted. This same callback is used whether you - * are in client or server instantiation context. - * - * LWS_EXT_CALLBACK_PACKET_RX_PREPARSE: when this extension was active on - * a connection, and a packet of data arrived at the connection, - * it is passed to this callback to give the extension a chance to - * change the data, eg, decompress it. @user is pointing to the - * extension's private connection context data, @in is pointing - * to an lws_tokens struct, it consists of a char * pointer called - * token, and an int called token_len. At entry, these are - * set to point to the received buffer and set to the content - * length. If the extension will grow the content, it should use - * a new buffer allocated in its private user context data and - * set the pointed-to lws_tokens members to point to its buffer. - * - * LWS_EXT_CALLBACK_PACKET_TX_PRESEND: this works the same way as - * LWS_EXT_CALLBACK_PACKET_RX_PREPARSE above, except it gives the - * extension a chance to change websocket data just before it will - * be sent out. Using the same lws_token pointer scheme in @in, - * the extension can change the buffer and the length to be - * transmitted how it likes. Again if it wants to grow the - * buffer safely, it should copy the data into its own buffer and - * set the lws_tokens token pointer to it. - */ -LWS_VISIBLE LWS_EXTERN int extension_callback(struct libwebsocket_context *context, - struct libwebsocket_extension *ext, - struct libwebsocket *wsi, - enum libwebsocket_extension_callback_reasons reason, - void *user, void *in, size_t len); - -typedef int (extension_callback_function)(struct libwebsocket_context *context, - struct libwebsocket_extension *ext, - struct libwebsocket *wsi, - enum libwebsocket_extension_callback_reasons reason, - void *user, void *in, size_t len); -#endif - -/** - * struct libwebsocket_protocols - List of protocols and handlers server - * supports. - * @name: Protocol name that must match the one given in the client - * Javascript new WebSocket(url, 'protocol') name - * @callback: The service callback used for this protocol. It allows the - * service action for an entire protocol to be encapsulated in - * the protocol-specific callback - * @per_session_data_size: Each new connection using this protocol gets - * this much memory allocated on connection establishment and - * freed on connection takedown. A pointer to this per-connection - * allocation is passed into the callback in the 'user' parameter - * @rx_buffer_size: if you want atomic frames delivered to the callback, you - * should set this to the size of the biggest legal frame that - * you support. If the frame size is exceeded, there is no - * error, but the buffer will spill to the user callback when - * full, which you can detect by using - * libwebsockets_remaining_packet_payload(). Notice that you - * just talk about frame size here, the LWS_SEND_BUFFER_PRE_PADDING - * and post-padding are automatically also allocated on top. - * @no_buffer_all_partial_tx: Leave at zero if you want the library to take - * care of all partial tx for you. It's useful if you only have - * small tx packets and the chance of any truncated send is small - * enough any additional malloc / buffering overhead is less - * painful than writing the code to deal with partial sends. For - * protocols where you stream big blocks, set to nonzero and use - * the return value from libwebsocket_write() to manage how much - * got send yourself. - * @owning_server: the server init call fills in this opaque pointer when - * registering this protocol with the server. - * @protocol_index: which protocol we are starting from zero - * - * This structure represents one protocol supported by the server. An - * array of these structures is passed to libwebsocket_create_server() - * allows as many protocols as you like to be handled by one server. - */ - -struct libwebsocket_protocols { - const char *name; - callback_function *callback; - size_t per_session_data_size; - size_t rx_buffer_size; - int no_buffer_all_partial_tx; - - /* - * below are filled in on server init and can be left uninitialized, - * no need for user to use them directly either - */ - - struct libwebsocket_context *owning_server; - int protocol_index; -}; - -#ifndef LWS_NO_EXTENSIONS -/** - * struct libwebsocket_extension - An extension we know how to cope with - * - * @name: Formal extension name, eg, "deflate-stream" - * @callback: Service callback - * @per_session_data_size: Libwebsockets will auto-malloc this much - * memory for the use of the extension, a pointer - * to it comes in the @user callback parameter - * @per_context_private_data: Optional storage for this extension that - * is per-context, so it can track stuff across - * all sessions, etc, if it wants - */ - -struct libwebsocket_extension { - const char *name; - extension_callback_function *callback; - size_t per_session_data_size; - void *per_context_private_data; -}; -#endif - -/** - * struct lws_context_creation_info: parameters to create context with - * - * @port: Port to listen on... you can use 0 to suppress listening on - * any port, that's what you want if you are not running a - * websocket server at all but just using it as a client - * @iface: NULL to bind the listen socket to all interfaces, or the - * interface name, eg, "eth2" - * @protocols: Array of structures listing supported protocols and a protocol- - * specific callback for each one. The list is ended with an - * entry that has a NULL callback pointer. - * It's not const because we write the owning_server member - * @extensions: NULL or array of libwebsocket_extension structs listing the - * extensions this context supports. If you configured with - * --without-extensions, you should give NULL here. - * @ssl_cert_filepath: If libwebsockets was compiled to use ssl, and you want - * to listen using SSL, set to the filepath to fetch the - * server cert from, otherwise NULL for unencrypted - * @ssl_private_key_filepath: filepath to private key if wanting SSL mode, - * else ignored - * @ssl_ca_filepath: CA certificate filepath or NULL - * @ssl_cipher_list: List of valid ciphers to use (eg, - * "RC4-MD5:RC4-SHA:AES128-SHA:AES256-SHA:HIGH:!DSS:!aNULL" - * or you can leave it as NULL to get "DEFAULT" - * @gid: group id to change to after setting listen socket, or -1. - * @uid: user id to change to after setting listen socket, or -1. - * @options: 0, or LWS_SERVER_OPTION_DEFEAT_CLIENT_MASK - * @user: optional user pointer that can be recovered via the context - * pointer using libwebsocket_context_user - * @ka_time: 0 for no keepalive, otherwise apply this keepalive timeout to - * all libwebsocket sockets, client or server - * @ka_probes: if ka_time was nonzero, after the timeout expires how many - * times to try to get a response from the peer before giving up - * and killing the connection - * @ka_interval: if ka_time was nonzero, how long to wait before each ka_probes - * attempt - */ - -struct lws_context_creation_info { - int port; - const char *iface; - struct libwebsocket_protocols *protocols; - struct libwebsocket_extension *extensions; - const char *ssl_cert_filepath; - const char *ssl_private_key_filepath; - const char *ssl_ca_filepath; - const char *ssl_cipher_list; - const char *http_proxy_address; - unsigned int http_proxy_port; - int gid; - int uid; - unsigned int options; - void *user; - int ka_time; - int ka_probes; - int ka_interval; - -}; - -LWS_VISIBLE LWS_EXTERN -void lws_set_log_level(int level, - void (*log_emit_function)(int level, const char *line)); - -LWS_VISIBLE LWS_EXTERN void -lwsl_emit_syslog(int level, const char *line); - -LWS_VISIBLE LWS_EXTERN struct libwebsocket_context * -libwebsocket_create_context(struct lws_context_creation_info *info); - -LWS_VISIBLE LWS_EXTERN int -libwebsocket_set_proxy(struct libwebsocket_context *context, const char *proxy); - -LWS_VISIBLE LWS_EXTERN void -libwebsocket_context_destroy(struct libwebsocket_context *context); - -LWS_VISIBLE LWS_EXTERN int -libwebsocket_service(struct libwebsocket_context *context, int timeout_ms); - -LWS_VISIBLE LWS_EXTERN void -libwebsocket_cancel_service(struct libwebsocket_context *context); - -#ifdef LWS_USE_LIBEV -LWS_VISIBLE LWS_EXTERN int -libwebsocket_initloop( - struct libwebsocket_context *context, struct ev_loop *loop); - -LWS_VISIBLE void -libwebsocket_sigint_cb( - struct ev_loop *loop, struct ev_signal *watcher, int revents); -#endif /* LWS_USE_LIBEV */ - -LWS_VISIBLE LWS_EXTERN int -libwebsocket_service_fd(struct libwebsocket_context *context, - struct libwebsocket_pollfd *pollfd); - -LWS_VISIBLE LWS_EXTERN void * -libwebsocket_context_user(struct libwebsocket_context *context); - -enum pending_timeout { - NO_PENDING_TIMEOUT = 0, - PENDING_TIMEOUT_AWAITING_PROXY_RESPONSE, - PENDING_TIMEOUT_AWAITING_CONNECT_RESPONSE, - PENDING_TIMEOUT_ESTABLISH_WITH_SERVER, - PENDING_TIMEOUT_AWAITING_SERVER_RESPONSE, - PENDING_TIMEOUT_AWAITING_PING, - PENDING_TIMEOUT_CLOSE_ACK, - PENDING_TIMEOUT_AWAITING_EXTENSION_CONNECT_RESPONSE, - PENDING_TIMEOUT_SENT_CLIENT_HANDSHAKE, - PENDING_TIMEOUT_SSL_ACCEPT, - PENDING_TIMEOUT_HTTP_CONTENT, - PENDING_TIMEOUT_AWAITING_CLIENT_HS_SEND, -}; - -LWS_VISIBLE LWS_EXTERN void -libwebsocket_set_timeout(struct libwebsocket *wsi, - enum pending_timeout reason, int secs); - -/* - * IMPORTANT NOTICE! - * - * When sending with websocket protocol (LWS_WRITE_TEXT or LWS_WRITE_BINARY) - * the send buffer has to have LWS_SEND_BUFFER_PRE_PADDING bytes valid BEFORE - * buf, and LWS_SEND_BUFFER_POST_PADDING bytes valid AFTER (buf + len). - * - * This allows us to add protocol info before and after the data, and send as - * one packet on the network without payload copying, for maximum efficiency. - * - * So for example you need this kind of code to use libwebsocket_write with a - * 128-byte payload - * - * char buf[LWS_SEND_BUFFER_PRE_PADDING + 128 + LWS_SEND_BUFFER_POST_PADDING]; - * - * // fill your part of the buffer... for example here it's all zeros - * memset(&buf[LWS_SEND_BUFFER_PRE_PADDING], 0, 128); - * - * libwebsocket_write(wsi, &buf[LWS_SEND_BUFFER_PRE_PADDING], 128, - * LWS_WRITE_TEXT); - * - * When sending LWS_WRITE_HTTP, there is no protocol addition and you can just - * use the whole buffer without taking care of the above. - */ - -/* - * this is the frame nonce plus two header plus 8 length - * there's an additional two for mux extension per mux nesting level - * 2 byte prepend on close will already fit because control frames cannot use - * the big length style - */ - -#define LWS_SEND_BUFFER_PRE_PADDING (4 + 10 + (2 * MAX_MUX_RECURSION)) -#define LWS_SEND_BUFFER_POST_PADDING 4 - -LWS_VISIBLE LWS_EXTERN int -libwebsocket_write(struct libwebsocket *wsi, unsigned char *buf, size_t len, - enum libwebsocket_write_protocol protocol); - -/* helper for case where buffer may be const */ -#define libwebsocket_write_http(wsi, buf, len) \ - libwebsocket_write(wsi, (unsigned char *)(buf), len, LWS_WRITE_HTTP) - -LWS_VISIBLE LWS_EXTERN int -libwebsockets_serve_http_file(struct libwebsocket_context *context, - struct libwebsocket *wsi, const char *file, - const char *content_type, const char *other_headers); -LWS_VISIBLE LWS_EXTERN int -libwebsockets_serve_http_file_fragment(struct libwebsocket_context *context, - struct libwebsocket *wsi); - -LWS_VISIBLE LWS_EXTERN int libwebsockets_return_http_status( - struct libwebsocket_context *context, - struct libwebsocket *wsi, unsigned int code, - const char *html_body); - -LWS_VISIBLE LWS_EXTERN const struct libwebsocket_protocols * -libwebsockets_get_protocol(struct libwebsocket *wsi); - -LWS_VISIBLE LWS_EXTERN int -libwebsocket_callback_on_writable(struct libwebsocket_context *context, - struct libwebsocket *wsi); - -LWS_VISIBLE LWS_EXTERN int -libwebsocket_callback_on_writable_all_protocol( - const struct libwebsocket_protocols *protocol); - -LWS_VISIBLE LWS_EXTERN int -libwebsocket_callback_all_protocol( - const struct libwebsocket_protocols *protocol, int reason); - -LWS_VISIBLE LWS_EXTERN int -libwebsocket_get_socket_fd(struct libwebsocket *wsi); - -LWS_VISIBLE LWS_EXTERN int -libwebsocket_is_final_fragment(struct libwebsocket *wsi); - -LWS_VISIBLE LWS_EXTERN unsigned char -libwebsocket_get_reserved_bits(struct libwebsocket *wsi); - -LWS_VISIBLE LWS_EXTERN int -libwebsocket_rx_flow_control(struct libwebsocket *wsi, int enable); - -LWS_VISIBLE LWS_EXTERN void -libwebsocket_rx_flow_allow_all_protocol( - const struct libwebsocket_protocols *protocol); - -LWS_VISIBLE LWS_EXTERN size_t -libwebsockets_remaining_packet_payload(struct libwebsocket *wsi); - -LWS_VISIBLE LWS_EXTERN struct libwebsocket * -libwebsocket_client_connect(struct libwebsocket_context *clients, - const char *address, - int port, - int ssl_connection, - const char *path, - const char *host, - const char *origin, - const char *protocol, - int ietf_version_or_minus_one); - -LWS_VISIBLE LWS_EXTERN struct libwebsocket * -libwebsocket_client_connect_extended(struct libwebsocket_context *clients, - const char *address, - int port, - int ssl_connection, - const char *path, - const char *host, - const char *origin, - const char *protocol, - int ietf_version_or_minus_one, - void *userdata); - -LWS_VISIBLE LWS_EXTERN const char * -libwebsocket_canonical_hostname(struct libwebsocket_context *context); - - -LWS_VISIBLE LWS_EXTERN void -libwebsockets_get_peer_addresses(struct libwebsocket_context *context, - struct libwebsocket *wsi, int fd, char *name, int name_len, - char *rip, int rip_len); - -LWS_VISIBLE LWS_EXTERN int -libwebsockets_get_random(struct libwebsocket_context *context, - void *buf, int len); - -LWS_VISIBLE LWS_EXTERN int -lws_daemonize(const char *_lock_path); - -LWS_VISIBLE LWS_EXTERN int -lws_send_pipe_choked(struct libwebsocket *wsi); - -LWS_VISIBLE LWS_EXTERN int -lws_frame_is_binary(struct libwebsocket *wsi); - -LWS_VISIBLE LWS_EXTERN unsigned char * -libwebsockets_SHA1(const unsigned char *d, size_t n, unsigned char *md); - -LWS_VISIBLE LWS_EXTERN int -lws_b64_encode_string(const char *in, int in_len, char *out, int out_size); - -LWS_VISIBLE LWS_EXTERN int -lws_b64_decode_string(const char *in, char *out, int out_size); - -LWS_VISIBLE LWS_EXTERN const char * -lws_get_library_version(void); - -/* access to headers... only valid while headers valid */ - -LWS_VISIBLE LWS_EXTERN int -lws_hdr_total_length(struct libwebsocket *wsi, enum lws_token_indexes h); - -LWS_VISIBLE LWS_EXTERN int -lws_hdr_copy(struct libwebsocket *wsi, char *dest, int len, - enum lws_token_indexes h); - -/* - * Note: this is not normally needed as a user api. It's provided in case it is - * useful when integrating with other app poll loop service code. - */ - -LWS_VISIBLE LWS_EXTERN int -libwebsocket_read(struct libwebsocket_context *context, - struct libwebsocket *wsi, - unsigned char *buf, size_t len); - -#ifndef LWS_NO_EXTENSIONS -LWS_VISIBLE LWS_EXTERN struct libwebsocket_extension *libwebsocket_get_internal_extensions(); -#endif - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/core/deps/libwebsocket/lws-plat-unix.c b/core/deps/libwebsocket/lws-plat-unix.c deleted file mode 100644 index ebec155d7..000000000 --- a/core/deps/libwebsocket/lws-plat-unix.c +++ /dev/null @@ -1,396 +0,0 @@ -#include "private-libwebsockets.h" - -#include "build.h" - -#if HOST_OS != OS_WINDOWS -/* - * included from libwebsockets.c for unix builds - */ - -unsigned long long time_in_microseconds(void) -{ - struct timeval tv; - gettimeofday(&tv, NULL); - return (tv.tv_sec * 1000000) + tv.tv_usec; -} - -LWS_VISIBLE int libwebsockets_get_random(struct libwebsocket_context *context, - void *buf, int len) -{ - return read(context->fd_random, (char *)buf, len); -} - -LWS_VISIBLE int lws_send_pipe_choked(struct libwebsocket *wsi) -{ - struct libwebsocket_pollfd fds; - - /* treat the fact we got a truncated send pending as if we're choked */ - if (wsi->truncated_send_len) - return 1; - - fds.fd = wsi->sock; - fds.events = POLLOUT; - fds.revents = 0; - - if (poll(&fds, 1, 0) != 1) - return 1; - - if ((fds.revents & POLLOUT) == 0) - return 1; - - /* okay to send another packet without blocking */ - - return 0; -} - -LWS_VISIBLE int -lws_poll_listen_fd(struct libwebsocket_pollfd *fd) -{ - return poll(fd, 1, 0); -} - -/* - * This is just used to interrupt poll waiting - * we don't have to do anything with it. - */ -static void lws_sigusr2(int sig) -{ -} - -/** - * libwebsocket_cancel_service() - Cancel servicing of pending websocket activity - * @context: Websocket context - * - * This function let a call to libwebsocket_service() waiting for a timeout - * immediately return. - */ -LWS_VISIBLE void -libwebsocket_cancel_service(struct libwebsocket_context *context) -{ - char buf = 0; - - if (write(context->dummy_pipe_fds[1], &buf, sizeof(buf)) != 1) - lwsl_err("Cannot write to dummy pipe"); -} - -LWS_VISIBLE void lwsl_emit_syslog(int level, const char *line) -{ -/* - int syslog_level = LOG_DEBUG; - - switch (level) { - case LLL_ERR: - syslog_level = LOG_ERR; - break; - case LLL_WARN: - syslog_level = LOG_WARNING; - break; - case LLL_NOTICE: - syslog_level = LOG_NOTICE; - break; - case LLL_INFO: - syslog_level = LOG_INFO; - break; - } - */ - printf("%s", line); -} - -LWS_VISIBLE int -lws_plat_service(struct libwebsocket_context *context, int timeout_ms) -{ - int n; - int m; - char buf; - - /* stay dead once we are dead */ - - if (!context) - return 1; - - lws_libev_run(context); - - context->service_tid = context->protocols[0].callback(context, NULL, - LWS_CALLBACK_GET_THREAD_ID, NULL, NULL, 0); - - n = poll(context->fds, context->fds_count, timeout_ms); - context->service_tid = 0; - - if (n == 0) /* poll timeout */ { - libwebsocket_service_fd(context, NULL); - return 0; - } - - if (n < 0) { - if (LWS_ERRNO != LWS_EINTR) - return -1; - return 0; - } - - /* any socket with events to service? */ - - for (n = 0; n < context->fds_count; n++) { - if (!context->fds[n].revents) - continue; - - if (context->fds[n].fd == context->dummy_pipe_fds[0]) { - if (read(context->fds[n].fd, &buf, 1) != 1) - lwsl_err("Cannot read from dummy pipe."); - continue; - } - - m = libwebsocket_service_fd(context, &context->fds[n]); - if (m < 0) - return -1; - /* if something closed, retry this slot */ - if (m) - n--; - } - - return 0; -} - -LWS_VISIBLE int -lws_plat_set_socket_options(struct libwebsocket_context *context, int fd) -{ - int optval = 1; - socklen_t optlen = sizeof(optval); - -#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) - struct protoent *tcp_proto; -#endif - - if (context->ka_time) { - /* enable keepalive on this socket */ - optval = 1; - if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, - (const void *)&optval, optlen) < 0) - return 1; - -#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__CYGWIN__) - - /* - * didn't find a way to set these per-socket, need to - * tune kernel systemwide values - */ -#else - /* set the keepalive conditions we want on it too */ - optval = context->ka_time; - if (setsockopt(fd, IPPROTO_IP, TCP_KEEPIDLE, - (const void *)&optval, optlen) < 0) - return 1; - - optval = context->ka_interval; - if (setsockopt(fd, IPPROTO_IP, TCP_KEEPINTVL, - (const void *)&optval, optlen) < 0) - return 1; - - optval = context->ka_probes; - if (setsockopt(fd, IPPROTO_IP, TCP_KEEPCNT, - (const void *)&optval, optlen) < 0) - return 1; -#endif - } - - /* Disable Nagle */ - optval = 1; -#if !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__NetBSD__) - setsockopt(fd, SOL_TCP, TCP_NODELAY, (const void *)&optval, optlen); -#else - tcp_proto = getprotobyname("TCP"); - setsockopt(fd, tcp_proto->p_proto, TCP_NODELAY, &optval, optlen); -#endif - - /* We are nonblocking... */ - fcntl(fd, F_SETFL, O_NONBLOCK); - - return 0; -} - -LWS_VISIBLE void -lws_plat_drop_app_privileges(struct lws_context_creation_info *info) -{ - if (info->gid != -1) - if (setgid(info->gid)) - lwsl_warn("setgid: %s\n", strerror(LWS_ERRNO)); - if (info->uid != -1) - if (setuid(info->uid)) - lwsl_warn("setuid: %s\n", strerror(LWS_ERRNO)); -} - -LWS_VISIBLE int -lws_plat_init_fd_tables(struct libwebsocket_context *context) -{ - if (lws_libev_init_fd_table(context)) - /* libev handled it instead */ - return 0; - - if (pipe(context->dummy_pipe_fds)) { - lwsl_err("Unable to create pipe\n"); - return 1; - } - - /* use the read end of pipe as first item */ - context->fds[0].fd = context->dummy_pipe_fds[0]; - context->fds[0].events = LWS_POLLIN; - context->fds[0].revents = 0; - context->fds_count = 1; - - context->fd_random = open(SYSTEM_RANDOM_FILEPATH, O_RDONLY); - if (context->fd_random < 0) { - lwsl_err("Unable to open random device %s %d\n", - SYSTEM_RANDOM_FILEPATH, context->fd_random); - return 1; - } - - return 0; -} - -static void sigpipe_handler(int x) -{ -} - - -LWS_VISIBLE int -lws_plat_context_early_init(void) -{ - sigset_t mask; - - signal(SIGUSR2, lws_sigusr2); - sigemptyset(&mask); - sigaddset(&mask, SIGUSR2); - - sigprocmask(SIG_BLOCK, &mask, NULL); - - signal(SIGPIPE, sigpipe_handler); - - return 0; -} - -LWS_VISIBLE void -lws_plat_context_early_destroy(struct libwebsocket_context *context) -{ -} - -LWS_VISIBLE void -lws_plat_context_late_destroy(struct libwebsocket_context *context) -{ - close(context->dummy_pipe_fds[0]); - close(context->dummy_pipe_fds[1]); - close(context->fd_random); -} - -/* cast a struct sockaddr_in6 * into addr for ipv6 */ - -LWS_VISIBLE int -interface_to_sa(struct libwebsocket_context *context, - const char *ifname, struct sockaddr_in *addr, size_t addrlen) -{ - int rc = -1; - - struct ifaddrs *ifr; - struct ifaddrs *ifc; -#ifdef LWS_USE_IPV6 - struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr; -#endif - - getifaddrs(&ifr); - for (ifc = ifr; ifc != NULL && rc; ifc = ifc->ifa_next) { - if (!ifc->ifa_addr) - continue; - - lwsl_info(" interface %s vs %s\n", ifc->ifa_name, ifname); - - if (strcmp(ifc->ifa_name, ifname)) - continue; - - switch (ifc->ifa_addr->sa_family) { - case AF_INET: -#ifdef LWS_USE_IPV6 - if (LWS_IPV6_ENABLED(context)) { - /* map IPv4 to IPv6 */ - bzero((char *)&addr6->sin6_addr, - sizeof(struct in6_addr)); - addr6->sin6_addr.s6_addr[10] = 0xff; - addr6->sin6_addr.s6_addr[11] = 0xff; - memcpy(&addr6->sin6_addr.s6_addr[12], - &((struct sockaddr_in *)ifc->ifa_addr)->sin_addr, - sizeof(struct in_addr)); - } else -#endif - memcpy(addr, - (struct sockaddr_in *)ifc->ifa_addr, - sizeof(struct sockaddr_in)); - break; -#ifdef LWS_USE_IPV6 - case AF_INET6: - if (rc >= 0) - break; - memcpy(&addr6->sin6_addr, - &((struct sockaddr_in6 *)ifc->ifa_addr)->sin6_addr, - sizeof(struct in6_addr)); - break; -#endif - default: - continue; - } - rc = 0; - } - - freeifaddrs(ifr); - - return rc; -} - -LWS_VISIBLE void -lws_plat_insert_socket_into_fds(struct libwebsocket_context *context, - struct libwebsocket *wsi) -{ - lws_libev_io(context, wsi, LWS_EV_START | LWS_EV_READ); - context->fds[context->fds_count++].revents = 0; -} - -LWS_VISIBLE void -lws_plat_delete_socket_from_fds(struct libwebsocket_context *context, - struct libwebsocket *wsi, int m) -{ -} - -LWS_VISIBLE void -lws_plat_service_periodic(struct libwebsocket_context *context) -{ - /* if our parent went down, don't linger around */ - if (context->started_with_parent && - kill(context->started_with_parent, 0) < 0) - kill(getpid(), SIGTERM); -} - -LWS_VISIBLE int -lws_plat_change_pollfd(struct libwebsocket_context *context, - struct libwebsocket *wsi, struct libwebsocket_pollfd *pfd) -{ - return 0; -} - -LWS_VISIBLE int -lws_plat_open_file(const char* filename, unsigned long* filelen) -{ - struct stat stat_buf; - int ret = open(filename, O_RDONLY); - - if (ret < 0) - return LWS_INVALID_FILE; - - fstat(ret, &stat_buf); - *filelen = stat_buf.st_size; - return ret; -} - -#ifdef LWS_USE_IPV6 -LWS_VISIBLE const char * -lws_plat_inet_ntop(int af, const void *src, char *dst, int cnt) -{ - return inet_ntop(af, src, dst, cnt); -} -#endif -#endif \ No newline at end of file diff --git a/core/deps/libwebsocket/lws-plat-win.c b/core/deps/libwebsocket/lws-plat-win.c deleted file mode 100644 index ef25eb0d3..000000000 --- a/core/deps/libwebsocket/lws-plat-win.c +++ /dev/null @@ -1,365 +0,0 @@ -#include "private-libwebsockets.h" - - -#include "build.h" - -#if HOST_OS == OS_WINDOWS - -unsigned long long -time_in_microseconds() -{ -#define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL - FILETIME filetime; - ULARGE_INTEGER datetime; - -#ifdef _WIN32_WCE - GetCurrentFT(&filetime); -#else - GetSystemTimeAsFileTime(&filetime); -#endif - - /* - * As per Windows documentation for FILETIME, copy the resulting FILETIME structure to a - * ULARGE_INTEGER structure using memcpy (using memcpy instead of direct assignment can - * prevent alignment faults on 64-bit Windows). - */ - memcpy(&datetime, &filetime, sizeof(datetime)); - - /* Windows file times are in 100s of nanoseconds. */ - return (datetime.QuadPart - DELTA_EPOCH_IN_MICROSECS) / 10; -} - -#ifdef _WIN32_WCE -time_t time(time_t *t) -{ - time_t ret = time_in_microseconds() / 1000000; - *t = ret; - return ret; -} -#endif - -LWS_VISIBLE int libwebsockets_get_random(struct libwebsocket_context *context, - void *buf, int len) -{ - int n; - char *p = (char *)buf; - - for (n = 0; n < len; n++) - p[n] = (unsigned char)rand(); - - return n; -} - -LWS_VISIBLE int lws_send_pipe_choked(struct libwebsocket *wsi) -{ - return wsi->sock_send_blocking; -} - -LWS_VISIBLE int lws_poll_listen_fd(struct libwebsocket_pollfd *fd) -{ - fd_set readfds; - struct timeval tv = { 0, 0 }; - - assert(fd->events == LWS_POLLIN); - - FD_ZERO(&readfds); - FD_SET(fd->fd, &readfds); - - return select(fd->fd + 1, &readfds, NULL, NULL, &tv); -} - -/** - * libwebsocket_cancel_service() - Cancel servicing of pending websocket activity - * @context: Websocket context - * - * This function let a call to libwebsocket_service() waiting for a timeout - * immediately return. - */ -LWS_VISIBLE void -libwebsocket_cancel_service(struct libwebsocket_context *context) -{ - WSASetEvent(context->events[0]); -} - -LWS_VISIBLE void lwsl_emit_syslog(int level, const char *line) -{ - lwsl_emit_stderr(level, line); -} - -LWS_VISIBLE int -lws_plat_service(struct libwebsocket_context *context, int timeout_ms) -{ - int n; - int i; - DWORD ev; - WSANETWORKEVENTS networkevents; - struct libwebsocket_pollfd *pfd; - - /* stay dead once we are dead */ - - if (context == NULL) - return 1; - - context->service_tid = context->protocols[0].callback(context, NULL, - LWS_CALLBACK_GET_THREAD_ID, NULL, NULL, 0); - - for (i = 0; i < context->fds_count; ++i) { - pfd = &context->fds[i]; - if (pfd->fd == context->listen_service_fd) - continue; - - if (pfd->events & LWS_POLLOUT) { - if (context->lws_lookup[pfd->fd]->sock_send_blocking) - continue; - pfd->revents = LWS_POLLOUT; - n = libwebsocket_service_fd(context, pfd); - if (n < 0) - return n; - } - } - - ev = WSAWaitForMultipleEvents(context->fds_count + 1, - context->events, FALSE, timeout_ms, FALSE); - context->service_tid = 0; - - if (ev == WSA_WAIT_TIMEOUT) { - libwebsocket_service_fd(context, NULL); - return 0; - } - - if (ev == WSA_WAIT_EVENT_0) { - WSAResetEvent(context->events[0]); - return 0; - } - - if (ev < WSA_WAIT_EVENT_0 || ev > WSA_WAIT_EVENT_0 + context->fds_count) - return -1; - - pfd = &context->fds[ev - WSA_WAIT_EVENT_0 - 1]; - - if (WSAEnumNetworkEvents(pfd->fd, - context->events[ev - WSA_WAIT_EVENT_0], - &networkevents) == SOCKET_ERROR) { - lwsl_err("WSAEnumNetworkEvents() failed with error %d\n", - LWS_ERRNO); - return -1; - } - - pfd->revents = networkevents.lNetworkEvents; - - if (pfd->revents & LWS_POLLOUT) - context->lws_lookup[pfd->fd]->sock_send_blocking = FALSE; - - return libwebsocket_service_fd(context, pfd); -} - -LWS_VISIBLE int -lws_plat_set_socket_options(struct libwebsocket_context *context, int fd) -{ - int optval = 1; - int optlen = sizeof(optval); - u_long optl = 1; - DWORD dwBytesRet; - struct tcp_keepalive alive; - struct protoent *tcp_proto; - - if (context->ka_time) { - /* enable keepalive on this socket */ - optval = 1; - if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, - (const char *)&optval, optlen) < 0) - return 1; - - alive.onoff = TRUE; - alive.keepalivetime = context->ka_time; - alive.keepaliveinterval = context->ka_interval; - - if (WSAIoctl(fd, SIO_KEEPALIVE_VALS, &alive, sizeof(alive), - NULL, 0, &dwBytesRet, NULL, NULL)) - return 1; - } - - /* Disable Nagle */ - optval = 1; - tcp_proto = getprotobyname("TCP"); - setsockopt(fd, tcp_proto->p_proto, TCP_NODELAY, (const char *)&optval, optlen); - - /* We are nonblocking... */ - ioctlsocket(fd, FIONBIO, &optl); - - return 0; -} - -LWS_VISIBLE void -lws_plat_drop_app_privileges(struct lws_context_creation_info *info) -{ -} - -LWS_VISIBLE int -lws_plat_init_fd_tables(struct libwebsocket_context *context) -{ - context->events = (WSAEVENT *)malloc(sizeof(WSAEVENT) * - (context->max_fds + 1)); - if (context->events == NULL) { - lwsl_err("Unable to allocate events array for %d connections\n", - context->max_fds); - return 1; - } - - context->fds_count = 0; - context->events[0] = WSACreateEvent(); - - context->fd_random = 0; - - return 0; -} - -LWS_VISIBLE int -lws_plat_context_early_init(void) -{ - WORD wVersionRequested; - WSADATA wsaData; - int err; - - /* Use the MAKEWORD(lowbyte, highbyte) macro from Windef.h */ - wVersionRequested = MAKEWORD(2, 2); - - err = WSAStartup(wVersionRequested, &wsaData); - if (!err) - return 0; - /* - * Tell the user that we could not find a usable - * Winsock DLL - */ - lwsl_err("WSAStartup failed with error: %d\n", err); - - return 1; -} - -LWS_VISIBLE void -lws_plat_context_early_destroy(struct libwebsocket_context *context) -{ - if (context->events) { - WSACloseEvent(context->events[0]); - free(context->events); - } -} - -LWS_VISIBLE void -lws_plat_context_late_destroy(struct libwebsocket_context *context) -{ - WSACleanup(); -} - -LWS_VISIBLE int -interface_to_sa(struct libwebsocket_context *context, - const char *ifname, struct sockaddr_in *addr, size_t addrlen) -{ - return -1; -} - -LWS_VISIBLE void -lws_plat_insert_socket_into_fds(struct libwebsocket_context *context, - struct libwebsocket *wsi) -{ - context->fds[context->fds_count++].revents = 0; - context->events[context->fds_count] = WSACreateEvent(); - WSAEventSelect(wsi->sock, context->events[context->fds_count], LWS_POLLIN); -} - -LWS_VISIBLE void -lws_plat_delete_socket_from_fds(struct libwebsocket_context *context, - struct libwebsocket *wsi, int m) -{ - WSACloseEvent(context->events[m + 1]); - context->events[m + 1] = context->events[context->fds_count + 1]; -} - -LWS_VISIBLE void -lws_plat_service_periodic(struct libwebsocket_context *context) -{ -} - -LWS_VISIBLE int -lws_plat_change_pollfd(struct libwebsocket_context *context, - struct libwebsocket *wsi, struct libwebsocket_pollfd *pfd) -{ - long networkevents = LWS_POLLOUT | LWS_POLLHUP; - - if ((pfd->events & LWS_POLLIN)) - networkevents |= LWS_POLLIN; - - if (WSAEventSelect(wsi->sock, - context->events[wsi->position_in_fds_table + 1], - networkevents) != SOCKET_ERROR) - return 0; - - lwsl_err("WSAEventSelect() failed with error %d\n", LWS_ERRNO); - - return 1; -} - -LWS_VISIBLE HANDLE -lws_plat_open_file(const char* filename, unsigned long* filelen) -{ - HANDLE ret; - WCHAR buffer[MAX_PATH]; - - MultiByteToWideChar(CP_UTF8, 0, filename, -1, buffer, - sizeof(buffer) / sizeof(buffer[0])); - ret = CreateFileW(buffer, GENERIC_READ, FILE_SHARE_READ, - NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - - if (ret != LWS_INVALID_FILE) - *filelen = GetFileSize(ret, NULL); - - return ret; -} - -LWS_VISIBLE const char * -lws_plat_inet_ntop(int af, const void *src, char *dst, int cnt) -{ - WCHAR *buffer; - DWORD bufferlen = cnt; - BOOL ok = FALSE; - - buffer = malloc(bufferlen); - if (!buffer) { - lwsl_err("Out of memory\n"); - return NULL; - } - - if (af == AF_INET) { - struct sockaddr_in srcaddr; - bzero(&srcaddr, sizeof(srcaddr)); - srcaddr.sin_family = AF_INET; - memcpy(&(srcaddr.sin_addr), src, sizeof(srcaddr.sin_addr)); - - if (!WSAAddressToStringW((struct sockaddr*)&srcaddr, sizeof(srcaddr), 0, buffer, &bufferlen)) - ok = TRUE; -#ifdef LWS_USE_IPV6 - } else if (af == AF_INET6) { - struct sockaddr_in6 srcaddr; - bzero(&srcaddr, sizeof(srcaddr)); - srcaddr.sin6_family = AF_INET6; - memcpy(&(srcaddr.sin6_addr), src, sizeof(srcaddr.sin6_addr)); - - if (!WSAAddressToStringW((struct sockaddr*)&srcaddr, sizeof(srcaddr), 0, buffer, &bufferlen)) - ok = TRUE; -#endif - } else - lwsl_err("Unsupported type\n"); - - if (!ok) { - int rv = WSAGetLastError(); - lwsl_err("WSAAddressToString() : %d\n", rv); - } else { - if (WideCharToMultiByte(CP_ACP, 0, buffer, bufferlen, dst, cnt, 0, NULL) <= 0) - ok = FALSE; - } - - free(buffer); - return ok ? dst : NULL; -} - -#endif \ No newline at end of file diff --git a/core/deps/libwebsocket/lws_config.h b/core/deps/libwebsocket/lws_config.h deleted file mode 100644 index fb0743f4d..000000000 --- a/core/deps/libwebsocket/lws_config.h +++ /dev/null @@ -1,174 +0,0 @@ -/* config.h.in. Generated from configure.ac by autoheader. */ - -#ifndef WIN32 -#define _DEBUG -#endif - -/* Define to 1 to use CyaSSL as a replacement for OpenSSL. - * LWS_OPENSSL_SUPPORT needs to be set also for this to work. */ -/* #undef USE_CYASSL */ - -/* The Libwebsocket version */ -#define LWS_LIBRARY_VERSION "1.3" - -/* The current git commit hash that we're building from */ -#define LWS_BUILD_HASH "c11b847" - -/* Build with OpenSSL support */ -/* #undef LWS_OPENSSL_SUPPORT */ - -/* The client should load and trust CA root certs it finds in the OS */ -/* #undef LWS_SSL_CLIENT_USE_OS_CA_CERTS */ - -/* Sets the path where the client certs should be installed. */ -#define LWS_OPENSSL_CLIENT_CERTS "../share" - -/* Turn off websocket extensions */ -/* #undef LWS_NO_EXTENSIONS */ - -/* Enable libev io loop */ -/* #undef LWS_USE_LIBEV */ - -/* Build with support for ipv6 */ -/* #undef LWS_USE_IPV6 */ - -/* Build with support for HTTP2 */ -/* #undef LWS_USE_HTTP2 */ - -/* Turn on latency measuring code */ -/* #undef LWS_LATENCY */ - -/* Don't build the daemonizeation api */ -#define LWS_NO_DAEMONIZE - -/* Build without server support */ -/* #undef LWS_NO_SERVER */ - -/* Build without client support */ -/* #undef LWS_NO_CLIENT */ - -/* If we should compile with MinGW support */ -/* #undef LWS_MINGW_SUPPORT */ - -/* Use the BSD getifaddrs that comes with libwebsocket, for uclibc support */ -#define LWS_BUILTIN_GETIFADDRS - -/* Define to 1 if you have the `bzero' function. */ -/* #undef HAVE_BZERO */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_DLFCN_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_FCNTL_H - -/* Define to 1 if you have the `fork' function. */ -/* #undef HAVE_FORK */ - -/* Define to 1 if you have the `getenv’ function. */ -#define HAVE_GETENV - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_IN6ADDR_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_INTTYPES_H */ - -/* Define to 1 if you have the `ssl' library (-lssl). */ -/* #undef HAVE_LIBSSL */ - -/* Define to 1 if your system has a GNU libc compatible `malloc' function, and - to 0 otherwise. */ -#define HAVE_MALLOC - -/* Define to 1 if you have the header file. */ -#define HAVE_MEMORY_H - -/* Define to 1 if you have the `memset' function. */ -#define HAVE_MEMSET - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_NETINET_IN_H */ - -/* Define to 1 if your system has a GNU libc compatible `realloc' function, - and to 0 otherwise. */ -#define HAVE_REALLOC - -/* Define to 1 if you have the `socket' function. */ -/* #undef HAVE_SOCKET */ - -/* Define to 1 if you have the header file. */ -#define HAVE_STDINT_H - -/* Define to 1 if you have the header file. */ -#define HAVE_STDLIB_H - -/* Define to 1 if you have the `strerror' function. */ -#define HAVE_STRERROR - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_STRINGS_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_STRING_H - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_PRCTL_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_SOCKET_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_STAT_H - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_TYPES_H - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_UNISTD_H */ - -/* Define to 1 if you have the `vfork' function. */ -/* #undef HAVE_VFORK */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_VFORK_H */ - -/* Define to 1 if `fork' works. */ -#define HAVE_WORKING_FORK - -/* Define to 1 if `vfork' works. */ -#define HAVE_WORKING_VFORK - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_ZLIB_H */ - -/* Define to the sub-directory in which libtool stores uninstalled libraries. - */ -#undef LT_OBJDIR // We're not using libtool - -/* Define to 1 if you have the ANSI C header files. */ -#define STDC_HEADERS - -/* Version number of package */ -#define VERSION - -/* Define to rpl_malloc if the replacement function should be used. */ -/* #undef malloc */ - -/* Define to `int' if does not define. */ -#define pid_t - -/* Define to rpl_realloc if the replacement function should be used. */ -/* #undef realloc */ - -/* Define to `unsigned int' if does not define. */ -/* #undef size_t */ - -/* Define to 1 if we have getifaddrs */ -/* #undef HAVE_GETIFADDRS */ - -/* Define as `fork' if `vfork' does not work. */ -/* #undef vfork */ - -/* Define if the inline keyword doesn't exist. */ -#define inline diff --git a/core/deps/libwebsocket/output.c b/core/deps/libwebsocket/output.c deleted file mode 100644 index 28e15a6d4..000000000 --- a/core/deps/libwebsocket/output.c +++ /dev/null @@ -1,571 +0,0 @@ -/* - * libwebsockets - small server side websockets and web server implementation - * - * Copyright (C) 2010-2014 Andy Green - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation: - * version 2.1 of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301 USA - */ - -#include "private-libwebsockets.h" - -static int -libwebsocket_0405_frame_mask_generate(struct libwebsocket *wsi) -{ - int n; - - /* fetch the per-frame nonce */ - - n = libwebsockets_get_random(wsi->protocol->owning_server, - wsi->u.ws.frame_masking_nonce_04, 4); - if (n != 4) { - lwsl_parser("Unable to read from random device %s %d\n", - SYSTEM_RANDOM_FILEPATH, n); - return 1; - } - - /* start masking from first byte of masking key buffer */ - wsi->u.ws.frame_mask_index = 0; - - return 0; -} - -#ifdef _DEBUG - -LWS_VISIBLE void lwsl_hexdump(void *vbuf, size_t len) -{ - int n; - int m; - int start; - unsigned char *buf = (unsigned char *)vbuf; - char line[80]; - char *p; - - lwsl_parser("\n"); - - for (n = 0; n < len;) { - start = n; - p = line; - - p += sprintf(p, "%04X: ", start); - - for (m = 0; m < 16 && n < len; m++) - p += sprintf(p, "%02X ", buf[n++]); - while (m++ < 16) - p += sprintf(p, " "); - - p += sprintf(p, " "); - - for (m = 0; m < 16 && (start + m) < len; m++) { - if (buf[start + m] >= ' ' && buf[start + m] < 127) - *p++ = buf[start + m]; - else - *p++ = '.'; - } - while (m++ < 16) - *p++ = ' '; - - *p++ = '\n'; - *p = '\0'; - lwsl_debug("%s", line); - } - lwsl_debug("\n"); -} - -#endif - -/* - * notice this returns number of bytes consumed, or -1 - */ - -int lws_issue_raw(struct libwebsocket *wsi, unsigned char *buf, size_t len) -{ - struct libwebsocket_context *context = wsi->protocol->owning_server; - int n; - size_t real_len = len; - int m; - - if (!len) - return 0; - /* just ignore sends after we cleared the truncation buffer */ - if (wsi->state == WSI_STATE_FLUSHING_STORED_SEND_BEFORE_CLOSE && - !wsi->truncated_send_len) - return len; - - if (wsi->truncated_send_len && (buf < wsi->truncated_send_malloc || - buf > (wsi->truncated_send_malloc + - wsi->truncated_send_len + - wsi->truncated_send_offset))) { - lwsl_err("****** %x Sending new, pending truncated ...\n", wsi); - assert(0); - } - - m = lws_ext_callback_for_each_active(wsi, - LWS_EXT_CALLBACK_PACKET_TX_DO_SEND, &buf, len); - if (m < 0) - return -1; - if (m) /* handled */ { - n = m; - goto handle_truncated_send; - } - if (wsi->sock < 0) - lwsl_warn("** error invalid sock but expected to send\n"); - - /* - * nope, send it on the socket directly - */ - lws_latency_pre(context, wsi); - n = lws_ssl_capable_write(wsi, buf, len); - lws_latency(context, wsi, "send lws_issue_raw", n, n == len); - - switch (n) { - case LWS_SSL_CAPABLE_ERROR: - return -1; - case LWS_SSL_CAPABLE_MORE_SERVICE: - /* nothing got sent, not fatal, retry the whole thing later */ - n = 0; - break; - } - -handle_truncated_send: - /* - * we were already handling a truncated send? - */ - if (wsi->truncated_send_len) { - lwsl_info("***** %x partial send moved on by %d (vs %d)\n", - wsi, n, real_len); - wsi->truncated_send_offset += n; - wsi->truncated_send_len -= n; - - if (!wsi->truncated_send_len) { - lwsl_info("***** %x partial send completed\n", wsi); - /* done with it, but don't free it */ - n = real_len; - if (wsi->state == WSI_STATE_FLUSHING_STORED_SEND_BEFORE_CLOSE) { - lwsl_info("***** %x signalling to close now\n", wsi); - return -1; /* retry closing now */ - } - } - /* always callback on writeable */ - libwebsocket_callback_on_writable( - wsi->protocol->owning_server, wsi); - - return n; - } - - if (n == real_len) - /* what we just sent went out cleanly */ - return n; - - if (n && wsi->u.ws.clean_buffer) - /* - * This buffer unaffected by extension rewriting. - * It means the user code is expected to deal with - * partial sends. (lws knows the header was already - * sent, so on next send will just resume sending - * payload) - */ - return n; - - /* - * Newly truncated send. Buffer the remainder (it will get - * first priority next time the socket is writable) - */ - lwsl_info("***** %x new partial sent %d from %d total\n", - wsi, n, real_len); - - /* - * - if we still have a suitable malloc lying around, use it - * - or, if too small, reallocate it - * - or, if no buffer, create it - */ - if (!wsi->truncated_send_malloc || - real_len - n > wsi->truncated_send_allocation) { - if (wsi->truncated_send_malloc) - free(wsi->truncated_send_malloc); - - wsi->truncated_send_allocation = real_len - n; - wsi->truncated_send_malloc = malloc(real_len - n); - if (!wsi->truncated_send_malloc) { - lwsl_err("truncated send: unable to malloc %d\n", - real_len - n); - return -1; - } - } - wsi->truncated_send_offset = 0; - wsi->truncated_send_len = real_len - n; - memcpy(wsi->truncated_send_malloc, buf + n, real_len - n); - - /* since something buffered, force it to get another chance to send */ - libwebsocket_callback_on_writable(wsi->protocol->owning_server, wsi); - - return real_len; -} - -/** - * libwebsocket_write() - Apply protocol then write data to client - * @wsi: Websocket instance (available from user callback) - * @buf: The data to send. For data being sent on a websocket - * connection (ie, not default http), this buffer MUST have - * LWS_SEND_BUFFER_PRE_PADDING bytes valid BEFORE the pointer - * and an additional LWS_SEND_BUFFER_POST_PADDING bytes valid - * in the buffer after (buf + len). This is so the protocol - * header and trailer data can be added in-situ. - * @len: Count of the data bytes in the payload starting from buf - * @protocol: Use LWS_WRITE_HTTP to reply to an http connection, and one - * of LWS_WRITE_BINARY or LWS_WRITE_TEXT to send appropriate - * data on a websockets connection. Remember to allow the extra - * bytes before and after buf if LWS_WRITE_BINARY or LWS_WRITE_TEXT - * are used. - * - * This function provides the way to issue data back to the client - * for both http and websocket protocols. - * - * In the case of sending using websocket protocol, be sure to allocate - * valid storage before and after buf as explained above. This scheme - * allows maximum efficiency of sending data and protocol in a single - * packet while not burdening the user code with any protocol knowledge. - * - * Return may be -1 for a fatal error needing connection close, or a - * positive number reflecting the amount of bytes actually sent. This - * can be less than the requested number of bytes due to OS memory - * pressure at any given time. - */ - -LWS_VISIBLE int libwebsocket_write(struct libwebsocket *wsi, unsigned char *buf, - size_t len, enum libwebsocket_write_protocol protocol) -{ - int n; - int pre = 0; - int post = 0; - int masked7 = wsi->mode == LWS_CONNMODE_WS_CLIENT; - unsigned char *dropmask = NULL; - unsigned char is_masked_bit = 0; - size_t orig_len = len; - struct lws_tokens eff_buf; - - if (len == 0 && protocol != LWS_WRITE_CLOSE && - protocol != LWS_WRITE_PING && protocol != LWS_WRITE_PONG) { - lwsl_warn("zero length libwebsocket_write attempt\n"); - return 0; - } - - if (protocol == LWS_WRITE_HTTP) - goto send_raw; - - /* websocket protocol, either binary or text */ - - if (wsi->state != WSI_STATE_ESTABLISHED) - return -1; - - /* if we are continuing a frame that already had its header done */ - - if (wsi->u.ws.inside_frame) - goto do_more_inside_frame; - - /* if he wants all partials buffered, never have a clean_buffer */ - wsi->u.ws.clean_buffer = !wsi->protocol->no_buffer_all_partial_tx; - - /* - * give a chance to the extensions to modify payload - * pre-TX mangling is not allowed to truncate - */ - eff_buf.token = (char *)buf; - eff_buf.token_len = len; - - switch (protocol) { - case LWS_WRITE_PING: - case LWS_WRITE_PONG: - case LWS_WRITE_CLOSE: - break; - default: - if (lws_ext_callback_for_each_active(wsi, - LWS_EXT_CALLBACK_PAYLOAD_TX, &eff_buf, 0) < 0) - return -1; - } - - /* - * an extension did something we need to keep... for example, if - * compression extension, it has already updated its state according - * to this being issued - */ - if ((char *)buf != eff_buf.token) - /* - * extension recreated it: - * need to buffer this if not all sent - */ - wsi->u.ws.clean_buffer = 0; - - buf = (unsigned char *)eff_buf.token; - len = eff_buf.token_len; - - switch (wsi->ietf_spec_revision) { - case 13: - - if (masked7) { - pre += 4; - dropmask = &buf[0 - pre]; - is_masked_bit = 0x80; - } - - switch (protocol & 0xf) { - case LWS_WRITE_TEXT: - n = LWS_WS_OPCODE_07__TEXT_FRAME; - break; - case LWS_WRITE_BINARY: - n = LWS_WS_OPCODE_07__BINARY_FRAME; - break; - case LWS_WRITE_CONTINUATION: - n = LWS_WS_OPCODE_07__CONTINUATION; - break; - - case LWS_WRITE_CLOSE: - n = LWS_WS_OPCODE_07__CLOSE; - - /* - * 06+ has a 2-byte status code in network order - * we can do this because we demand post-buf - */ - - if (wsi->u.ws.close_reason) { - /* reason codes count as data bytes */ - buf -= 2; - buf[0] = wsi->u.ws.close_reason >> 8; - buf[1] = wsi->u.ws.close_reason; - len += 2; - } - break; - case LWS_WRITE_PING: - n = LWS_WS_OPCODE_07__PING; - break; - case LWS_WRITE_PONG: - n = LWS_WS_OPCODE_07__PONG; - break; - default: - lwsl_warn("lws_write: unknown write opc / protocol\n"); - return -1; - } - - if (!(protocol & LWS_WRITE_NO_FIN)) - n |= 1 << 7; - - if (len < 126) { - pre += 2; - buf[-pre] = n; - buf[-pre + 1] = len | is_masked_bit; - } else { - if (len < 65536) { - pre += 4; - buf[-pre] = n; - buf[-pre + 1] = 126 | is_masked_bit; - buf[-pre + 2] = len >> 8; - buf[-pre + 3] = len; - } else { - pre += 10; - buf[-pre] = n; - buf[-pre + 1] = 127 | is_masked_bit; -#if defined __LP64__ - buf[-pre + 2] = (len >> 56) & 0x7f; - buf[-pre + 3] = len >> 48; - buf[-pre + 4] = len >> 40; - buf[-pre + 5] = len >> 32; -#else - buf[-pre + 2] = 0; - buf[-pre + 3] = 0; - buf[-pre + 4] = 0; - buf[-pre + 5] = 0; -#endif - buf[-pre + 6] = len >> 24; - buf[-pre + 7] = len >> 16; - buf[-pre + 8] = len >> 8; - buf[-pre + 9] = len; - } - } - break; - } - -do_more_inside_frame: - - /* - * Deal with masking if we are in client -> server direction and - * the protocol demands it - */ - - if (wsi->mode == LWS_CONNMODE_WS_CLIENT) { - - if (!wsi->u.ws.inside_frame) - if (libwebsocket_0405_frame_mask_generate(wsi)) { - lwsl_err("frame mask generation failed\n"); - return -1; - } - - /* - * in v7, just mask the payload - */ - if (dropmask) { /* never set if already inside frame */ - for (n = 4; n < (int)len + 4; n++) - dropmask[n] = dropmask[n] ^ - wsi->u.ws.frame_masking_nonce_04[ - (wsi->u.ws.frame_mask_index++) & 3]; - - /* copy the frame nonce into place */ - memcpy(dropmask, wsi->u.ws.frame_masking_nonce_04, 4); - } - } - -send_raw: - switch (protocol) { - case LWS_WRITE_CLOSE: -/* lwsl_hexdump(&buf[-pre], len + post); */ - case LWS_WRITE_HTTP: - case LWS_WRITE_PONG: - case LWS_WRITE_PING: - return lws_issue_raw(wsi, (unsigned char *)buf - pre, - len + pre + post); - default: - break; - } - - wsi->u.ws.inside_frame = 1; - - /* - * give any active extensions a chance to munge the buffer - * before send. We pass in a pointer to an lws_tokens struct - * prepared with the default buffer and content length that's in - * there. Rather than rewrite the default buffer, extensions - * that expect to grow the buffer can adapt .token to - * point to their own per-connection buffer in the extension - * user allocation. By default with no extensions or no - * extension callback handling, just the normal input buffer is - * used then so it is efficient. - * - * callback returns 1 in case it wants to spill more buffers - * - * This takes care of holding the buffer if send is incomplete, ie, - * if wsi->u.ws.clean_buffer is 0 (meaning an extension meddled with - * the buffer). If wsi->u.ws.clean_buffer is 1, it will instead - * return to the user code how much OF THE USER BUFFER was consumed. - */ - - n = lws_issue_raw_ext_access(wsi, buf - pre, len + pre + post); - if (n <= 0) - return n; - - if (n == len + pre + post) { - /* everything in the buffer was handled (or rebuffered...) */ - wsi->u.ws.inside_frame = 0; - return orig_len; - } - - /* - * it is how many bytes of user buffer got sent... may be < orig_len - * in which case callback when writable has already been arranged - * and user code can call libwebsocket_write() again with the rest - * later. - */ - - return n - (pre + post); -} - -LWS_VISIBLE int libwebsockets_serve_http_file_fragment( - struct libwebsocket_context *context, struct libwebsocket *wsi) -{ - int n; - int m; - - while (!lws_send_pipe_choked(wsi)) { - - if (wsi->truncated_send_len) { - if (lws_issue_raw(wsi, wsi->truncated_send_malloc + - wsi->truncated_send_offset, - wsi->truncated_send_len) < 0) { - lwsl_info("closing from libwebsockets_serve_http_file_fragment\n"); - return -1; - } - continue; - } - - if (wsi->u.http.filepos == wsi->u.http.filelen) - goto all_sent; - - compatible_file_read(n, wsi->u.http.fd, context->service_buffer, - sizeof(context->service_buffer)); - if (n < 0) - return -1; /* caller will close */ - if (n) { - m = libwebsocket_write(wsi, context->service_buffer, n, - LWS_WRITE_HTTP); - if (m < 0) - return -1; - - wsi->u.http.filepos += m; - if (m != n) - /* adjust for what was not sent */ - compatible_file_seek_cur(wsi->u.http.fd, m - n); - } -all_sent: - if (!wsi->truncated_send_len && - wsi->u.http.filepos == wsi->u.http.filelen) { - wsi->state = WSI_STATE_HTTP; - - if (wsi->protocol->callback) - /* ignore callback returned value */ - user_callback_handle_rxflow( - wsi->protocol->callback, context, wsi, - LWS_CALLBACK_HTTP_FILE_COMPLETION, - wsi->user_space, NULL, 0); - return 1; /* >0 indicates completed */ - } - } - - lwsl_info("choked before able to send whole file (post)\n"); - libwebsocket_callback_on_writable(context, wsi); - - return 0; /* indicates further processing must be done */ -} - -LWS_VISIBLE int -lws_ssl_capable_read_no_ssl(struct libwebsocket *wsi, unsigned char *buf, int len) -{ - int n; - - n = recv(wsi->sock, buf, len, 0); - if (n >= 0) - return n; - - lwsl_warn("error on reading from skt\n"); - return LWS_SSL_CAPABLE_ERROR; -} - -LWS_VISIBLE int -lws_ssl_capable_write_no_ssl(struct libwebsocket *wsi, unsigned char *buf, int len) -{ - int n; - - n = send(wsi->sock, buf, len, 0); - if (n >= 0) - return n; - - if (LWS_ERRNO == LWS_EAGAIN || - LWS_ERRNO == LWS_EWOULDBLOCK || - LWS_ERRNO == LWS_EINTR) { - if (LWS_ERRNO == LWS_EWOULDBLOCK) - lws_set_blocking_send(wsi); - - return LWS_SSL_CAPABLE_MORE_SERVICE; - } - lwsl_debug("ERROR writing len %d to skt %d\n", len, n); - return LWS_SSL_CAPABLE_ERROR; -} diff --git a/core/deps/libwebsocket/parsers.c b/core/deps/libwebsocket/parsers.c deleted file mode 100644 index 00f77bb2c..000000000 --- a/core/deps/libwebsocket/parsers.c +++ /dev/null @@ -1,973 +0,0 @@ -/* - * libwebsockets - small server side websockets and web server implementation - * - * Copyright (C) 2010-2013 Andy Green - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation: - * version 2.1 of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301 USA - */ - -#include "private-libwebsockets.h" - -unsigned char lextable[] = { - #include "lextable.h" -}; - -#define FAIL_CHAR 0x08 - -int lextable_decode(int pos, char c) -{ - - c = tolower(c); - - while (1) { - if (lextable[pos] & (1 << 7)) { /* 1-byte, fail on mismatch */ - if ((lextable[pos] & 0x7f) != c) - return -1; - /* fall thru */ - pos++; - if (lextable[pos] == FAIL_CHAR) - return -1; - return pos; - } - /* b7 = 0, end or 3-byte */ - if (lextable[pos] < FAIL_CHAR) /* terminal marker */ - return pos; - - if (lextable[pos] == c) /* goto */ - return pos + (lextable[pos + 1]) + - (lextable[pos + 2] << 8); - /* fall thru goto */ - pos += 3; - /* continue */ - } -} - -int lws_allocate_header_table(struct libwebsocket *wsi) -{ - wsi->u.hdr.ah = malloc(sizeof(*wsi->u.hdr.ah)); - if (wsi->u.hdr.ah == NULL) { - lwsl_err("Out of memory\n"); - return -1; - } - memset(wsi->u.hdr.ah->frag_index, 0, sizeof(wsi->u.hdr.ah->frag_index)); - wsi->u.hdr.ah->next_frag_index = 0; - wsi->u.hdr.ah->pos = 0; - - return 0; -} - -LWS_VISIBLE int lws_hdr_total_length(struct libwebsocket *wsi, enum lws_token_indexes h) -{ - int n; - int len = 0; - - n = wsi->u.hdr.ah->frag_index[h]; - if (!n) - return 0; - do { - len += wsi->u.hdr.ah->frags[n].len; - n = wsi->u.hdr.ah->frags[n].next_frag_index; - } while (n); - - return len; -} - -LWS_VISIBLE int lws_hdr_copy(struct libwebsocket *wsi, char *dest, int len, - enum lws_token_indexes h) -{ - int toklen = lws_hdr_total_length(wsi, h); - int n; - - if (toklen >= len) - return -1; - - n = wsi->u.hdr.ah->frag_index[h]; - if (!n) - return 0; - - do { - strcpy(dest, - &wsi->u.hdr.ah->data[wsi->u.hdr.ah->frags[n].offset]); - dest += wsi->u.hdr.ah->frags[n].len; - n = wsi->u.hdr.ah->frags[n].next_frag_index; - } while (n); - - return toklen; -} - -char *lws_hdr_simple_ptr(struct libwebsocket *wsi, enum lws_token_indexes h) -{ - int n; - - n = wsi->u.hdr.ah->frag_index[h]; - if (!n) - return NULL; - - return &wsi->u.hdr.ah->data[wsi->u.hdr.ah->frags[n].offset]; -} - -int lws_hdr_simple_create(struct libwebsocket *wsi, - enum lws_token_indexes h, const char *s) -{ - wsi->u.hdr.ah->next_frag_index++; - if (wsi->u.hdr.ah->next_frag_index == - sizeof(wsi->u.hdr.ah->frags) / sizeof(wsi->u.hdr.ah->frags[0])) { - lwsl_warn("More hdr frags than we can deal with, dropping\n"); - return -1; - } - - wsi->u.hdr.ah->frag_index[h] = wsi->u.hdr.ah->next_frag_index; - - wsi->u.hdr.ah->frags[wsi->u.hdr.ah->next_frag_index].offset = - wsi->u.hdr.ah->pos; - wsi->u.hdr.ah->frags[wsi->u.hdr.ah->next_frag_index].len = 0; - wsi->u.hdr.ah->frags[wsi->u.hdr.ah->next_frag_index].next_frag_index = - 0; - - do { - if (wsi->u.hdr.ah->pos == sizeof(wsi->u.hdr.ah->data)) { - lwsl_err("Ran out of header data space\n"); - return -1; - } - wsi->u.hdr.ah->data[wsi->u.hdr.ah->pos++] = *s; - if (*s) - wsi->u.hdr.ah->frags[ - wsi->u.hdr.ah->next_frag_index].len++; - } while (*s++); - - return 0; -} - -static char char_to_hex(const char c) -{ - if (c >= '0' && c <= '9') - return c - '0'; - - if (c >= 'a' && c <= 'f') - return c - 'a' + 10; - - if (c >= 'A' && c <= 'F') - return c - 'A' + 10; - - return -1; -} - -static int issue_char(struct libwebsocket *wsi, unsigned char c) -{ - if (wsi->u.hdr.ah->pos == sizeof(wsi->u.hdr.ah->data)) { - lwsl_warn("excessive header content\n"); - return -1; - } - wsi->u.hdr.ah->data[wsi->u.hdr.ah->pos++] = c; - if (c) - wsi->u.hdr.ah->frags[wsi->u.hdr.ah->next_frag_index].len++; - - return 0; -} - -int libwebsocket_parse(struct libwebsocket *wsi, unsigned char c) -{ - int n; - - switch (wsi->u.hdr.parser_state) { - case WSI_TOKEN_GET_URI: - case WSI_TOKEN_POST_URI: - case WSI_TOKEN_HOST: - case WSI_TOKEN_CONNECTION: - case WSI_TOKEN_KEY1: - case WSI_TOKEN_KEY2: - case WSI_TOKEN_PROTOCOL: - case WSI_TOKEN_UPGRADE: - case WSI_TOKEN_ORIGIN: - case WSI_TOKEN_SWORIGIN: - case WSI_TOKEN_DRAFT: - case WSI_TOKEN_CHALLENGE: - case WSI_TOKEN_KEY: - case WSI_TOKEN_VERSION: - case WSI_TOKEN_ACCEPT: - case WSI_TOKEN_NONCE: - case WSI_TOKEN_EXTENSIONS: - case WSI_TOKEN_HTTP: - case WSI_TOKEN_HTTP_ACCEPT: - case WSI_TOKEN_HTTP_IF_MODIFIED_SINCE: - case WSI_TOKEN_HTTP_ACCEPT_ENCODING: - case WSI_TOKEN_HTTP_ACCEPT_LANGUAGE: - case WSI_TOKEN_HTTP_PRAGMA: - case WSI_TOKEN_HTTP_CACHE_CONTROL: - case WSI_TOKEN_HTTP_AUTHORIZATION: - case WSI_TOKEN_HTTP_COOKIE: - case WSI_TOKEN_HTTP_CONTENT_LENGTH: - case WSI_TOKEN_HTTP_CONTENT_TYPE: - case WSI_TOKEN_HTTP_DATE: - case WSI_TOKEN_HTTP_RANGE: - case WSI_TOKEN_HTTP_REFERER: - - - lwsl_parser("WSI_TOK_(%d) '%c'\n", wsi->u.hdr.parser_state, c); - - /* collect into malloc'd buffers */ - /* optional initial space swallow */ - if (!wsi->u.hdr.ah->frags[wsi->u.hdr.ah->frag_index[ - wsi->u.hdr.parser_state]].len && c == ' ') - break; - - if ((wsi->u.hdr.parser_state != WSI_TOKEN_GET_URI) && (wsi->u.hdr.parser_state != WSI_TOKEN_POST_URI)) - goto check_eol; - - /* special URI processing... end at space */ - - if (c == ' ') { - /* enforce starting with / */ - if (!wsi->u.hdr.ah->frags[wsi->u.hdr.ah->next_frag_index].len) - if (issue_char(wsi, '/') < 0) - return -1; - c = '\0'; - wsi->u.hdr.parser_state = WSI_TOKEN_SKIPPING; - goto spill; - } - - /* special URI processing... convert %xx */ - - switch (wsi->u.hdr.ues) { - case URIES_IDLE: - if (c == '%') { - wsi->u.hdr.ues = URIES_SEEN_PERCENT; - goto swallow; - } - break; - case URIES_SEEN_PERCENT: - if (char_to_hex(c) < 0) { - /* regurgitate */ - if (issue_char(wsi, '%') < 0) - return -1; - wsi->u.hdr.ues = URIES_IDLE; - /* continue on to assess c */ - break; - } - wsi->u.hdr.esc_stash = c; - wsi->u.hdr.ues = URIES_SEEN_PERCENT_H1; - goto swallow; - - case URIES_SEEN_PERCENT_H1: - if (char_to_hex(c) < 0) { - /* regurgitate */ - issue_char(wsi, '%'); - wsi->u.hdr.ues = URIES_IDLE; - /* regurgitate + assess */ - if (libwebsocket_parse(wsi, wsi->u.hdr.esc_stash) < 0) - return -1; - /* continue on to assess c */ - break; - } - c = (char_to_hex(wsi->u.hdr.esc_stash) << 4) | - char_to_hex(c); - wsi->u.hdr.ues = URIES_IDLE; - break; - } - - /* - * special URI processing... - * convert /.. or /... or /../ etc to / - * convert /./ to / - * convert // or /// etc to / - * leave /.dir or whatever alone - */ - - switch (wsi->u.hdr.ups) { - case URIPS_IDLE: - /* issue the first / always */ - if (c == '/') - wsi->u.hdr.ups = URIPS_SEEN_SLASH; - break; - case URIPS_SEEN_SLASH: - /* swallow subsequent slashes */ - if (c == '/') - goto swallow; - /* track and swallow the first . after / */ - if (c == '.') { - wsi->u.hdr.ups = URIPS_SEEN_SLASH_DOT; - goto swallow; - } else - wsi->u.hdr.ups = URIPS_IDLE; - break; - case URIPS_SEEN_SLASH_DOT: - /* swallow second . */ - if (c == '.') { - /* - * back up one dir level if possible - * safe against header fragmentation because - * the method URI can only be in 1 fragment - */ - if (wsi->u.hdr.ah->frags[wsi->u.hdr.ah->next_frag_index].len > 2) { - wsi->u.hdr.ah->pos--; - wsi->u.hdr.ah->frags[wsi->u.hdr.ah->next_frag_index].len--; - do { - wsi->u.hdr.ah->pos--; - wsi->u.hdr.ah->frags[wsi->u.hdr.ah->next_frag_index].len--; - } while (wsi->u.hdr.ah->frags[wsi->u.hdr.ah->next_frag_index].len > 1 && - wsi->u.hdr.ah->data[wsi->u.hdr.ah->pos] != '/'); - } - wsi->u.hdr.ups = URIPS_SEEN_SLASH_DOT_DOT; - goto swallow; - } - /* change /./ to / */ - if (c == '/') { - wsi->u.hdr.ups = URIPS_SEEN_SLASH; - goto swallow; - } - /* it was like /.dir ... regurgitate the . */ - wsi->u.hdr.ups = URIPS_IDLE; - issue_char(wsi, '.'); - break; - - case URIPS_SEEN_SLASH_DOT_DOT: - /* swallow prior .. chars and any subsequent . */ - if (c == '.') - goto swallow; - /* last issued was /, so another / == // */ - if (c == '/') - goto swallow; - else /* last we issued was / so SEEN_SLASH */ - wsi->u.hdr.ups = URIPS_SEEN_SLASH; - break; - case URIPS_ARGUMENTS: - /* leave them alone */ - break; - } - -check_eol: - - /* bail at EOL */ - if (wsi->u.hdr.parser_state != WSI_TOKEN_CHALLENGE && - c == '\x0d') { - c = '\0'; - wsi->u.hdr.parser_state = WSI_TOKEN_SKIPPING_SAW_CR; - lwsl_parser("*\n"); - } - - if (c == '?') { /* start of URI arguments */ - /* seal off uri header */ - wsi->u.hdr.ah->data[wsi->u.hdr.ah->pos++] = '\0'; - - /* move to using WSI_TOKEN_HTTP_URI_ARGS */ - wsi->u.hdr.ah->next_frag_index++; - wsi->u.hdr.ah->frags[ - wsi->u.hdr.ah->next_frag_index].offset = - wsi->u.hdr.ah->pos; - wsi->u.hdr.ah->frags[ - wsi->u.hdr.ah->next_frag_index].len = 0; - wsi->u.hdr.ah->frags[ - wsi->u.hdr.ah->next_frag_index].next_frag_index = 0; - - wsi->u.hdr.ah->frag_index[WSI_TOKEN_HTTP_URI_ARGS] = - wsi->u.hdr.ah->next_frag_index; - - /* defeat normal uri path processing */ - wsi->u.hdr.ups = URIPS_ARGUMENTS; - goto swallow; - } - -spill: - if (issue_char(wsi, c) < 0) - return -1; -swallow: - /* per-protocol end of headers management */ - - if (wsi->u.hdr.parser_state == WSI_TOKEN_CHALLENGE) - goto set_parsing_complete; - break; - - /* collecting and checking a name part */ - case WSI_TOKEN_NAME_PART: - lwsl_parser("WSI_TOKEN_NAME_PART '%c'\n", c); - - wsi->u.hdr.lextable_pos = - lextable_decode(wsi->u.hdr.lextable_pos, c); - - if (wsi->u.hdr.lextable_pos < 0) { - /* this is not a header we know about */ - if (wsi->u.hdr.ah->frag_index[WSI_TOKEN_GET_URI] || wsi->u.hdr.ah->frag_index[WSI_TOKEN_POST_URI] || - wsi->u.hdr.ah->frag_index[WSI_TOKEN_HTTP]) { - /* - * altready had the method, no idea what - * this crap is, ignore - */ - wsi->u.hdr.parser_state = WSI_TOKEN_SKIPPING; - break; - } - /* - * hm it's an unknown http method in fact, - * treat as dangerous - */ - - lwsl_info("Unknown method - dropping\n"); - return -1; - } - if (lextable[wsi->u.hdr.lextable_pos] < FAIL_CHAR) { - - /* terminal state */ - - n = (lextable[wsi->u.hdr.lextable_pos] << 8) | lextable[wsi->u.hdr.lextable_pos + 1]; - - lwsl_parser("known hdr %d\n", n); - - if (n == WSI_TOKEN_GET_URI && - wsi->u.hdr.ah->frag_index[WSI_TOKEN_GET_URI]) { - lwsl_warn("Duplicated GET\n"); - return -1; - } else if (n == WSI_TOKEN_POST_URI && - wsi->u.hdr.ah->frag_index[WSI_TOKEN_POST_URI]) { - lwsl_warn("Duplicated POST\n"); - return -1; - } - - /* - * WSORIGIN is protocol equiv to ORIGIN, - * JWebSocket likes to send it, map to ORIGIN - */ - if (n == WSI_TOKEN_SWORIGIN) - n = WSI_TOKEN_ORIGIN; - - wsi->u.hdr.parser_state = (enum lws_token_indexes) - (WSI_TOKEN_GET_URI + n); - if (wsi->u.hdr.parser_state == WSI_TOKEN_CHALLENGE) - goto set_parsing_complete; - - goto start_fragment; - } - break; - -start_fragment: - wsi->u.hdr.ah->next_frag_index++; - if (wsi->u.hdr.ah->next_frag_index == - sizeof(wsi->u.hdr.ah->frags) / - sizeof(wsi->u.hdr.ah->frags[0])) { - lwsl_warn("More hdr frags than we can deal with\n"); - return -1; - } - - wsi->u.hdr.ah->frags[wsi->u.hdr.ah->next_frag_index].offset = - wsi->u.hdr.ah->pos; - wsi->u.hdr.ah->frags[wsi->u.hdr.ah->next_frag_index].len = 0; - wsi->u.hdr.ah->frags[ - wsi->u.hdr.ah->next_frag_index].next_frag_index = 0; - - n = wsi->u.hdr.ah->frag_index[wsi->u.hdr.parser_state]; - if (!n) { /* first fragment */ - wsi->u.hdr.ah->frag_index[wsi->u.hdr.parser_state] = - wsi->u.hdr.ah->next_frag_index; - break; - } - /* continuation */ - while (wsi->u.hdr.ah->frags[n].next_frag_index) - n = wsi->u.hdr.ah->frags[n].next_frag_index; - wsi->u.hdr.ah->frags[n].next_frag_index = - wsi->u.hdr.ah->next_frag_index; - - if (wsi->u.hdr.ah->pos == sizeof(wsi->u.hdr.ah->data)) { - lwsl_warn("excessive header content\n"); - return -1; - } - - wsi->u.hdr.ah->data[wsi->u.hdr.ah->pos++] = ' '; - wsi->u.hdr.ah->frags[wsi->u.hdr.ah->next_frag_index].len++; - break; - - /* skipping arg part of a name we didn't recognize */ - case WSI_TOKEN_SKIPPING: - lwsl_parser("WSI_TOKEN_SKIPPING '%c'\n", c); - - if (c == '\x0d') - wsi->u.hdr.parser_state = WSI_TOKEN_SKIPPING_SAW_CR; - break; - - case WSI_TOKEN_SKIPPING_SAW_CR: - lwsl_parser("WSI_TOKEN_SKIPPING_SAW_CR '%c'\n", c); - if (c == '\x0a') { - wsi->u.hdr.parser_state = WSI_TOKEN_NAME_PART; - wsi->u.hdr.lextable_pos = 0; - } else - wsi->u.hdr.parser_state = WSI_TOKEN_SKIPPING; - break; - /* we're done, ignore anything else */ - - case WSI_PARSING_COMPLETE: - lwsl_parser("WSI_PARSING_COMPLETE '%c'\n", c); - break; - - default: /* keep gcc happy */ - break; - } - - return 0; - -set_parsing_complete: - - if (lws_hdr_total_length(wsi, WSI_TOKEN_UPGRADE)) { - if (lws_hdr_total_length(wsi, WSI_TOKEN_VERSION)) - wsi->ietf_spec_revision = - atoi(lws_hdr_simple_ptr(wsi, WSI_TOKEN_VERSION)); - - lwsl_parser("v%02d hdrs completed\n", wsi->ietf_spec_revision); - } - wsi->u.hdr.parser_state = WSI_PARSING_COMPLETE; - wsi->hdr_parsing_completed = 1; - - return 0; -} - - -/** - * lws_frame_is_binary: true if the current frame was sent in binary mode - * - * @wsi: the connection we are inquiring about - * - * This is intended to be called from the LWS_CALLBACK_RECEIVE callback if - * it's interested to see if the frame it's dealing with was sent in binary - * mode. - */ - -LWS_VISIBLE int lws_frame_is_binary(struct libwebsocket *wsi) -{ - return wsi->u.ws.frame_is_binary; -} - -int -libwebsocket_rx_sm(struct libwebsocket *wsi, unsigned char c) -{ - int n; - struct lws_tokens eff_buf; - int ret = 0; - - switch (wsi->lws_rx_parse_state) { - case LWS_RXPS_NEW: - - switch (wsi->ietf_spec_revision) { - case 13: - /* - * no prepended frame key any more - */ - wsi->u.ws.all_zero_nonce = 1; - goto handle_first; - - default: - lwsl_warn("lws_rx_sm: unknown spec version %d\n", - wsi->ietf_spec_revision); - break; - } - break; - case LWS_RXPS_04_MASK_NONCE_1: - wsi->u.ws.frame_masking_nonce_04[1] = c; - if (c) - wsi->u.ws.all_zero_nonce = 0; - wsi->lws_rx_parse_state = LWS_RXPS_04_MASK_NONCE_2; - break; - case LWS_RXPS_04_MASK_NONCE_2: - wsi->u.ws.frame_masking_nonce_04[2] = c; - if (c) - wsi->u.ws.all_zero_nonce = 0; - wsi->lws_rx_parse_state = LWS_RXPS_04_MASK_NONCE_3; - break; - case LWS_RXPS_04_MASK_NONCE_3: - wsi->u.ws.frame_masking_nonce_04[3] = c; - if (c) - wsi->u.ws.all_zero_nonce = 0; - - /* - * start from the zero'th byte in the XOR key buffer since - * this is the start of a frame with a new key - */ - - wsi->u.ws.frame_mask_index = 0; - - wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_1; - break; - - /* - * 04 logical framing from the spec (all this is masked when incoming - * and has to be unmasked) - * - * We ignore the possibility of extension data because we don't - * negotiate any extensions at the moment. - * - * 0 1 2 3 - * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - * +-+-+-+-+-------+-+-------------+-------------------------------+ - * |F|R|R|R| opcode|R| Payload len | Extended payload length | - * |I|S|S|S| (4) |S| (7) | (16/63) | - * |N|V|V|V| |V| | (if payload len==126/127) | - * | |1|2|3| |4| | | - * +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - + - * | Extended payload length continued, if payload len == 127 | - * + - - - - - - - - - - - - - - - +-------------------------------+ - * | | Extension data | - * +-------------------------------+ - - - - - - - - - - - - - - - + - * : : - * +---------------------------------------------------------------+ - * : Application data : - * +---------------------------------------------------------------+ - * - * We pass payload through to userland as soon as we get it, ignoring - * FIN. It's up to userland to buffer it up if it wants to see a - * whole unfragmented block of the original size (which may be up to - * 2^63 long!) - */ - - case LWS_RXPS_04_FRAME_HDR_1: -handle_first: - - wsi->u.ws.opcode = c & 0xf; - wsi->u.ws.rsv = c & 0x70; - wsi->u.ws.final = !!((c >> 7) & 1); - - switch (wsi->u.ws.opcode) { - case LWS_WS_OPCODE_07__TEXT_FRAME: - case LWS_WS_OPCODE_07__BINARY_FRAME: - wsi->u.ws.frame_is_binary = - wsi->u.ws.opcode == LWS_WS_OPCODE_07__BINARY_FRAME; - break; - } - wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN; - break; - - case LWS_RXPS_04_FRAME_HDR_LEN: - - wsi->u.ws.this_frame_masked = !!(c & 0x80); - - switch (c & 0x7f) { - case 126: - /* control frames are not allowed to have big lengths */ - if (wsi->u.ws.opcode & 8) - goto illegal_ctl_length; - - wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN16_2; - break; - case 127: - /* control frames are not allowed to have big lengths */ - if (wsi->u.ws.opcode & 8) - goto illegal_ctl_length; - - wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN64_8; - break; - default: - wsi->u.ws.rx_packet_length = c & 0x7f; - if (wsi->u.ws.this_frame_masked) - wsi->lws_rx_parse_state = - LWS_RXPS_07_COLLECT_FRAME_KEY_1; - else - if (wsi->u.ws.rx_packet_length) - wsi->lws_rx_parse_state = - LWS_RXPS_PAYLOAD_UNTIL_LENGTH_EXHAUSTED; - else { - wsi->lws_rx_parse_state = LWS_RXPS_NEW; - goto spill; - } - break; - } - break; - - case LWS_RXPS_04_FRAME_HDR_LEN16_2: - wsi->u.ws.rx_packet_length = c << 8; - wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN16_1; - break; - - case LWS_RXPS_04_FRAME_HDR_LEN16_1: - wsi->u.ws.rx_packet_length |= c; - if (wsi->u.ws.this_frame_masked) - wsi->lws_rx_parse_state = - LWS_RXPS_07_COLLECT_FRAME_KEY_1; - else - wsi->lws_rx_parse_state = - LWS_RXPS_PAYLOAD_UNTIL_LENGTH_EXHAUSTED; - break; - - case LWS_RXPS_04_FRAME_HDR_LEN64_8: - if (c & 0x80) { - lwsl_warn("b63 of length must be zero\n"); - /* kill the connection */ - return -1; - } -#if defined __LP64__ - wsi->u.ws.rx_packet_length = ((size_t)c) << 56; -#else - wsi->u.ws.rx_packet_length = 0; -#endif - wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN64_7; - break; - - case LWS_RXPS_04_FRAME_HDR_LEN64_7: -#if defined __LP64__ - wsi->u.ws.rx_packet_length |= ((size_t)c) << 48; -#endif - wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN64_6; - break; - - case LWS_RXPS_04_FRAME_HDR_LEN64_6: -#if defined __LP64__ - wsi->u.ws.rx_packet_length |= ((size_t)c) << 40; -#endif - wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN64_5; - break; - - case LWS_RXPS_04_FRAME_HDR_LEN64_5: -#if defined __LP64__ - wsi->u.ws.rx_packet_length |= ((size_t)c) << 32; -#endif - wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN64_4; - break; - - case LWS_RXPS_04_FRAME_HDR_LEN64_4: - wsi->u.ws.rx_packet_length |= ((size_t)c) << 24; - wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN64_3; - break; - - case LWS_RXPS_04_FRAME_HDR_LEN64_3: - wsi->u.ws.rx_packet_length |= ((size_t)c) << 16; - wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN64_2; - break; - - case LWS_RXPS_04_FRAME_HDR_LEN64_2: - wsi->u.ws.rx_packet_length |= ((size_t)c) << 8; - wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN64_1; - break; - - case LWS_RXPS_04_FRAME_HDR_LEN64_1: - wsi->u.ws.rx_packet_length |= ((size_t)c); - if (wsi->u.ws.this_frame_masked) - wsi->lws_rx_parse_state = - LWS_RXPS_07_COLLECT_FRAME_KEY_1; - else - wsi->lws_rx_parse_state = - LWS_RXPS_PAYLOAD_UNTIL_LENGTH_EXHAUSTED; - break; - - case LWS_RXPS_07_COLLECT_FRAME_KEY_1: - wsi->u.ws.frame_masking_nonce_04[0] = c; - if (c) - wsi->u.ws.all_zero_nonce = 0; - wsi->lws_rx_parse_state = LWS_RXPS_07_COLLECT_FRAME_KEY_2; - break; - - case LWS_RXPS_07_COLLECT_FRAME_KEY_2: - wsi->u.ws.frame_masking_nonce_04[1] = c; - if (c) - wsi->u.ws.all_zero_nonce = 0; - wsi->lws_rx_parse_state = LWS_RXPS_07_COLLECT_FRAME_KEY_3; - break; - - case LWS_RXPS_07_COLLECT_FRAME_KEY_3: - wsi->u.ws.frame_masking_nonce_04[2] = c; - if (c) - wsi->u.ws.all_zero_nonce = 0; - wsi->lws_rx_parse_state = LWS_RXPS_07_COLLECT_FRAME_KEY_4; - break; - - case LWS_RXPS_07_COLLECT_FRAME_KEY_4: - wsi->u.ws.frame_masking_nonce_04[3] = c; - if (c) - wsi->u.ws.all_zero_nonce = 0; - wsi->lws_rx_parse_state = - LWS_RXPS_PAYLOAD_UNTIL_LENGTH_EXHAUSTED; - wsi->u.ws.frame_mask_index = 0; - if (wsi->u.ws.rx_packet_length == 0) { - wsi->lws_rx_parse_state = LWS_RXPS_NEW; - goto spill; - } - break; - - - case LWS_RXPS_PAYLOAD_UNTIL_LENGTH_EXHAUSTED: - - if (!wsi->u.ws.rx_user_buffer) - lwsl_err("NULL user buffer...\n"); - - if (wsi->u.ws.all_zero_nonce) - wsi->u.ws.rx_user_buffer[LWS_SEND_BUFFER_PRE_PADDING + - (wsi->u.ws.rx_user_buffer_head++)] = c; - else - wsi->u.ws.rx_user_buffer[LWS_SEND_BUFFER_PRE_PADDING + - (wsi->u.ws.rx_user_buffer_head++)] = - c ^ wsi->u.ws.frame_masking_nonce_04[ - (wsi->u.ws.frame_mask_index++) & 3]; - - if (--wsi->u.ws.rx_packet_length == 0) { - /* spill because we have the whole frame */ - wsi->lws_rx_parse_state = LWS_RXPS_NEW; - goto spill; - } - - /* - * if there's no protocol max frame size given, we are - * supposed to default to LWS_MAX_SOCKET_IO_BUF - */ - - if (!wsi->protocol->rx_buffer_size && - wsi->u.ws.rx_user_buffer_head != - LWS_MAX_SOCKET_IO_BUF) - break; - else - if (wsi->protocol->rx_buffer_size && - wsi->u.ws.rx_user_buffer_head != - wsi->protocol->rx_buffer_size) - break; - - /* spill because we filled our rx buffer */ -spill: - /* - * is this frame a control packet we should take care of at this - * layer? If so service it and hide it from the user callback - */ - - lwsl_parser("spill on %s\n", wsi->protocol->name); - - switch (wsi->u.ws.opcode) { - case LWS_WS_OPCODE_07__CLOSE: - /* is this an acknowledgement of our close? */ - if (wsi->state == WSI_STATE_AWAITING_CLOSE_ACK) { - /* - * fine he has told us he is closing too, let's - * finish our close - */ - lwsl_parser("seen client close ack\n"); - return -1; - } - lwsl_parser("server sees client close packet\n"); - /* parrot the close packet payload back */ - n = libwebsocket_write(wsi, (unsigned char *) - &wsi->u.ws.rx_user_buffer[ - LWS_SEND_BUFFER_PRE_PADDING], - wsi->u.ws.rx_user_buffer_head, - LWS_WRITE_CLOSE); - if (n < 0) - lwsl_info("write of close ack failed %d\n", n); - wsi->state = WSI_STATE_RETURNED_CLOSE_ALREADY; - /* close the connection */ - return -1; - - case LWS_WS_OPCODE_07__PING: - lwsl_info("received %d byte ping, sending pong\n", - wsi->u.ws.rx_user_buffer_head); - lwsl_hexdump(&wsi->u.ws.rx_user_buffer[ - LWS_SEND_BUFFER_PRE_PADDING], - wsi->u.ws.rx_user_buffer_head); - /* parrot the ping packet payload back as a pong */ - n = libwebsocket_write(wsi, (unsigned char *) - &wsi->u.ws.rx_user_buffer[LWS_SEND_BUFFER_PRE_PADDING], - wsi->u.ws.rx_user_buffer_head, LWS_WRITE_PONG); - if (n < 0) - return -1; - /* ... then just drop it */ - wsi->u.ws.rx_user_buffer_head = 0; - return 0; - - case LWS_WS_OPCODE_07__PONG: - /* ... then just drop it */ - wsi->u.ws.rx_user_buffer_head = 0; - return 0; - - case LWS_WS_OPCODE_07__TEXT_FRAME: - case LWS_WS_OPCODE_07__BINARY_FRAME: - case LWS_WS_OPCODE_07__CONTINUATION: - break; - - default: - lwsl_parser("passing opc %x up to exts\n", - wsi->u.ws.opcode); - /* - * It's something special we can't understand here. - * Pass the payload up to the extension's parsing - * state machine. - */ - - eff_buf.token = &wsi->u.ws.rx_user_buffer[ - LWS_SEND_BUFFER_PRE_PADDING]; - eff_buf.token_len = wsi->u.ws.rx_user_buffer_head; - - if (lws_ext_callback_for_each_active(wsi, - LWS_EXT_CALLBACK_EXTENDED_PAYLOAD_RX, - &eff_buf, 0) <= 0) /* not handle or fail */ - lwsl_ext("ext opc opcode 0x%x unknown\n", - wsi->u.ws.opcode); - - wsi->u.ws.rx_user_buffer_head = 0; - return 0; - } - - /* - * No it's real payload, pass it up to the user callback. - * It's nicely buffered with the pre-padding taken care of - * so it can be sent straight out again using libwebsocket_write - */ - - eff_buf.token = &wsi->u.ws.rx_user_buffer[ - LWS_SEND_BUFFER_PRE_PADDING]; - eff_buf.token_len = wsi->u.ws.rx_user_buffer_head; - - if (lws_ext_callback_for_each_active(wsi, - LWS_EXT_CALLBACK_PAYLOAD_RX, &eff_buf, 0) < 0) - return -1; - - if (eff_buf.token_len > 0) { - eff_buf.token[eff_buf.token_len] = '\0'; - - if (wsi->protocol->callback) - ret = user_callback_handle_rxflow( - wsi->protocol->callback, - wsi->protocol->owning_server, - wsi, LWS_CALLBACK_RECEIVE, - wsi->user_space, - eff_buf.token, - eff_buf.token_len); - else - lwsl_err("No callback on payload spill!\n"); - } - - wsi->u.ws.rx_user_buffer_head = 0; - break; - } - - return ret; - -illegal_ctl_length: - - lwsl_warn("Control frame with xtended length is illegal\n"); - /* kill the connection */ - return -1; -} - - -/** - * libwebsockets_remaining_packet_payload() - Bytes to come before "overall" - * rx packet is complete - * @wsi: Websocket instance (available from user callback) - * - * This function is intended to be called from the callback if the - * user code is interested in "complete packets" from the client. - * libwebsockets just passes through payload as it comes and issues a buffer - * additionally when it hits a built-in limit. The LWS_CALLBACK_RECEIVE - * callback handler can use this API to find out if the buffer it has just - * been given is the last piece of a "complete packet" from the client -- - * when that is the case libwebsockets_remaining_packet_payload() will return - * 0. - * - * Many protocols won't care becuse their packets are always small. - */ - -LWS_VISIBLE size_t -libwebsockets_remaining_packet_payload(struct libwebsocket *wsi) -{ - return wsi->u.ws.rx_packet_length; -} diff --git a/core/deps/libwebsocket/pollfd.c b/core/deps/libwebsocket/pollfd.c deleted file mode 100644 index 3995a378a..000000000 --- a/core/deps/libwebsocket/pollfd.c +++ /dev/null @@ -1,239 +0,0 @@ -/* - * libwebsockets - small server side websockets and web server implementation - * - * Copyright (C) 2010-2014 Andy Green - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation: - * version 2.1 of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301 USA - */ - -#include "private-libwebsockets.h" - -int -insert_wsi_socket_into_fds(struct libwebsocket_context *context, - struct libwebsocket *wsi) -{ - struct libwebsocket_pollargs pa = { wsi->sock, LWS_POLLIN, 0 }; - - if (context->fds_count >= context->max_fds) { - lwsl_err("Too many fds (%d)\n", context->max_fds); - return 1; - } - - if (wsi->sock >= context->max_fds) { - lwsl_err("Socket fd %d is too high (%d)\n", - wsi->sock, context->max_fds); - return 1; - } - - assert(wsi); - assert(wsi->sock >= 0); - - lwsl_info("insert_wsi_socket_into_fds: wsi=%p, sock=%d, fds pos=%d\n", - wsi, wsi->sock, context->fds_count); - - context->protocols[0].callback(context, wsi, - LWS_CALLBACK_LOCK_POLL, - wsi->user_space, (void *) &pa, 0); - - context->lws_lookup[wsi->sock] = wsi; - wsi->position_in_fds_table = context->fds_count; - context->fds[context->fds_count].fd = wsi->sock; - context->fds[context->fds_count].events = LWS_POLLIN; - - lws_plat_insert_socket_into_fds(context, wsi); - - /* external POLL support via protocol 0 */ - context->protocols[0].callback(context, wsi, - LWS_CALLBACK_ADD_POLL_FD, - wsi->user_space, (void *) &pa, 0); - - context->protocols[0].callback(context, wsi, - LWS_CALLBACK_UNLOCK_POLL, - wsi->user_space, (void *)&pa, 0); - - return 0; -} - -int -remove_wsi_socket_from_fds(struct libwebsocket_context *context, - struct libwebsocket *wsi) -{ - int m; - struct libwebsocket_pollargs pa = { wsi->sock, 0, 0 }; - - lws_libev_io(context, wsi, LWS_EV_STOP | LWS_EV_READ | LWS_EV_WRITE); - - if (!--context->fds_count) { - context->protocols[0].callback(context, wsi, - LWS_CALLBACK_LOCK_POLL, - wsi->user_space, (void *) &pa, 0); - goto do_ext; - } - - if (wsi->sock > context->max_fds) { - lwsl_err("Socket fd %d too high (%d)\n", - wsi->sock, context->max_fds); - return 1; - } - - lwsl_info("%s: wsi=%p, sock=%d, fds pos=%d\n", __func__, - wsi, wsi->sock, wsi->position_in_fds_table); - - context->protocols[0].callback(context, wsi, - LWS_CALLBACK_LOCK_POLL, - wsi->user_space, (void *)&pa, 0); - - m = wsi->position_in_fds_table; /* replace the contents for this */ - - /* have the last guy take up the vacant slot */ - context->fds[m] = context->fds[context->fds_count]; - - lws_plat_delete_socket_from_fds(context, wsi, m); - - /* - * end guy's fds_lookup entry remains unchanged - * (still same fd pointing to same wsi) - */ - /* end guy's "position in fds table" changed */ - context->lws_lookup[context->fds[context->fds_count].fd]-> - position_in_fds_table = m; - /* deletion guy's lws_lookup entry needs nuking */ - context->lws_lookup[wsi->sock] = NULL; - /* removed wsi has no position any more */ - wsi->position_in_fds_table = -1; - -do_ext: - /* remove also from external POLL support via protocol 0 */ - if (wsi->sock) { - context->protocols[0].callback(context, wsi, - LWS_CALLBACK_DEL_POLL_FD, wsi->user_space, - (void *) &pa, 0); - } - context->protocols[0].callback(context, wsi, - LWS_CALLBACK_UNLOCK_POLL, - wsi->user_space, (void *) &pa, 0); - return 0; -} - -int -lws_change_pollfd(struct libwebsocket *wsi, int _and, int _or) -{ - struct libwebsocket_context *context = wsi->protocol->owning_server; - int tid; - int sampled_tid; - struct libwebsocket_pollfd *pfd; - struct libwebsocket_pollargs pa; - - pfd = &context->fds[wsi->position_in_fds_table]; - pa.fd = wsi->sock; - - context->protocols[0].callback(context, wsi, - LWS_CALLBACK_LOCK_POLL, wsi->user_space, (void *) &pa, 0); - - pa.prev_events = pfd->events; - pa.events = pfd->events = (pfd->events & ~_and) | _or; - - context->protocols[0].callback(context, wsi, - LWS_CALLBACK_CHANGE_MODE_POLL_FD, - wsi->user_space, (void *) &pa, 0); - - /* - * if we changed something in this pollfd... - * ... and we're running in a different thread context - * than the service thread... - * ... and the service thread is waiting ... - * then cancel it to force a restart with our changed events - */ - if (pa.prev_events != pa.events) { - - if (lws_plat_change_pollfd(context, wsi, pfd)) { - lwsl_info("%s failed\n", __func__); - return 1; - } - - sampled_tid = context->service_tid; - if (sampled_tid) { - tid = context->protocols[0].callback(context, NULL, - LWS_CALLBACK_GET_THREAD_ID, NULL, NULL, 0); - if (tid != sampled_tid) - libwebsocket_cancel_service(context); - } - } - - context->protocols[0].callback(context, wsi, - LWS_CALLBACK_UNLOCK_POLL, wsi->user_space, (void *) &pa, 0); - - return 0; -} - - -/** - * libwebsocket_callback_on_writable() - Request a callback when this socket - * becomes able to be written to without - * blocking - * - * @context: libwebsockets context - * @wsi: Websocket connection instance to get callback for - */ - -LWS_VISIBLE int -libwebsocket_callback_on_writable(struct libwebsocket_context *context, - struct libwebsocket *wsi) -{ - if (lws_ext_callback_for_each_active(wsi, - LWS_EXT_CALLBACK_REQUEST_ON_WRITEABLE, NULL, 0)) - return 1; - - if (wsi->position_in_fds_table < 0) { - lwsl_err("%s: failed to find socket %d\n", __func__, wsi->sock); - return -1; - } - - if (lws_change_pollfd(wsi, 0, LWS_POLLOUT)) - return -1; - - lws_libev_io(context, wsi, LWS_EV_START | LWS_EV_WRITE); - - return 1; -} - -/** - * libwebsocket_callback_on_writable_all_protocol() - Request a callback for - * all connections using the given protocol when it - * becomes possible to write to each socket without - * blocking in turn. - * - * @protocol: Protocol whose connections will get callbacks - */ - -LWS_VISIBLE int -libwebsocket_callback_on_writable_all_protocol( - const struct libwebsocket_protocols *protocol) -{ - struct libwebsocket_context *context = protocol->owning_server; - int n; - struct libwebsocket *wsi; - - for (n = 0; n < context->fds_count; n++) { - wsi = context->lws_lookup[context->fds[n].fd]; - if (!wsi) - continue; - if (wsi->protocol == protocol) - libwebsocket_callback_on_writable(context, wsi); - } - - return 0; -} diff --git a/core/deps/libwebsocket/private-libwebsockets.h b/core/deps/libwebsocket/private-libwebsockets.h deleted file mode 100644 index 3069f997d..000000000 --- a/core/deps/libwebsocket/private-libwebsockets.h +++ /dev/null @@ -1,916 +0,0 @@ -/* - * libwebsockets - small server side websockets and web server implementation - * - * Copyright (C) 2010 - 2013 Andy Green - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation: - * version 2.1 of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301 USA - */ -#pragma once -#include "build.h" - -/* The Libwebsocket version */ -#define LWS_LIBRARY_VERSION "1.3" - -/* The current git commit hash that we're building from */ -#define LWS_BUILD_HASH "c11b847" - - -/* System introspection configs */ -#ifdef CMAKE_BUILD -#include "lws_config.h" -#else -#if HOST_OS == OS_WINDOWS -#define inline __inline -#else /* not WIN32 */ -#include "config.h" - -#endif /* not WIN32 */ -#endif /* not CMAKE */ - -#ifdef HAVE_SYS_TYPES_H -#include -#endif - -#include -#include -#include -#include -#include -#include -#include - -#ifdef HAVE_SYS_STAT_H -#include -#endif - -#if defined(WIN32) || defined(_WIN32) -#define LWS_NO_DAEMONIZE -#define LWS_ERRNO WSAGetLastError() -#define LWS_EAGAIN WSAEWOULDBLOCK -#define LWS_EALREADY WSAEALREADY -#define LWS_EINPROGRESS WSAEINPROGRESS -#define LWS_EINTR WSAEINTR -#define LWS_EISCONN WSAEISCONN -#define LWS_EWOULDBLOCK WSAEWOULDBLOCK -#define LWS_POLLHUP (FD_CLOSE) -#define LWS_POLLIN (FD_READ | FD_ACCEPT) -#define LWS_POLLOUT (FD_WRITE) -#define MSG_NOSIGNAL 0 -#define SHUT_RDWR SD_BOTH -#define SOL_TCP IPPROTO_TCP - -#define compatible_close(fd) closesocket(fd) -#define compatible_file_close(fd) CloseHandle(fd) -#define compatible_file_seek_cur(fd, offset) SetFilePointer(fd, offset, NULL, FILE_CURRENT) -#define compatible_file_read(amount, fd, buf, len) {\ - DWORD _amount; \ - if (!ReadFile(fd, buf, len, &_amount, NULL)) \ - amount = -1; \ - else \ - amount = _amount; \ - } -#define lws_set_blocking_send(wsi) wsi->sock_send_blocking = TRUE -#include -#include -#include -#ifdef HAVE_IN6ADDR_H -#include -#endif -#include - -#ifndef __func__ -#define __func__ __FUNCTION__ -#endif - -#ifdef _WIN32_WCE -#define vsnprintf _vsnprintf -#endif - -#define LWS_INVALID_FILE INVALID_HANDLE_VALUE -#else /* not windows --> */ -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef LWS_BUILTIN_GETIFADDRS - #include "deps/ifaddrs/ifaddrs.h" -#else - #include -#endif -//#include -#include -#include -#include -#ifndef LWS_NO_FORK -#ifdef HAVE_SYS_PRCTL_H -#include -#endif -#endif -#include -#include -#include -#include -#ifdef LWS_USE_LIBEV -#include -#endif /* LWS_USE_LIBEV */ - -#include -#include - -#define LWS_ERRNO errno -#define LWS_EAGAIN EAGAIN -#define LWS_EALREADY EALREADY -#define LWS_EINPROGRESS EINPROGRESS -#define LWS_EINTR EINTR -#define LWS_EISCONN EISCONN -#define LWS_EWOULDBLOCK EWOULDBLOCK -#define LWS_INVALID_FILE -1 -#define LWS_POLLHUP (POLLHUP|POLLERR) -#define LWS_POLLIN (POLLIN) -#define LWS_POLLOUT (POLLOUT) -#define compatible_close(fd) close(fd) -#define compatible_file_close(fd) close(fd) -#define compatible_file_seek_cur(fd, offset) lseek(fd, offset, SEEK_CUR) -#define compatible_file_read(amount, fd, buf, len) \ - amount = read(fd, buf, len); -#define lws_set_blocking_send(wsi) -#endif - -#ifndef HAVE_BZERO -#define bzero(b, len) (memset((b), '\0', (len)), (void) 0) -#endif - -#ifndef HAVE_STRERROR -#define strerror(x) "" -#endif - -#ifdef LWS_OPENSSL_SUPPORT -#ifdef USE_CYASSL -#include -#include -unsigned char * -SHA1(const unsigned char *d, size_t n, unsigned char *md); -#else -#include -#include -#include -#include -#include -#endif /* not USE_CYASSL */ -#endif - -#include "libwebsockets.h" - -#if defined(WIN32) || defined(_WIN32) - -#ifndef BIG_ENDIAN -#define BIG_ENDIAN 4321 /* to show byte order (taken from gcc) */ -#endif -#ifndef LITTLE_ENDIAN -#define LITTLE_ENDIAN 1234 -#endif -#ifndef BYTE_ORDER -#define BYTE_ORDER LITTLE_ENDIAN -#endif -typedef unsigned __int64 u_int64_t; - -#undef __P -#ifndef __P -#if __STDC__ -#define __P(protos) protos -#else -#define __P(protos) () -#endif -#endif - -#else - -#include -#include - -#if defined(__APPLE__) -#include -#elif defined(__FreeBSD__) -#include -#elif defined(__linux__) -#include -#endif - -#if !defined(BYTE_ORDER) -# define BYTE_ORDER __BYTE_ORDER -#endif -#if !defined(LITTLE_ENDIAN) -# define LITTLE_ENDIAN __LITTLE_ENDIAN -#endif -#if !defined(BIG_ENDIAN) -# define BIG_ENDIAN __BIG_ENDIAN -#endif - -#endif - -/* - * Mac OSX as well as iOS do not define the MSG_NOSIGNAL flag, - * but happily have something equivalent in the SO_NOSIGPIPE flag. - */ -#ifdef __APPLE__ -#define MSG_NOSIGNAL SO_NOSIGPIPE -#endif - -#ifndef LWS_MAX_HEADER_LEN -#define LWS_MAX_HEADER_LEN 1024 -#endif -#ifndef LWS_MAX_PROTOCOLS -#define LWS_MAX_PROTOCOLS 5 -#endif -#ifndef LWS_MAX_EXTENSIONS_ACTIVE -#define LWS_MAX_EXTENSIONS_ACTIVE 3 -#endif -#ifndef SPEC_LATEST_SUPPORTED -#define SPEC_LATEST_SUPPORTED 13 -#endif -#ifndef AWAITING_TIMEOUT -#define AWAITING_TIMEOUT 5 -#endif -#ifndef CIPHERS_LIST_STRING -#define CIPHERS_LIST_STRING "DEFAULT" -#endif -#ifndef LWS_SOMAXCONN -#define LWS_SOMAXCONN SOMAXCONN -#endif - -#define MAX_WEBSOCKET_04_KEY_LEN 128 -#define LWS_MAX_SOCKET_IO_BUF 4096 - -#ifndef SYSTEM_RANDOM_FILEPATH -#define SYSTEM_RANDOM_FILEPATH "/dev/urandom" -#endif -#ifndef LWS_MAX_ZLIB_CONN_BUFFER -#define LWS_MAX_ZLIB_CONN_BUFFER (64 * 1024) -#endif - -/* - * if not in a connection storm, check for incoming - * connections this many normal connection services - */ -#define LWS_LISTEN_SERVICE_MODULO 10 - -enum lws_websocket_opcodes_07 { - LWS_WS_OPCODE_07__CONTINUATION = 0, - LWS_WS_OPCODE_07__TEXT_FRAME = 1, - LWS_WS_OPCODE_07__BINARY_FRAME = 2, - - LWS_WS_OPCODE_07__NOSPEC__MUX = 7, - - /* control extensions 8+ */ - - LWS_WS_OPCODE_07__CLOSE = 8, - LWS_WS_OPCODE_07__PING = 9, - LWS_WS_OPCODE_07__PONG = 0xa, -}; - - -enum lws_connection_states { - WSI_STATE_HTTP, - WSI_STATE_HTTP_ISSUING_FILE, - WSI_STATE_HTTP_HEADERS, - WSI_STATE_HTTP_BODY, - WSI_STATE_DEAD_SOCKET, - WSI_STATE_ESTABLISHED, - WSI_STATE_CLIENT_UNCONNECTED, - WSI_STATE_RETURNED_CLOSE_ALREADY, - WSI_STATE_AWAITING_CLOSE_ACK, - WSI_STATE_FLUSHING_STORED_SEND_BEFORE_CLOSE, -}; - -enum lws_rx_parse_state { - LWS_RXPS_NEW, - - LWS_RXPS_04_MASK_NONCE_1, - LWS_RXPS_04_MASK_NONCE_2, - LWS_RXPS_04_MASK_NONCE_3, - - LWS_RXPS_04_FRAME_HDR_1, - LWS_RXPS_04_FRAME_HDR_LEN, - LWS_RXPS_04_FRAME_HDR_LEN16_2, - LWS_RXPS_04_FRAME_HDR_LEN16_1, - LWS_RXPS_04_FRAME_HDR_LEN64_8, - LWS_RXPS_04_FRAME_HDR_LEN64_7, - LWS_RXPS_04_FRAME_HDR_LEN64_6, - LWS_RXPS_04_FRAME_HDR_LEN64_5, - LWS_RXPS_04_FRAME_HDR_LEN64_4, - LWS_RXPS_04_FRAME_HDR_LEN64_3, - LWS_RXPS_04_FRAME_HDR_LEN64_2, - LWS_RXPS_04_FRAME_HDR_LEN64_1, - - LWS_RXPS_07_COLLECT_FRAME_KEY_1, - LWS_RXPS_07_COLLECT_FRAME_KEY_2, - LWS_RXPS_07_COLLECT_FRAME_KEY_3, - LWS_RXPS_07_COLLECT_FRAME_KEY_4, - - LWS_RXPS_PAYLOAD_UNTIL_LENGTH_EXHAUSTED -}; - - -enum connection_mode { - LWS_CONNMODE_HTTP_SERVING, - LWS_CONNMODE_HTTP_SERVING_ACCEPTED, /* actual HTTP service going on */ - LWS_CONNMODE_PRE_WS_SERVING_ACCEPT, - - LWS_CONNMODE_WS_SERVING, - LWS_CONNMODE_WS_CLIENT, - - /* transient, ssl delay hiding */ - LWS_CONNMODE_SSL_ACK_PENDING, - - /* transient modes */ - LWS_CONNMODE_WS_CLIENT_WAITING_CONNECT, - LWS_CONNMODE_WS_CLIENT_WAITING_PROXY_REPLY, - LWS_CONNMODE_WS_CLIENT_ISSUE_HANDSHAKE, - LWS_CONNMODE_WS_CLIENT_ISSUE_HANDSHAKE2, - LWS_CONNMODE_WS_CLIENT_WAITING_SSL, - LWS_CONNMODE_WS_CLIENT_WAITING_SERVER_REPLY, - LWS_CONNMODE_WS_CLIENT_WAITING_EXTENSION_CONNECT, - LWS_CONNMODE_WS_CLIENT_PENDING_CANDIDATE_CHILD, - - /* special internal types */ - LWS_CONNMODE_SERVER_LISTENER, -}; - -enum { - LWS_RXFLOW_ALLOW = (1 << 0), - LWS_RXFLOW_PENDING_CHANGE = (1 << 1), -}; - -struct libwebsocket_protocols; -struct libwebsocket; - -#ifdef LWS_USE_LIBEV -struct lws_io_watcher { - struct ev_io watcher; - struct libwebsocket_context* context; -}; - -struct lws_signal_watcher { - struct ev_signal watcher; - struct libwebsocket_context* context; -}; -#endif /* LWS_USE_LIBEV */ - -struct libwebsocket_context { -#ifdef _WIN32 - WSAEVENT *events; -#endif - struct libwebsocket_pollfd *fds; - struct libwebsocket **lws_lookup; /* fd to wsi */ - int fds_count; -#ifdef LWS_USE_LIBEV - struct ev_loop* io_loop; - struct lws_io_watcher w_accept; - struct lws_signal_watcher w_sigint; -#endif /* LWS_USE_LIBEV */ - int max_fds; - int listen_port; - const char *iface; - char http_proxy_address[128]; - char canonical_hostname[128]; - unsigned int http_proxy_port; - unsigned int options; - time_t last_timeout_check_s; - - /* - * usable by anything in the service code, but only if the scope - * does not last longer than the service action (since next service - * of any socket can likewise use it and overwrite) - */ - unsigned char service_buffer[LWS_MAX_SOCKET_IO_BUF]; - - int started_with_parent; - - int fd_random; - int listen_service_modulo; - int listen_service_count; - int listen_service_fd; - int listen_service_extraseen; - - /* - * set to the Thread ID that's doing the service loop just before entry - * to poll indicates service thread likely idling in poll() - * volatile because other threads may check it as part of processing - * for pollfd event change. - */ - volatile int service_tid; -#ifndef _WIN32 - int dummy_pipe_fds[2]; -#endif - - int ka_time; - int ka_probes; - int ka_interval; - -#ifdef LWS_LATENCY - unsigned long worst_latency; - char worst_latency_info[256]; -#endif - -#ifdef LWS_OPENSSL_SUPPORT - int use_ssl; - int allow_non_ssl_on_ssl_port; - SSL_CTX *ssl_ctx; - SSL_CTX *ssl_client_ctx; -#endif - struct libwebsocket_protocols *protocols; - int count_protocols; -#ifndef LWS_NO_EXTENSIONS - struct libwebsocket_extension *extensions; -#endif - void *user_space; -}; - -enum { - LWS_EV_READ = (1 << 0), - LWS_EV_WRITE = (1 << 1), - LWS_EV_START = (1 << 2), - LWS_EV_STOP = (1 << 3), -}; - -#ifdef LWS_USE_LIBEV -#define LWS_LIBEV_ENABLED(context) (context->options & LWS_SERVER_OPTION_LIBEV) -LWS_EXTERN void lws_feature_status_libev(struct lws_context_creation_info *info); -LWS_EXTERN void -lws_libev_accept(struct libwebsocket_context *context, - struct libwebsocket *new_wsi, int accept_fd); -LWS_EXTERN void -lws_libev_io(struct libwebsocket_context *context, - struct libwebsocket *wsi, int flags); -LWS_EXTERN int -lws_libev_init_fd_table(struct libwebsocket_context *context); -LWS_EXTERN void -lws_libev_run(struct libwebsocket_context *context); -#else -#define LWS_LIBEV_ENABLED(context) (0) -#define lws_feature_status_libev(_a) \ - lwsl_notice("libev support not compiled in\n") -#define lws_libev_accept(_a, _b, _c) (0) -#define lws_libev_io(_a, _b, _c) (0) -#define lws_libev_init_fd_table(_a) (0) -#define lws_libev_run(_a) (0) -#endif - -#ifdef LWS_USE_IPV6 -#define LWS_IPV6_ENABLED(context) (!(context->options & LWS_SERVER_OPTION_DISABLE_IPV6)) -#else -#define LWS_IPV6_ENABLED(context) (0) -#endif - -enum uri_path_states { - URIPS_IDLE, - URIPS_SEEN_SLASH, - URIPS_SEEN_SLASH_DOT, - URIPS_SEEN_SLASH_DOT_DOT, - URIPS_ARGUMENTS, -}; - -enum uri_esc_states { - URIES_IDLE, - URIES_SEEN_PERCENT, - URIES_SEEN_PERCENT_H1, -}; - -/* - * This is totally opaque to code using the library. It's exported as a - * forward-reference pointer-only declaration; the user can use the pointer with - * other APIs to get information out of it. - */ - -struct lws_fragments { - unsigned short offset; - unsigned short len; - unsigned char next_frag_index; -}; - -struct allocated_headers { - unsigned short next_frag_index; - unsigned short pos; - unsigned char frag_index[WSI_TOKEN_COUNT]; - struct lws_fragments frags[WSI_TOKEN_COUNT * 2]; - char data[LWS_MAX_HEADER_LEN]; -#ifndef LWS_NO_CLIENT - char initial_handshake_hash_base64[30]; - unsigned short c_port; -#endif -}; - -struct _lws_http_mode_related { - struct allocated_headers *ah; /* mirroring _lws_header_related */ -#if defined(WIN32) || defined(_WIN32) - HANDLE fd; -#else - int fd; -#endif - unsigned long filepos; - unsigned long filelen; - - int content_length; - int content_length_seen; - int body_index; - unsigned char *post_buffer; -}; - -struct _lws_header_related { - struct allocated_headers *ah; - short lextable_pos; - unsigned char parser_state; /* enum lws_token_indexes */ - enum uri_path_states ups; - enum uri_esc_states ues; - char esc_stash; -}; - -struct _lws_websocket_related { - char *rx_user_buffer; - int rx_user_buffer_head; - unsigned char frame_masking_nonce_04[4]; - unsigned char frame_mask_index; - size_t rx_packet_length; - unsigned char opcode; - unsigned int final:1; - unsigned char rsv; - unsigned int frame_is_binary:1; - unsigned int all_zero_nonce:1; - short close_reason; /* enum lws_close_status */ - unsigned char *rxflow_buffer; - int rxflow_len; - int rxflow_pos; - unsigned int rxflow_change_to:2; - unsigned int this_frame_masked:1; - unsigned int inside_frame:1; /* next write will be more of frame */ - unsigned int clean_buffer:1; /* buffer not rewritten by extension */ -}; - -struct libwebsocket { - - /* lifetime members */ - -#ifdef LWS_USE_LIBEV - struct lws_io_watcher w_read; - struct lws_io_watcher w_write; -#endif /* LWS_USE_LIBEV */ - const struct libwebsocket_protocols *protocol; -#ifndef LWS_NO_EXTENSIONS - struct libwebsocket_extension * - active_extensions[LWS_MAX_EXTENSIONS_ACTIVE]; - void *active_extensions_user[LWS_MAX_EXTENSIONS_ACTIVE]; - unsigned char count_active_extensions; - unsigned int extension_data_pending:1; -#endif - unsigned char ietf_spec_revision; - - char mode; /* enum connection_mode */ - char state; /* enum lws_connection_states */ - char lws_rx_parse_state; /* enum lws_rx_parse_state */ - char rx_frame_type; /* enum libwebsocket_write_protocol */ - - unsigned int hdr_parsing_completed:1; - - char pending_timeout; /* enum pending_timeout */ - time_t pending_timeout_limit; - - int sock; - int position_in_fds_table; -#ifdef LWS_LATENCY - unsigned long action_start; - unsigned long latency_start; -#endif - - /* truncated send handling */ - unsigned char *truncated_send_malloc; /* non-NULL means buffering in progress */ - unsigned int truncated_send_allocation; /* size of malloc */ - unsigned int truncated_send_offset; /* where we are in terms of spilling */ - unsigned int truncated_send_len; /* how much is buffered */ - - void *user_space; - - /* members with mutually exclusive lifetimes are unionized */ - - union u { - struct _lws_http_mode_related http; - struct _lws_header_related hdr; - struct _lws_websocket_related ws; - } u; - -#ifdef LWS_OPENSSL_SUPPORT - SSL *ssl; - BIO *client_bio; - unsigned int use_ssl:2; -#endif - -#ifdef _WIN32 - BOOL sock_send_blocking; -#endif -}; - -LWS_EXTERN int log_level; - -LWS_EXTERN void -libwebsocket_close_and_free_session(struct libwebsocket_context *context, - struct libwebsocket *wsi, enum lws_close_status); - -LWS_EXTERN int -remove_wsi_socket_from_fds(struct libwebsocket_context *context, - struct libwebsocket *wsi); - -#ifndef LWS_LATENCY -static inline void lws_latency(struct libwebsocket_context *context, - struct libwebsocket *wsi, const char *action, - int ret, int completion) { while (0); } -static inline void lws_latency_pre(struct libwebsocket_context *context, - struct libwebsocket *wsi) { while (0); } -#else -#define lws_latency_pre(_context, _wsi) lws_latency(_context, _wsi, NULL, 0, 0) -extern void -lws_latency(struct libwebsocket_context *context, - struct libwebsocket *wsi, const char *action, - int ret, int completion); -#endif - -LWS_EXTERN int -libwebsocket_client_rx_sm(struct libwebsocket *wsi, unsigned char c); - -LWS_EXTERN int -libwebsocket_parse(struct libwebsocket *wsi, unsigned char c); - -LWS_EXTERN int -lws_b64_selftest(void); - -LWS_EXTERN struct libwebsocket * -wsi_from_fd(struct libwebsocket_context *context, int fd); - -LWS_EXTERN int -insert_wsi_socket_into_fds(struct libwebsocket_context *context, - struct libwebsocket *wsi); - -LWS_EXTERN int -lws_issue_raw(struct libwebsocket *wsi, unsigned char *buf, size_t len); - - -LWS_EXTERN int -libwebsocket_service_timeout_check(struct libwebsocket_context *context, - struct libwebsocket *wsi, unsigned int sec); - -LWS_EXTERN struct libwebsocket * -libwebsocket_client_connect_2(struct libwebsocket_context *context, - struct libwebsocket *wsi); - -LWS_EXTERN struct libwebsocket * -libwebsocket_create_new_server_wsi(struct libwebsocket_context *context); - -LWS_EXTERN char * -libwebsockets_generate_client_handshake(struct libwebsocket_context *context, - struct libwebsocket *wsi, char *pkt); - -LWS_EXTERN int -lws_handle_POLLOUT_event(struct libwebsocket_context *context, - struct libwebsocket *wsi, struct libwebsocket_pollfd *pollfd); -/* - * EXTENSIONS - */ - -#ifndef LWS_NO_EXTENSIONS -LWS_VISIBLE void -lws_context_init_extensions(struct lws_context_creation_info *info, - struct libwebsocket_context *context); -LWS_EXTERN int -lws_any_extension_handled(struct libwebsocket_context *context, - struct libwebsocket *wsi, - enum libwebsocket_extension_callback_reasons r, - void *v, size_t len); - -LWS_EXTERN int -lws_ext_callback_for_each_active(struct libwebsocket *wsi, int reason, - void *buf, int len); -LWS_EXTERN int -lws_ext_callback_for_each_extension_type( - struct libwebsocket_context *context, struct libwebsocket *wsi, - int reason, void *arg, int len); -#else -#define lws_any_extension_handled(_a, _b, _c, _d, _e) (0) -#define lws_ext_callback_for_each_active(_a, _b, _c, _d) (0) -#define lws_ext_callback_for_each_extension_type(_a, _b, _c, _d, _e) (0) -#define lws_issue_raw_ext_access lws_issue_raw -#define lws_context_init_extensions(_a, _b) -#endif - -LWS_EXTERN int -lws_client_interpret_server_handshake(struct libwebsocket_context *context, - struct libwebsocket *wsi); - -LWS_EXTERN int -libwebsocket_rx_sm(struct libwebsocket *wsi, unsigned char c); - -LWS_EXTERN int -lws_issue_raw_ext_access(struct libwebsocket *wsi, - unsigned char *buf, size_t len); - -LWS_EXTERN int -_libwebsocket_rx_flow_control(struct libwebsocket *wsi); - -LWS_EXTERN int -user_callback_handle_rxflow(callback_function, - struct libwebsocket_context *context, - struct libwebsocket *wsi, - enum libwebsocket_callback_reasons reason, void *user, - void *in, size_t len); - -LWS_EXTERN int -lws_plat_set_socket_options(struct libwebsocket_context *context, int fd); - -LWS_EXTERN int -lws_allocate_header_table(struct libwebsocket *wsi); - -LWS_EXTERN char * -lws_hdr_simple_ptr(struct libwebsocket *wsi, enum lws_token_indexes h); - -LWS_EXTERN int -lws_hdr_simple_create(struct libwebsocket *wsi, - enum lws_token_indexes h, const char *s); - -LWS_EXTERN int -libwebsocket_ensure_user_space(struct libwebsocket *wsi); - -LWS_EXTERN int -lws_change_pollfd(struct libwebsocket *wsi, int _and, int _or); - -#ifndef LWS_NO_SERVER -int lws_context_init_server(struct lws_context_creation_info *info, - struct libwebsocket_context *context); -LWS_EXTERN int handshake_0405(struct libwebsocket_context *context, - struct libwebsocket *wsi); -LWS_EXTERN int -libwebsocket_interpret_incoming_packet(struct libwebsocket *wsi, - unsigned char *buf, size_t len); -LWS_EXTERN void -lws_server_get_canonical_hostname(struct libwebsocket_context *context, - struct lws_context_creation_info *info); -#else -#define lws_context_init_server(_a, _b) (0) -#define libwebsocket_interpret_incoming_packet(_a, _b, _c) (0) -#define lws_server_get_canonical_hostname(_a, _b) -#endif - -#ifndef LWS_NO_DAEMONIZE -LWS_EXTERN int get_daemonize_pid(); -#else -#define get_daemonize_pid() (0) -#endif - -LWS_EXTERN int interface_to_sa(struct libwebsocket_context *context, - const char *ifname, struct sockaddr_in *addr, size_t addrlen); - -LWS_EXTERN void lwsl_emit_stderr(int level, const char *line); - -#ifdef _WIN32 -LWS_EXTERN HANDLE lws_plat_open_file(const char* filename, unsigned long* filelen); -#else -LWS_EXTERN int lws_plat_open_file(const char* filename, unsigned long* filelen); -#endif - -enum lws_ssl_capable_status { - LWS_SSL_CAPABLE_ERROR = -1, - LWS_SSL_CAPABLE_MORE_SERVICE = -2, -}; - -#ifndef LWS_OPENSSL_SUPPORT -#define LWS_SSL_ENABLED(context) (0) -unsigned char * -SHA1(const unsigned char *d, size_t n, unsigned char *md); -#define lws_context_init_server_ssl(_a, _b) (0) -#define lws_ssl_destroy(_a) -#define lws_context_init_http2_ssl(_a) -#define lws_ssl_pending(_a) (0) -#define lws_ssl_capable_read lws_ssl_capable_read_no_ssl -#define lws_ssl_capable_write lws_ssl_capable_write_no_ssl -#define lws_server_socket_service_ssl(_a, _b, _c, _d, _e) (0) -#define lws_ssl_close(_a) (0) -#define lws_ssl_context_destroy(_a) -#else -#define LWS_SSL_ENABLED(context) (context->use_ssl) -LWS_EXTERN int lws_ssl_pending(struct libwebsocket *wsi); -LWS_EXTERN int openssl_websocket_private_data_index; -LWS_EXTERN int -lws_ssl_capable_read(struct libwebsocket *wsi, unsigned char *buf, int len); - -LWS_EXTERN int -lws_ssl_capable_write(struct libwebsocket *wsi, unsigned char *buf, int len); -LWS_EXTERN int -lws_server_socket_service_ssl(struct libwebsocket_context *context, - struct libwebsocket **wsi, struct libwebsocket *new_wsi, - int accept_fd, struct libwebsocket_pollfd *pollfd); -LWS_EXTERN int -lws_ssl_close(struct libwebsocket *wsi); -LWS_EXTERN void -lws_ssl_context_destroy(struct libwebsocket_context *context); -#ifndef LWS_NO_SERVER -LWS_EXTERN int -lws_context_init_server_ssl(struct lws_context_creation_info *info, - struct libwebsocket_context *context); -#else -#define lws_context_init_server_ssl(_a, _b) (0) -#endif -LWS_EXTERN void -lws_ssl_destroy(struct libwebsocket_context *context); - -/* HTTP2-related */ - -#ifdef LWS_USE_HTTP2 -LWS_EXTERN void -lws_context_init_http2_ssl(struct libwebsocket_context *context); -#else -#define lws_context_init_http2_ssl(_a) -#endif -#endif - -LWS_EXTERN int -lws_ssl_capable_read_no_ssl(struct libwebsocket *wsi, unsigned char *buf, int len); - -LWS_EXTERN int -lws_ssl_capable_write_no_ssl(struct libwebsocket *wsi, unsigned char *buf, int len); - -#ifndef LWS_NO_CLIENT - LWS_EXTERN int lws_client_socket_service( - struct libwebsocket_context *context, - struct libwebsocket *wsi, struct libwebsocket_pollfd *pollfd); -#ifdef LWS_OPENSSL_SUPPORT - LWS_EXTERN int lws_context_init_client_ssl(struct lws_context_creation_info *info, - struct libwebsocket_context *context); -#else - #define lws_context_init_client_ssl(_a, _b) (0) -#endif - LWS_EXTERN int lws_handshake_client(struct libwebsocket *wsi, unsigned char **buf, size_t len); - LWS_EXTERN void - libwebsockets_decode_ssl_error(void); -#else -#define lws_context_init_client_ssl(_a, _b) (0) -#define lws_handshake_client(_a, _b, _c) (0) -#endif -#ifndef LWS_NO_SERVER - LWS_EXTERN int lws_server_socket_service( - struct libwebsocket_context *context, - struct libwebsocket *wsi, struct libwebsocket_pollfd *pollfd); - LWS_EXTERN int _libwebsocket_rx_flow_control(struct libwebsocket *wsi); - LWS_EXTERN int lws_handshake_server(struct libwebsocket_context *context, - struct libwebsocket *wsi, unsigned char **buf, size_t len); -#else -#define lws_server_socket_service(_a, _b, _c) (0) -#define _libwebsocket_rx_flow_control(_a) (0) -#define lws_handshake_server(_a, _b, _c, _d) (0) -#endif - -/* - * lws_plat_ - */ -LWS_EXTERN void -lws_plat_delete_socket_from_fds(struct libwebsocket_context *context, - struct libwebsocket *wsi, int m); -LWS_EXTERN void -lws_plat_insert_socket_into_fds(struct libwebsocket_context *context, - struct libwebsocket *wsi); -LWS_EXTERN void -lws_plat_service_periodic(struct libwebsocket_context *context); - -LWS_EXTERN int -lws_plat_change_pollfd(struct libwebsocket_context *context, - struct libwebsocket *wsi, struct libwebsocket_pollfd *pfd); -LWS_EXTERN int -lws_plat_context_early_init(void); -LWS_EXTERN void -lws_plat_context_early_destroy(struct libwebsocket_context *context); -LWS_EXTERN void -lws_plat_context_late_destroy(struct libwebsocket_context *context); -LWS_EXTERN int -lws_poll_listen_fd(struct libwebsocket_pollfd *fd); -LWS_EXTERN int -lws_plat_service(struct libwebsocket_context *context, int timeout_ms); -LWS_EXTERN int -lws_plat_init_fd_tables(struct libwebsocket_context *context); -LWS_EXTERN void -lws_plat_drop_app_privileges(struct lws_context_creation_info *info); -LWS_EXTERN unsigned long long -time_in_microseconds(void); -LWS_EXTERN const char * -lws_plat_inet_ntop(int af, const void *src, char *dst, int cnt); diff --git a/core/deps/libwebsocket/server-handshake.c b/core/deps/libwebsocket/server-handshake.c deleted file mode 100644 index 56cf9a13e..000000000 --- a/core/deps/libwebsocket/server-handshake.c +++ /dev/null @@ -1,280 +0,0 @@ -/* - * libwebsockets - small server side websockets and web server implementation - * - * Copyright (C) 2010-2013 Andy Green - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation: - * version 2.1 of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301 USA - */ - -#include "private-libwebsockets.h" - -#define LWS_CPYAPP(ptr, str) { strcpy(ptr, str); ptr += strlen(str); } -#ifndef LWS_NO_EXTENSIONS -LWS_VISIBLE int -lws_extension_server_handshake(struct libwebsocket_context *context, - struct libwebsocket *wsi, char **p) -{ - int n; - char *c; - char ext_name[128]; - struct libwebsocket_extension *ext; - int ext_count = 0; - int more = 1; - - /* - * Figure out which extensions the client has that we want to - * enable on this connection, and give him back the list - */ - - if (!lws_hdr_total_length(wsi, WSI_TOKEN_EXTENSIONS)) - return 0; - - /* - * break down the list of client extensions - * and go through them - */ - - if (lws_hdr_copy(wsi, (char *)context->service_buffer, - sizeof(context->service_buffer), - WSI_TOKEN_EXTENSIONS) < 0) - return 1; - - c = (char *)context->service_buffer; - lwsl_parser("WSI_TOKEN_EXTENSIONS = '%s'\n", c); - wsi->count_active_extensions = 0; - n = 0; - while (more) { - - if (*c && (*c != ',' && *c != ' ' && *c != '\t')) { - ext_name[n] = *c++; - if (n < sizeof(ext_name) - 1) - n++; - continue; - } - ext_name[n] = '\0'; - if (!*c) - more = 0; - else { - c++; - if (!n) - continue; - } - - /* check a client's extension against our support */ - - ext = wsi->protocol->owning_server->extensions; - - while (ext && ext->callback) { - - if (strcmp(ext_name, ext->name)) { - ext++; - continue; - } - - /* - * oh, we do support this one he - * asked for... but let's ask user - * code if it's OK to apply it on this - * particular connection + protocol - */ - - n = wsi->protocol->owning_server-> - protocols[0].callback( - wsi->protocol->owning_server, - wsi, - LWS_CALLBACK_CONFIRM_EXTENSION_OKAY, - wsi->user_space, ext_name, 0); - - /* - * zero return from callback means - * go ahead and allow the extension, - * it's what we get if the callback is - * unhandled - */ - - if (n) { - ext++; - continue; - } - - /* apply it */ - - if (ext_count) - *(*p)++ = ','; - else - LWS_CPYAPP(*p, - "\x0d\x0aSec-WebSocket-Extensions: "); - *p += sprintf(*p, "%s", ext_name); - ext_count++; - - /* instantiate the extension on this conn */ - - wsi->active_extensions_user[ - wsi->count_active_extensions] = - malloc(ext->per_session_data_size); - if (wsi->active_extensions_user[ - wsi->count_active_extensions] == NULL) { - lwsl_err("Out of mem\n"); - return 1; - } - memset(wsi->active_extensions_user[ - wsi->count_active_extensions], 0, - ext->per_session_data_size); - - wsi->active_extensions[ - wsi->count_active_extensions] = ext; - - /* allow him to construct his context */ - - ext->callback(wsi->protocol->owning_server, - ext, wsi, - LWS_EXT_CALLBACK_CONSTRUCT, - wsi->active_extensions_user[ - wsi->count_active_extensions], NULL, 0); - - wsi->count_active_extensions++; - lwsl_parser("count_active_extensions <- %d\n", - wsi->count_active_extensions); - - ext++; - } - - n = 0; - } - - return 0; -} -#endif -int -handshake_0405(struct libwebsocket_context *context, struct libwebsocket *wsi) -{ - unsigned char hash[20]; - int n; - char *response; - char *p; - int accept_len; - - if (!lws_hdr_total_length(wsi, WSI_TOKEN_HOST) || - !lws_hdr_total_length(wsi, WSI_TOKEN_KEY)) { - lwsl_parser("handshake_04 missing pieces\n"); - /* completed header processing, but missing some bits */ - goto bail; - } - - if (lws_hdr_total_length(wsi, WSI_TOKEN_KEY) >= - MAX_WEBSOCKET_04_KEY_LEN) { - lwsl_warn("Client key too long %d\n", MAX_WEBSOCKET_04_KEY_LEN); - goto bail; - } - - /* - * since key length is restricted above (currently 128), cannot - * overflow - */ - n = sprintf((char *)context->service_buffer, - "%s258EAFA5-E914-47DA-95CA-C5AB0DC85B11", - lws_hdr_simple_ptr(wsi, WSI_TOKEN_KEY)); - - SHA1(context->service_buffer, n, hash); - - accept_len = lws_b64_encode_string((char *)hash, 20, - (char *)context->service_buffer, - sizeof(context->service_buffer)); - if (accept_len < 0) { - lwsl_warn("Base64 encoded hash too long\n"); - goto bail; - } - - /* allocate the per-connection user memory (if any) */ - if (libwebsocket_ensure_user_space(wsi)) - goto bail; - - /* create the response packet */ - - /* make a buffer big enough for everything */ - - response = (char *)context->service_buffer + MAX_WEBSOCKET_04_KEY_LEN; - p = response; - LWS_CPYAPP(p, "HTTP/1.1 101 Switching Protocols\x0d\x0a" - "Upgrade: WebSocket\x0d\x0a" - "Connection: Upgrade\x0d\x0a" - "Sec-WebSocket-Accept: "); - strcpy(p, (char *)context->service_buffer); - p += accept_len; - - if (lws_hdr_total_length(wsi, WSI_TOKEN_PROTOCOL)) { - LWS_CPYAPP(p, "\x0d\x0aSec-WebSocket-Protocol: "); - n = lws_hdr_copy(wsi, p, 128, WSI_TOKEN_PROTOCOL); - if (n < 0) - goto bail; - p += n; - } - -#ifndef LWS_NO_EXTENSIONS - /* - * Figure out which extensions the client has that we want to - * enable on this connection, and give him back the list - */ - if (lws_extension_server_handshake(context, wsi, &p)) - goto bail; -#endif - /* end of response packet */ - - LWS_CPYAPP(p, "\x0d\x0a\x0d\x0a"); - - if (!lws_any_extension_handled(context, wsi, - LWS_EXT_CALLBACK_HANDSHAKE_REPLY_TX, - response, p - response)) { - - /* okay send the handshake response accepting the connection */ - - lwsl_parser("issuing resp pkt %d len\n", (int)(p - response)); -#ifdef DEBUG - fwrite(response, 1, p - response, stderr); -#endif - n = libwebsocket_write(wsi, (unsigned char *)response, - p - response, LWS_WRITE_HTTP); - if (n != (p - response)) { - lwsl_debug("handshake_0405: ERROR writing to socket\n"); - goto bail; - } - - } - - /* alright clean up and set ourselves into established state */ - - wsi->state = WSI_STATE_ESTABLISHED; - wsi->lws_rx_parse_state = LWS_RXPS_NEW; - - /* notify user code that we're ready to roll */ - - if (wsi->protocol->callback) - wsi->protocol->callback(wsi->protocol->owning_server, - wsi, LWS_CALLBACK_ESTABLISHED, - wsi->user_space, NULL, 0); - - return 0; - - -bail: - /* free up his parsing allocations */ - - if (wsi->u.hdr.ah) - free(wsi->u.hdr.ah); - - return -1; -} - diff --git a/core/deps/libwebsocket/server.c b/core/deps/libwebsocket/server.c deleted file mode 100644 index bb9a1ae1f..000000000 --- a/core/deps/libwebsocket/server.c +++ /dev/null @@ -1,868 +0,0 @@ -/* - * libwebsockets - small server side websockets and web server implementation - * - * Copyright (C) 2010-2013 Andy Green - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation: - * version 2.1 of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301 USA - */ - - -#include "private-libwebsockets.h" - -int lws_context_init_server(struct lws_context_creation_info *info, - struct libwebsocket_context *context) -{ - int n; - int sockfd; - struct sockaddr_in sin; - socklen_t len = sizeof(sin); - int opt = 1; - struct libwebsocket *wsi; -#ifdef LWS_USE_IPV6 - struct sockaddr_in6 serv_addr6; -#endif - struct sockaddr_in serv_addr4; - struct sockaddr *v; - - /* set up our external listening socket we serve on */ - - if (info->port == CONTEXT_PORT_NO_LISTEN) - return 0; - -#ifdef LWS_USE_IPV6 - if (LWS_IPV6_ENABLED(context)) - sockfd = socket(AF_INET6, SOCK_STREAM, 0); - else -#endif - sockfd = socket(AF_INET, SOCK_STREAM, 0); - - if (sockfd < 0) { - lwsl_err("ERROR opening socket\n"); - return 1; - } - - /* - * allow us to restart even if old sockets in TIME_WAIT - */ - setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, - (const void *)&opt, sizeof(opt)); - - lws_plat_set_socket_options(context, sockfd); - -#ifdef LWS_USE_IPV6 - if (LWS_IPV6_ENABLED(context)) { - v = (struct sockaddr *)&serv_addr6; - n = sizeof(struct sockaddr_in6); - bzero((char *) &serv_addr6, sizeof(serv_addr6)); - serv_addr6.sin6_addr = in6addr_any; - serv_addr6.sin6_family = AF_INET6; - serv_addr6.sin6_port = htons(info->port); - } else -#endif - { - v = (struct sockaddr *)&serv_addr4; - n = sizeof(serv_addr4); - bzero((char *) &serv_addr4, sizeof(serv_addr4)); - serv_addr4.sin_addr.s_addr = INADDR_ANY; - serv_addr4.sin_family = AF_INET; - serv_addr4.sin_port = htons(info->port); - - if (info->iface) { - if (interface_to_sa(context, info->iface, - (struct sockaddr_in *)v, n) < 0) { - lwsl_err("Unable to find interface %s\n", - info->iface); - compatible_close(sockfd); - return 1; - } - } - } /* ipv4 */ - - n = bind(sockfd, v, n); - if (n < 0) { - lwsl_err("ERROR on binding to port %d (%d %d)\n", - info->port, n, LWS_ERRNO); - compatible_close(sockfd); - return 1; - } - - if (getsockname(sockfd, (struct sockaddr *)&sin, &len) == -1) - lwsl_warn("getsockname: %s\n", strerror(LWS_ERRNO)); - else - info->port = ntohs(sin.sin_port); - - context->listen_port = info->port; - - wsi = (struct libwebsocket *)malloc(sizeof(struct libwebsocket)); - if (wsi == NULL) { - lwsl_err("Out of mem\n"); - compatible_close(sockfd); - return 1; - } - memset(wsi, 0, sizeof(struct libwebsocket)); - wsi->sock = sockfd; - wsi->mode = LWS_CONNMODE_SERVER_LISTENER; - - insert_wsi_socket_into_fds(context, wsi); - - context->listen_service_modulo = LWS_LISTEN_SERVICE_MODULO; - context->listen_service_count = 0; - context->listen_service_fd = sockfd; - - listen(sockfd, LWS_SOMAXCONN); - lwsl_notice(" Listening on port %d\n", info->port); - - return 0; -} - -int -_libwebsocket_rx_flow_control(struct libwebsocket *wsi) -{ - struct libwebsocket_context *context = wsi->protocol->owning_server; - - /* there is no pending change */ - if (!(wsi->u.ws.rxflow_change_to & LWS_RXFLOW_PENDING_CHANGE)) - return 0; - - /* stuff is still buffered, not ready to really accept new input */ - if (wsi->u.ws.rxflow_buffer) { - /* get ourselves called back to deal with stashed buffer */ - libwebsocket_callback_on_writable(context, wsi); - return 0; - } - - /* pending is cleared, we can change rxflow state */ - - wsi->u.ws.rxflow_change_to &= ~LWS_RXFLOW_PENDING_CHANGE; - - lwsl_info("rxflow: wsi %p change_to %d\n", wsi, - wsi->u.ws.rxflow_change_to & LWS_RXFLOW_ALLOW); - - /* adjust the pollfd for this wsi */ - - if (wsi->u.ws.rxflow_change_to & LWS_RXFLOW_ALLOW) { - if (lws_change_pollfd(wsi, 0, LWS_POLLIN)) { - lwsl_info("%s: fail\n", __func__); - return -1; - } - } else - if (lws_change_pollfd(wsi, LWS_POLLIN, 0)) - return -1; - - return 0; -} - - -int lws_handshake_server(struct libwebsocket_context *context, - struct libwebsocket *wsi, unsigned char **buf, size_t len) -{ - struct allocated_headers *ah; - char *uri_ptr = NULL; - int uri_len = 0; - char content_length_str[32]; - int n; - - /* LWS_CONNMODE_WS_SERVING */ - - while (len--) { - if (libwebsocket_parse(wsi, *(*buf)++)) { - lwsl_info("libwebsocket_parse failed\n"); - goto bail_nuke_ah; - } - - if (wsi->u.hdr.parser_state != WSI_PARSING_COMPLETE) - continue; - - lwsl_parser("libwebsocket_parse sees parsing complete\n"); - - wsi->mode = LWS_CONNMODE_PRE_WS_SERVING_ACCEPT; - libwebsocket_set_timeout(wsi, NO_PENDING_TIMEOUT, 0); - - /* is this websocket protocol or normal http 1.0? */ - - if (!lws_hdr_total_length(wsi, WSI_TOKEN_UPGRADE) || - !lws_hdr_total_length(wsi, WSI_TOKEN_CONNECTION)) { - - /* it's not websocket.... shall we accept it as http? */ - - if (!lws_hdr_total_length(wsi, WSI_TOKEN_GET_URI) && - !lws_hdr_total_length(wsi, WSI_TOKEN_POST_URI)) { - lwsl_warn("Missing URI in HTTP request\n"); - goto bail_nuke_ah; - } - - if (lws_hdr_total_length(wsi, WSI_TOKEN_GET_URI) && - lws_hdr_total_length(wsi, WSI_TOKEN_POST_URI)) { - lwsl_warn("GET and POST methods?\n"); - goto bail_nuke_ah; - } - - if (libwebsocket_ensure_user_space(wsi)) - goto bail_nuke_ah; - - if (lws_hdr_total_length(wsi, WSI_TOKEN_GET_URI)) { - uri_ptr = lws_hdr_simple_ptr(wsi, WSI_TOKEN_GET_URI); - uri_len = lws_hdr_total_length(wsi, WSI_TOKEN_GET_URI); - lwsl_info("HTTP GET request for '%s'\n", - lws_hdr_simple_ptr(wsi, WSI_TOKEN_GET_URI)); - - } - if (lws_hdr_total_length(wsi, WSI_TOKEN_POST_URI)) { - lwsl_info("HTTP POST request for '%s'\n", - lws_hdr_simple_ptr(wsi, WSI_TOKEN_POST_URI)); - uri_ptr = lws_hdr_simple_ptr(wsi, WSI_TOKEN_POST_URI); - uri_len = lws_hdr_total_length(wsi, WSI_TOKEN_POST_URI); - } - - /* - * Hm we still need the headers so the - * callback can look at leaders like the URI, but we - * need to transition to http union state.... hold a - * copy of u.hdr.ah and deallocate afterwards - */ - ah = wsi->u.hdr.ah; - - /* union transition */ - memset(&wsi->u, 0, sizeof(wsi->u)); - wsi->mode = LWS_CONNMODE_HTTP_SERVING_ACCEPTED; - wsi->state = WSI_STATE_HTTP; - wsi->u.http.fd = LWS_INVALID_FILE; - - /* expose it at the same offset as u.hdr */ - wsi->u.http.ah = ah; - - /* HTTP header had a content length? */ - - wsi->u.http.content_length = 0; - if (lws_hdr_total_length(wsi, WSI_TOKEN_POST_URI)) - wsi->u.http.content_length = 100 * 1024 * 1024; - - if (lws_hdr_total_length(wsi, WSI_TOKEN_HTTP_CONTENT_LENGTH)) { - lws_hdr_copy(wsi, content_length_str, - sizeof(content_length_str) - 1, - WSI_TOKEN_HTTP_CONTENT_LENGTH); - wsi->u.http.content_length = atoi(content_length_str); - } - - if (wsi->u.http.content_length > 0) { - wsi->u.http.body_index = 0; - n = wsi->protocol->rx_buffer_size; - if (!n) - n = LWS_MAX_SOCKET_IO_BUF; - wsi->u.http.post_buffer = malloc(n); - if (!wsi->u.http.post_buffer) { - lwsl_err("Unable to allocate post buffer\n"); - n = -1; - goto cleanup; - } - } - - n = 0; - if (wsi->protocol->callback) - n = wsi->protocol->callback(context, wsi, - LWS_CALLBACK_FILTER_HTTP_CONNECTION, - wsi->user_space, uri_ptr, uri_len); - - if (!n) { - /* - * if there is content supposed to be coming, - * put a timeout on it having arrived - */ - libwebsocket_set_timeout(wsi, - PENDING_TIMEOUT_HTTP_CONTENT, - AWAITING_TIMEOUT); - - if (wsi->protocol->callback) - n = wsi->protocol->callback(context, wsi, - LWS_CALLBACK_HTTP, - wsi->user_space, uri_ptr, uri_len); - } - -cleanup: - /* now drop the header info we kept a pointer to */ - if (ah) - free(ah); - /* not possible to continue to use past here */ - wsi->u.http.ah = NULL; - - if (n) { - lwsl_info("LWS_CALLBACK_HTTP closing\n"); - return 1; /* struct ah ptr already nuked */ - } - - /* - * (if callback didn't start sending a file) - * deal with anything else as body, whether - * there was a content-length or not - */ - - if (wsi->state != WSI_STATE_HTTP_ISSUING_FILE) - wsi->state = WSI_STATE_HTTP_BODY; - return 2; /* goto http_postbody; */ - } - - if (!wsi->protocol) - lwsl_err("NULL protocol at libwebsocket_read\n"); - - /* - * It's websocket - * - * Make sure user side is happy about protocol - */ - - while (wsi->protocol->callback) { - - if (!lws_hdr_total_length(wsi, WSI_TOKEN_PROTOCOL)) { - if (wsi->protocol->name == NULL) - break; - } else - if (wsi->protocol->name && strcmp( - lws_hdr_simple_ptr(wsi, - WSI_TOKEN_PROTOCOL), - wsi->protocol->name) == 0) - break; - - wsi->protocol++; - } - - /* we didn't find a protocol he wanted? */ - - if (wsi->protocol->callback == NULL) { - if (lws_hdr_simple_ptr(wsi, WSI_TOKEN_PROTOCOL) == - NULL) { - lwsl_info("no protocol -> prot 0 handler\n"); - wsi->protocol = &context->protocols[0]; - } else { - lwsl_err("Req protocol %s not supported\n", - lws_hdr_simple_ptr(wsi, WSI_TOKEN_PROTOCOL)); - goto bail_nuke_ah; - } - } - - /* allocate wsi->user storage */ - if (libwebsocket_ensure_user_space(wsi)) - goto bail_nuke_ah; - - /* - * Give the user code a chance to study the request and - * have the opportunity to deny it - */ - - if ((wsi->protocol->callback)(wsi->protocol->owning_server, wsi, - LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION, - wsi->user_space, - lws_hdr_simple_ptr(wsi, WSI_TOKEN_PROTOCOL), 0)) { - lwsl_warn("User code denied connection\n"); - goto bail_nuke_ah; - } - - - /* - * Perform the handshake according to the protocol version the - * client announced - */ - - switch (wsi->ietf_spec_revision) { - case 13: - lwsl_parser("lws_parse calling handshake_04\n"); - if (handshake_0405(context, wsi)) { - lwsl_info("hs0405 has failed the connection\n"); - goto bail_nuke_ah; - } - break; - - default: - lwsl_warn("Unknown client spec version %d\n", - wsi->ietf_spec_revision); - goto bail_nuke_ah; - } - - /* drop the header info -- no bail_nuke_ah after this */ - - if (wsi->u.hdr.ah) - free(wsi->u.hdr.ah); - - wsi->mode = LWS_CONNMODE_WS_SERVING; - - /* union transition */ - memset(&wsi->u, 0, sizeof(wsi->u)); - wsi->u.ws.rxflow_change_to = LWS_RXFLOW_ALLOW; - - /* - * create the frame buffer for this connection according to the - * size mentioned in the protocol definition. If 0 there, use - * a big default for compatibility - */ - - n = wsi->protocol->rx_buffer_size; - if (!n) - n = LWS_MAX_SOCKET_IO_BUF; - n += LWS_SEND_BUFFER_PRE_PADDING + LWS_SEND_BUFFER_POST_PADDING; - wsi->u.ws.rx_user_buffer = malloc(n); - if (!wsi->u.ws.rx_user_buffer) { - lwsl_err("Out of Mem allocating rx buffer %d\n", n); - return 1; - } - lwsl_info("Allocating RX buffer %d\n", n); - - if (setsockopt(wsi->sock, SOL_SOCKET, SO_SNDBUF, (const char *)&n, sizeof n)) { - lwsl_warn("Failed to set SNDBUF to %d", n); - return 1; - } - - lwsl_parser("accepted v%02d connection\n", - wsi->ietf_spec_revision); - } /* while all chars are handled */ - - return 0; - -bail_nuke_ah: - /* drop the header info */ - if (wsi->u.hdr.ah) - free(wsi->u.hdr.ah); - return 1; -} - -struct libwebsocket * -libwebsocket_create_new_server_wsi(struct libwebsocket_context *context) -{ - struct libwebsocket *new_wsi; - - new_wsi = (struct libwebsocket *)malloc(sizeof(struct libwebsocket)); - if (new_wsi == NULL) { - lwsl_err("Out of memory for new connection\n"); - return NULL; - } - - memset(new_wsi, 0, sizeof(struct libwebsocket)); - new_wsi->pending_timeout = NO_PENDING_TIMEOUT; - - /* intialize the instance struct */ - - new_wsi->state = WSI_STATE_HTTP; - new_wsi->mode = LWS_CONNMODE_HTTP_SERVING; - new_wsi->hdr_parsing_completed = 0; - - if (lws_allocate_header_table(new_wsi)) { - free(new_wsi); - return NULL; - } - - /* - * these can only be set once the protocol is known - * we set an unestablished connection's protocol pointer - * to the start of the supported list, so it can look - * for matching ones during the handshake - */ - new_wsi->protocol = context->protocols; - new_wsi->user_space = NULL; - new_wsi->ietf_spec_revision = 0; - - /* - * outermost create notification for wsi - * no user_space because no protocol selection - */ - context->protocols[0].callback(context, new_wsi, - LWS_CALLBACK_WSI_CREATE, NULL, NULL, 0); - - return new_wsi; -} - -int lws_server_socket_service(struct libwebsocket_context *context, - struct libwebsocket *wsi, struct libwebsocket_pollfd *pollfd) -{ - struct libwebsocket *new_wsi = NULL; - int accept_fd = 0; - socklen_t clilen; - struct sockaddr_in cli_addr; - int n; - int len; - - switch (wsi->mode) { - - case LWS_CONNMODE_HTTP_SERVING: - case LWS_CONNMODE_HTTP_SERVING_ACCEPTED: - - /* handle http headers coming in */ - - /* pending truncated sends have uber priority */ - - if (wsi->truncated_send_malloc) { - if (pollfd->revents & LWS_POLLOUT) - if (lws_issue_raw(wsi, wsi->truncated_send_malloc + - wsi->truncated_send_offset, - wsi->truncated_send_len) < 0) { - lwsl_info("closing from socket service\n"); - return -1; - } - /* - * we can't afford to allow input processing send - * something new, so spin around he event loop until - * he doesn't have any partials - */ - break; - } - - /* any incoming data ready? */ - - if (pollfd->revents & LWS_POLLIN) { - len = lws_ssl_capable_read(wsi, - context->service_buffer, - sizeof(context->service_buffer)); - switch (len) { - case 0: - lwsl_info("lws_server_skt_srv: read 0 len\n"); - /* lwsl_info(" state=%d\n", wsi->state); */ - if (!wsi->hdr_parsing_completed) - free(wsi->u.hdr.ah); - /* fallthru */ - case LWS_SSL_CAPABLE_ERROR: - libwebsocket_close_and_free_session( - context, wsi, - LWS_CLOSE_STATUS_NOSTATUS); - return 0; - case LWS_SSL_CAPABLE_MORE_SERVICE: - break; - } - - /* just ignore incoming if waiting for close */ - if (wsi->state != WSI_STATE_FLUSHING_STORED_SEND_BEFORE_CLOSE) { - - /* hm this may want to send (via HTTP callback for example) */ - - n = libwebsocket_read(context, wsi, - context->service_buffer, len); - if (n < 0) - /* we closed wsi */ - return 0; - - /* hum he may have used up the writability above */ - break; - } - } - - /* this handles POLLOUT for http serving fragments */ - - if (!(pollfd->revents & LWS_POLLOUT)) - break; - - /* one shot */ - if (lws_change_pollfd(wsi, LWS_POLLOUT, 0)) - goto fail; - - lws_libev_io(context, wsi, LWS_EV_STOP | LWS_EV_WRITE); - - if (wsi->state != WSI_STATE_HTTP_ISSUING_FILE) { - n = user_callback_handle_rxflow( - wsi->protocol->callback, - wsi->protocol->owning_server, - wsi, LWS_CALLBACK_HTTP_WRITEABLE, - wsi->user_space, - NULL, - 0); - if (n < 0) - libwebsocket_close_and_free_session( - context, wsi, LWS_CLOSE_STATUS_NOSTATUS); - break; - } - - /* nonzero for completion or error */ - if (libwebsockets_serve_http_file_fragment(context, wsi)) - libwebsocket_close_and_free_session(context, wsi, - LWS_CLOSE_STATUS_NOSTATUS); - break; - - case LWS_CONNMODE_SERVER_LISTENER: - - /* pollin means a client has connected to us then */ - - if (!(pollfd->revents & LWS_POLLIN)) - break; - - /* listen socket got an unencrypted connection... */ - - clilen = sizeof(cli_addr); - lws_latency_pre(context, wsi); - accept_fd = accept(pollfd->fd, (struct sockaddr *)&cli_addr, - &clilen); - lws_latency(context, wsi, - "unencrypted accept LWS_CONNMODE_SERVER_LISTENER", - accept_fd, accept_fd >= 0); - if (accept_fd < 0) { - if (LWS_ERRNO == LWS_EAGAIN || LWS_ERRNO == LWS_EWOULDBLOCK) { - lwsl_debug("accept asks to try again\n"); - break; - } - lwsl_warn("ERROR on accept: %s\n", strerror(LWS_ERRNO)); - break; - } - - lws_plat_set_socket_options(context, accept_fd); - - /* - * look at who we connected to and give user code a chance - * to reject based on client IP. There's no protocol selected - * yet so we issue this to protocols[0] - */ - - if ((context->protocols[0].callback)(context, wsi, - LWS_CALLBACK_FILTER_NETWORK_CONNECTION, - NULL, (void *)(long)accept_fd, 0)) { - lwsl_debug("Callback denied network connection\n"); - compatible_close(accept_fd); - break; - } - - new_wsi = libwebsocket_create_new_server_wsi(context); - if (new_wsi == NULL) { - compatible_close(accept_fd); - break; - } - - new_wsi->sock = accept_fd; - - /* the transport is accepted... give him time to negotiate */ - libwebsocket_set_timeout(new_wsi, - PENDING_TIMEOUT_ESTABLISH_WITH_SERVER, - AWAITING_TIMEOUT); - - /* - * A new connection was accepted. Give the user a chance to - * set properties of the newly created wsi. There's no protocol - * selected yet so we issue this to protocols[0] - */ - - (context->protocols[0].callback)(context, new_wsi, - LWS_CALLBACK_SERVER_NEW_CLIENT_INSTANTIATED, NULL, NULL, 0); - - lws_libev_accept(context, new_wsi, accept_fd); - - if (!LWS_SSL_ENABLED(context)) { - lwsl_debug("accepted new conn port %u on fd=%d\n", - ntohs(cli_addr.sin_port), accept_fd); - - insert_wsi_socket_into_fds(context, new_wsi); - } - break; - - default: - break; - } - - if (lws_server_socket_service_ssl(context, &wsi, new_wsi, accept_fd, pollfd)) - goto fail; - - return 0; - -fail: - libwebsocket_close_and_free_session(context, wsi, - LWS_CLOSE_STATUS_NOSTATUS); - return 1; -} - - -static const char *err400[] = { - "Bad Request", - "Unauthorized", - "Payment Required", - "Forbidden", - "Not Found", - "Method Not Allowed", - "Not Acceptable", - "Proxy Auth Required", - "Request Timeout", - "Conflict", - "Gone", - "Length Required", - "Precondition Failed", - "Request Entity Too Large", - "Request URI too Long", - "Unsupported Media Type", - "Requested Range Not Satisfiable", - "Expectation Failed" -}; - -static const char *err500[] = { - "Internal Server Error", - "Not Implemented", - "Bad Gateway", - "Service Unavailable", - "Gateway Timeout", - "HTTP Version Not Supported" -}; - -/** - * libwebsockets_return_http_status() - Return simple http status - * @context: libwebsockets context - * @wsi: Websocket instance (available from user callback) - * @code: Status index, eg, 404 - * @html_body: User-readable HTML description, or NULL - * - * Helper to report HTTP errors back to the client cleanly and - * consistently - */ -LWS_VISIBLE int libwebsockets_return_http_status( - struct libwebsocket_context *context, struct libwebsocket *wsi, - unsigned int code, const char *html_body) -{ - int n, m; - const char *description = ""; - - if (!html_body) - html_body = ""; - - if (code >= 400 && code < (400 + ARRAY_SIZE(err400))) - description = err400[code - 400]; - if (code >= 500 && code < (500 + ARRAY_SIZE(err500))) - description = err500[code - 500]; - - n = sprintf((char *)context->service_buffer, - "HTTP/1.0 %u %s\x0d\x0a" - "Server: libwebsockets\x0d\x0a" - "Content-Type: text/html\x0d\x0a\x0d\x0a" - "

%u %s

%s", - code, description, code, description, html_body); - - lwsl_info((const char *)context->service_buffer); - - m = libwebsocket_write(wsi, context->service_buffer, n, LWS_WRITE_HTTP); - - return m; -} - -/** - * libwebsockets_serve_http_file() - Send a file back to the client using http - * @context: libwebsockets context - * @wsi: Websocket instance (available from user callback) - * @file: The file to issue over http - * @content_type: The http content type, eg, text/html - * @other_headers: NULL or pointer to \0-terminated other header string - * - * This function is intended to be called from the callback in response - * to http requests from the client. It allows the callback to issue - * local files down the http link in a single step. - * - * Returning <0 indicates error and the wsi should be closed. Returning - * >0 indicates the file was completely sent and the wsi should be closed. - * ==0 indicates the file transfer is started and needs more service later, - * the wsi should be left alone. - */ - -LWS_VISIBLE int libwebsockets_serve_http_file( - struct libwebsocket_context *context, - struct libwebsocket *wsi, const char *file, - const char *content_type, const char *other_headers) -{ - unsigned char *p = context->service_buffer; - int ret = 0; - int n; - - wsi->u.http.fd = lws_plat_open_file(file, &wsi->u.http.filelen); - - if (wsi->u.http.fd == LWS_INVALID_FILE) { - lwsl_err("Unable to open '%s'\n", file); - libwebsockets_return_http_status(context, wsi, - HTTP_STATUS_NOT_FOUND, NULL); - return -1; - } - - p += sprintf((char *)p, -"HTTP/1.0 200 OK\x0d\x0aServer: libwebsockets\x0d\x0a""Content-Type: %s\x0d\x0a", - content_type); - if (other_headers) { - n = strlen(other_headers); - memcpy(p, other_headers, n); - p += n; - } - p += sprintf((char *)p, - "Content-Length: %lu\x0d\x0a\x0d\x0a", wsi->u.http.filelen); - - ret = libwebsocket_write(wsi, context->service_buffer, - p - context->service_buffer, LWS_WRITE_HTTP); - if (ret != (p - context->service_buffer)) { - lwsl_err("_write returned %d from %d\n", ret, (p - context->service_buffer)); - return -1; - } - - wsi->u.http.filepos = 0; - wsi->state = WSI_STATE_HTTP_ISSUING_FILE; - - return libwebsockets_serve_http_file_fragment(context, wsi); -} - - -int libwebsocket_interpret_incoming_packet(struct libwebsocket *wsi, - unsigned char *buf, size_t len) -{ - size_t n = 0; - int m; - -#if 0 - lwsl_parser("received %d byte packet\n", (int)len); - lwsl_hexdump(buf, len); -#endif - - /* let the rx protocol state machine have as much as it needs */ - - while (n < len) { - /* - * we were accepting input but now we stopped doing so - */ - if (!(wsi->u.ws.rxflow_change_to & LWS_RXFLOW_ALLOW)) { - /* his RX is flowcontrolled, don't send remaining now */ - if (!wsi->u.ws.rxflow_buffer) { - /* a new rxflow, buffer it and warn caller */ - lwsl_info("new rxflow input buffer len %d\n", - len - n); - wsi->u.ws.rxflow_buffer = - (unsigned char *)malloc(len - n); - wsi->u.ws.rxflow_len = len - n; - wsi->u.ws.rxflow_pos = 0; - memcpy(wsi->u.ws.rxflow_buffer, - buf + n, len - n); - } else - /* rxflow while we were spilling prev rxflow */ - lwsl_info("stalling in existing rxflow buf\n"); - - return 1; - } - - /* account for what we're using in rxflow buffer */ - if (wsi->u.ws.rxflow_buffer) - wsi->u.ws.rxflow_pos++; - - /* process the byte */ - m = libwebsocket_rx_sm(wsi, buf[n++]); - if (m < 0) - return -1; - } - - return 0; -} - -LWS_VISIBLE void -lws_server_get_canonical_hostname(struct libwebsocket_context *context, - struct lws_context_creation_info *info) -{ - if (info->options & LWS_SERVER_OPTION_SKIP_SERVER_CANONICAL_NAME) - return; - - /* find canonical hostname */ - gethostname((char *)context->canonical_hostname, - sizeof(context->canonical_hostname) - 1); - - lwsl_notice(" canonical_hostname = %s\n", context->canonical_hostname); -} \ No newline at end of file diff --git a/core/deps/libwebsocket/service.c b/core/deps/libwebsocket/service.c deleted file mode 100644 index 409c2d231..000000000 --- a/core/deps/libwebsocket/service.c +++ /dev/null @@ -1,514 +0,0 @@ -/* - * libwebsockets - small server side websockets and web server implementation - * - * Copyright (C) 2010-2014 Andy Green - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation: - * version 2.1 of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301 USA - */ - -#include "private-libwebsockets.h" - -int -lws_handle_POLLOUT_event(struct libwebsocket_context *context, - struct libwebsocket *wsi, struct libwebsocket_pollfd *pollfd) -{ - int n; - struct lws_tokens eff_buf; - int ret; - int m; - int handled = 0; - - /* pending truncated sends have uber priority */ - - if (wsi->truncated_send_len) { - if (lws_issue_raw(wsi, wsi->truncated_send_malloc + - wsi->truncated_send_offset, - wsi->truncated_send_len) < 0) { - lwsl_info("lws_handle_POLLOUT_event signalling to close\n"); - return -1; - } - /* leave POLLOUT active either way */ - return 0; - } else - if (wsi->state == WSI_STATE_FLUSHING_STORED_SEND_BEFORE_CLOSE) { - lwsl_info("***** %x signalling to close in POLLOUT handler\n", wsi); - return -1; /* retry closing now */ - } - - - m = lws_ext_callback_for_each_active(wsi, LWS_EXT_CALLBACK_IS_WRITEABLE, - NULL, 0); - if (handled == 1) - goto notify_action; -#ifndef LWS_NO_EXTENSIONS - if (!wsi->extension_data_pending || handled == 2) - goto user_service; -#endif - /* - * check in on the active extensions, see if they - * had pending stuff to spill... they need to get the - * first look-in otherwise sequence will be disordered - * - * NULL, zero-length eff_buf means just spill pending - */ - - ret = 1; - while (ret == 1) { - - /* default to nobody has more to spill */ - - ret = 0; - eff_buf.token = NULL; - eff_buf.token_len = 0; - - /* give every extension a chance to spill */ - - m = lws_ext_callback_for_each_active(wsi, - LWS_EXT_CALLBACK_PACKET_TX_PRESEND, - &eff_buf, 0); - if (m < 0) { - lwsl_err("ext reports fatal error\n"); - return -1; - } - if (m) - /* - * at least one extension told us he has more - * to spill, so we will go around again after - */ - ret = 1; - - /* assuming they gave us something to send, send it */ - - if (eff_buf.token_len) { - n = lws_issue_raw(wsi, (unsigned char *)eff_buf.token, - eff_buf.token_len); - if (n < 0) { - lwsl_info("closing from POLLOUT spill\n"); - return -1; - } - /* - * Keep amount spilled small to minimize chance of this - */ - if (n != eff_buf.token_len) { - lwsl_err("Unable to spill ext %d vs %s\n", - eff_buf.token_len, n); - return -1; - } - } else - continue; - - /* no extension has more to spill */ - - if (!ret) - continue; - - /* - * There's more to spill from an extension, but we just sent - * something... did that leave the pipe choked? - */ - - if (!lws_send_pipe_choked(wsi)) - /* no we could add more */ - continue; - - lwsl_info("choked in POLLOUT service\n"); - - /* - * Yes, he's choked. Leave the POLLOUT masked on so we will - * come back here when he is unchoked. Don't call the user - * callback to enforce ordering of spilling, he'll get called - * when we come back here and there's nothing more to spill. - */ - - return 0; - } -#ifndef LWS_NO_EXTENSIONS - wsi->extension_data_pending = 0; - -user_service: -#endif - /* one shot */ - - if (pollfd) { - if (lws_change_pollfd(wsi, LWS_POLLOUT, 0)) - return 1; - - lws_libev_io(context, wsi, LWS_EV_STOP | LWS_EV_WRITE); - } - -notify_action: - if (wsi->mode == LWS_CONNMODE_WS_CLIENT) - n = LWS_CALLBACK_CLIENT_WRITEABLE; - else - n = LWS_CALLBACK_SERVER_WRITEABLE; - - return user_callback_handle_rxflow(wsi->protocol->callback, context, - wsi, (enum libwebsocket_callback_reasons) n, - wsi->user_space, NULL, 0); -} - - - -int -libwebsocket_service_timeout_check(struct libwebsocket_context *context, - struct libwebsocket *wsi, unsigned int sec) -{ - /* - * if extensions want in on it (eg, we are a mux parent) - * give them a chance to service child timeouts - */ - if (lws_ext_callback_for_each_active(wsi, LWS_EXT_CALLBACK_1HZ, NULL, sec) < 0) - return 0; - - if (!wsi->pending_timeout) - return 0; - - /* - * if we went beyond the allowed time, kill the - * connection - */ - if (sec > wsi->pending_timeout_limit) { - lwsl_info("TIMEDOUT WAITING on %d\n", wsi->pending_timeout); - libwebsocket_close_and_free_session(context, - wsi, LWS_CLOSE_STATUS_NOSTATUS); - return 1; - } - - return 0; -} - -/** - * libwebsocket_service_fd() - Service polled socket with something waiting - * @context: Websocket context - * @pollfd: The pollfd entry describing the socket fd and which events - * happened. - * - * This function takes a pollfd that has POLLIN or POLLOUT activity and - * services it according to the state of the associated - * struct libwebsocket. - * - * The one call deals with all "service" that might happen on a socket - * including listen accepts, http files as well as websocket protocol. - * - * If a pollfd says it has something, you can just pass it to - * libwebsocket_serice_fd() whether it is a socket handled by lws or not. - * If it sees it is a lws socket, the traffic will be handled and - * pollfd->revents will be zeroed now. - * - * If the socket is foreign to lws, it leaves revents alone. So you can - * see if you should service yourself by checking the pollfd revents - * after letting lws try to service it. - */ - -LWS_VISIBLE int -libwebsocket_service_fd(struct libwebsocket_context *context, - struct libwebsocket_pollfd *pollfd) -{ - struct libwebsocket *wsi; - int n; - int m; - int listen_socket_fds_index = 0; - time_t now; - int timed_out = 0; - int our_fd = 0; - char draining_flow = 0; - int more; - struct lws_tokens eff_buf; - - if (context->listen_service_fd) - listen_socket_fds_index = context->lws_lookup[ - context->listen_service_fd]->position_in_fds_table; - - /* - * you can call us with pollfd = NULL to just allow the once-per-second - * global timeout checks; if less than a second since the last check - * it returns immediately then. - */ - - time(&now); - - /* TODO: if using libev, we should probably use timeout watchers... */ - if (context->last_timeout_check_s != now) { - context->last_timeout_check_s = now; - - lws_plat_service_periodic(context); - - /* global timeout check once per second */ - - if (pollfd) - our_fd = pollfd->fd; - - for (n = 0; n < context->fds_count; n++) { - m = context->fds[n].fd; - wsi = context->lws_lookup[m]; - if (!wsi) - continue; - - if (libwebsocket_service_timeout_check(context, wsi, now)) - /* he did time out... */ - if (m == our_fd) { - /* it was the guy we came to service! */ - timed_out = 1; - /* mark as handled */ - pollfd->revents = 0; - } - } - } - - /* the socket we came to service timed out, nothing to do */ - if (timed_out) - return 0; - - /* just here for timeout management? */ - if (pollfd == NULL) - return 0; - - /* no, here to service a socket descriptor */ - wsi = context->lws_lookup[pollfd->fd]; - if (wsi == NULL) - /* not lws connection ... leave revents alone and return */ - return 0; - - /* - * so that caller can tell we handled, past here we need to - * zero down pollfd->revents after handling - */ - - /* - * deal with listen service piggybacking - * every listen_service_modulo services of other fds, we - * sneak one in to service the listen socket if there's anything waiting - * - * To handle connection storms, as found in ab, if we previously saw a - * pending connection here, it causes us to check again next time. - */ - - if (context->listen_service_fd && pollfd != - &context->fds[listen_socket_fds_index]) { - context->listen_service_count++; - if (context->listen_service_extraseen || - context->listen_service_count == - context->listen_service_modulo) { - context->listen_service_count = 0; - m = 1; - if (context->listen_service_extraseen > 5) - m = 2; - while (m--) { - /* - * even with extpoll, we prepared this - * internal fds for listen - */ - n = lws_poll_listen_fd(&context->fds[listen_socket_fds_index]); - if (n > 0) { /* there's a conn waiting for us */ - libwebsocket_service_fd(context, - &context-> - fds[listen_socket_fds_index]); - context->listen_service_extraseen++; - } else { - if (context->listen_service_extraseen) - context-> - listen_service_extraseen--; - break; - } - } - } - - } - - /* handle session socket closed */ - - if ((!(pollfd->revents & LWS_POLLIN)) && - (pollfd->revents & LWS_POLLHUP)) { - - lwsl_debug("Session Socket %p (fd=%d) dead\n", - (void *)wsi, pollfd->fd); - - goto close_and_handled; - } - - /* okay, what we came here to do... */ - - switch (wsi->mode) { - case LWS_CONNMODE_HTTP_SERVING: - case LWS_CONNMODE_HTTP_SERVING_ACCEPTED: - case LWS_CONNMODE_SERVER_LISTENER: - case LWS_CONNMODE_SSL_ACK_PENDING: - n = lws_server_socket_service(context, wsi, pollfd); - if (n < 0) - goto close_and_handled; - goto handled; - - case LWS_CONNMODE_WS_SERVING: - case LWS_CONNMODE_WS_CLIENT: - - /* the guy requested a callback when it was OK to write */ - - if ((pollfd->revents & LWS_POLLOUT) && - (wsi->state == WSI_STATE_ESTABLISHED || - wsi->state == WSI_STATE_FLUSHING_STORED_SEND_BEFORE_CLOSE) && - lws_handle_POLLOUT_event(context, wsi, pollfd)) { - lwsl_info("libwebsocket_service_fd: closing\n"); - goto close_and_handled; - } - - if (wsi->u.ws.rxflow_buffer && - (wsi->u.ws.rxflow_change_to & LWS_RXFLOW_ALLOW)) { - lwsl_info("draining rxflow\n"); - /* well, drain it */ - eff_buf.token = (char *)wsi->u.ws.rxflow_buffer + - wsi->u.ws.rxflow_pos; - eff_buf.token_len = wsi->u.ws.rxflow_len - - wsi->u.ws.rxflow_pos; - draining_flow = 1; - goto drain; - } - - /* any incoming data ready? */ - - if (!(pollfd->revents & LWS_POLLIN)) - break; - -read_pending: - eff_buf.token_len = lws_ssl_capable_read(wsi, - context->service_buffer, - sizeof(context->service_buffer)); - switch (eff_buf.token_len) { - case 0: - lwsl_info("service_fd: closing due to 0 length read\n"); - goto close_and_handled; - case LWS_SSL_CAPABLE_ERROR: - n = 0; - goto handled; - case LWS_SSL_CAPABLE_MORE_SERVICE: - goto close_and_handled; - } - - /* - * give any active extensions a chance to munge the buffer - * before parse. We pass in a pointer to an lws_tokens struct - * prepared with the default buffer and content length that's in - * there. Rather than rewrite the default buffer, extensions - * that expect to grow the buffer can adapt .token to - * point to their own per-connection buffer in the extension - * user allocation. By default with no extensions or no - * extension callback handling, just the normal input buffer is - * used then so it is efficient. - */ - - eff_buf.token = (char *)context->service_buffer; -drain: - - do { - - more = 0; - - m = lws_ext_callback_for_each_active(wsi, - LWS_EXT_CALLBACK_PACKET_RX_PREPARSE, &eff_buf, 0); - if (m < 0) - goto close_and_handled; - if (m) - more = 1; - - /* service incoming data */ - - if (eff_buf.token_len) { - n = libwebsocket_read(context, wsi, - (unsigned char *)eff_buf.token, - eff_buf.token_len); - if (n < 0) { - /* we closed wsi */ - n = 0; - goto handled; - } - } - - eff_buf.token = NULL; - eff_buf.token_len = 0; - } while (more); - - if (draining_flow && wsi->u.ws.rxflow_buffer && - wsi->u.ws.rxflow_pos == wsi->u.ws.rxflow_len) { - lwsl_info("flow buffer: drained\n"); - free(wsi->u.ws.rxflow_buffer); - wsi->u.ws.rxflow_buffer = NULL; - /* having drained the rxflow buffer, can rearm POLLIN */ - n = _libwebsocket_rx_flow_control(wsi); /* n ignored, needed for NO_SERVER case */ - } - - if (lws_ssl_pending(wsi)) - goto read_pending; - break; - - default: -#ifdef LWS_NO_CLIENT - break; -#else - n = lws_client_socket_service(context, wsi, pollfd); - goto handled; -#endif - } - - n = 0; - goto handled; - -close_and_handled: - libwebsocket_close_and_free_session(context, wsi, - LWS_CLOSE_STATUS_NOSTATUS); - n = 1; - -handled: - pollfd->revents = 0; - return n; -} - -/** - * libwebsocket_service() - Service any pending websocket activity - * @context: Websocket context - * @timeout_ms: Timeout for poll; 0 means return immediately if nothing needed - * service otherwise block and service immediately, returning - * after the timeout if nothing needed service. - * - * This function deals with any pending websocket traffic, for three - * kinds of event. It handles these events on both server and client - * types of connection the same. - * - * 1) Accept new connections to our context's server - * - * 2) Call the receive callback for incoming frame data received by - * server or client connections. - * - * You need to call this service function periodically to all the above - * functions to happen; if your application is single-threaded you can - * just call it in your main event loop. - * - * Alternatively you can fork a new process that asynchronously handles - * calling this service in a loop. In that case you are happy if this - * call blocks your thread until it needs to take care of something and - * would call it with a large nonzero timeout. Your loop then takes no - * CPU while there is nothing happening. - * - * If you are calling it in a single-threaded app, you don't want it to - * wait around blocking other things in your loop from happening, so you - * would call it with a timeout_ms of 0, so it returns immediately if - * nothing is pending, or as soon as it services whatever was pending. - */ - -LWS_VISIBLE int -libwebsocket_service(struct libwebsocket_context *context, int timeout_ms) -{ - return lws_plat_service(context, timeout_ms); -} - diff --git a/core/deps/libwebsocket/sha-1.c b/core/deps/libwebsocket/sha-1.c deleted file mode 100644 index f29b2c3a6..000000000 --- a/core/deps/libwebsocket/sha-1.c +++ /dev/null @@ -1,299 +0,0 @@ -/* - * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the project nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ -/* - * FIPS pub 180-1: Secure Hash Algorithm (SHA-1) - * based on: http://csrc.nist.gov/fips/fip180-1.txt - * implemented by Jun-ichiro itojun Itoh - */ - -#include "private-libwebsockets.h" - -#ifdef HAVE_SYS_TYPES_H -#include -#endif - -struct sha1_ctxt { - union { - unsigned char b8[20]; - unsigned int b32[5]; - } h; - union { - unsigned char b8[8]; - u_int64_t b64[1]; - } c; - union { - unsigned char b8[64]; - unsigned int b32[16]; - } m; - unsigned char count; -}; - -/* sanity check */ -#if !defined(BYTE_ORDER) || !defined(LITTLE_ENDIAN) || !defined(BIG_ENDIAN) -# define unsupported 1 -#elif BYTE_ORDER != BIG_ENDIAN -# if BYTE_ORDER != LITTLE_ENDIAN -# define unsupported 1 -# endif -#endif - -#ifndef unsupported - -/* constant table */ -static const unsigned int _K[] = - { 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6 }; -#define K(t) _K[(t) / 20] - -#define F0(b, c, d) (((b) & (c)) | ((~(b)) & (d))) -#define F1(b, c, d) (((b) ^ (c)) ^ (d)) -#define F2(b, c, d) (((b) & (c)) | ((b) & (d)) | ((c) & (d))) -#define F3(b, c, d) (((b) ^ (c)) ^ (d)) - -#define S(n, x) (((x) << (n)) | ((x) >> (32 - n))) - -#define H(n) (ctxt->h.b32[(n)]) -#define COUNT (ctxt->count) -#define BCOUNT (ctxt->c.b64[0] / 8) -#define W(n) (ctxt->m.b32[(n)]) - -#define PUTBYTE(x) { \ - ctxt->m.b8[(COUNT % 64)] = (x); \ - COUNT++; \ - COUNT %= 64; \ - ctxt->c.b64[0] += 8; \ - if (COUNT % 64 == 0) \ - sha1_step(ctxt); \ - } - -#define PUTPAD(x) { \ - ctxt->m.b8[(COUNT % 64)] = (x); \ - COUNT++; \ - COUNT %= 64; \ - if (COUNT % 64 == 0) \ - sha1_step(ctxt); \ - } - -static void -sha1_step(struct sha1_ctxt *ctxt) -{ - unsigned int a, b, c, d, e, tmp; - size_t t, s; - -#if BYTE_ORDER == LITTLE_ENDIAN - struct sha1_ctxt tctxt; - - memcpy(&tctxt.m.b8[0], &ctxt->m.b8[0], 64); - ctxt->m.b8[0] = tctxt.m.b8[3]; ctxt->m.b8[1] = tctxt.m.b8[2]; - ctxt->m.b8[2] = tctxt.m.b8[1]; ctxt->m.b8[3] = tctxt.m.b8[0]; - ctxt->m.b8[4] = tctxt.m.b8[7]; ctxt->m.b8[5] = tctxt.m.b8[6]; - ctxt->m.b8[6] = tctxt.m.b8[5]; ctxt->m.b8[7] = tctxt.m.b8[4]; - ctxt->m.b8[8] = tctxt.m.b8[11]; ctxt->m.b8[9] = tctxt.m.b8[10]; - ctxt->m.b8[10] = tctxt.m.b8[9]; ctxt->m.b8[11] = tctxt.m.b8[8]; - ctxt->m.b8[12] = tctxt.m.b8[15]; ctxt->m.b8[13] = tctxt.m.b8[14]; - ctxt->m.b8[14] = tctxt.m.b8[13]; ctxt->m.b8[15] = tctxt.m.b8[12]; - ctxt->m.b8[16] = tctxt.m.b8[19]; ctxt->m.b8[17] = tctxt.m.b8[18]; - ctxt->m.b8[18] = tctxt.m.b8[17]; ctxt->m.b8[19] = tctxt.m.b8[16]; - ctxt->m.b8[20] = tctxt.m.b8[23]; ctxt->m.b8[21] = tctxt.m.b8[22]; - ctxt->m.b8[22] = tctxt.m.b8[21]; ctxt->m.b8[23] = tctxt.m.b8[20]; - ctxt->m.b8[24] = tctxt.m.b8[27]; ctxt->m.b8[25] = tctxt.m.b8[26]; - ctxt->m.b8[26] = tctxt.m.b8[25]; ctxt->m.b8[27] = tctxt.m.b8[24]; - ctxt->m.b8[28] = tctxt.m.b8[31]; ctxt->m.b8[29] = tctxt.m.b8[30]; - ctxt->m.b8[30] = tctxt.m.b8[29]; ctxt->m.b8[31] = tctxt.m.b8[28]; - ctxt->m.b8[32] = tctxt.m.b8[35]; ctxt->m.b8[33] = tctxt.m.b8[34]; - ctxt->m.b8[34] = tctxt.m.b8[33]; ctxt->m.b8[35] = tctxt.m.b8[32]; - ctxt->m.b8[36] = tctxt.m.b8[39]; ctxt->m.b8[37] = tctxt.m.b8[38]; - ctxt->m.b8[38] = tctxt.m.b8[37]; ctxt->m.b8[39] = tctxt.m.b8[36]; - ctxt->m.b8[40] = tctxt.m.b8[43]; ctxt->m.b8[41] = tctxt.m.b8[42]; - ctxt->m.b8[42] = tctxt.m.b8[41]; ctxt->m.b8[43] = tctxt.m.b8[40]; - ctxt->m.b8[44] = tctxt.m.b8[47]; ctxt->m.b8[45] = tctxt.m.b8[46]; - ctxt->m.b8[46] = tctxt.m.b8[45]; ctxt->m.b8[47] = tctxt.m.b8[44]; - ctxt->m.b8[48] = tctxt.m.b8[51]; ctxt->m.b8[49] = tctxt.m.b8[50]; - ctxt->m.b8[50] = tctxt.m.b8[49]; ctxt->m.b8[51] = tctxt.m.b8[48]; - ctxt->m.b8[52] = tctxt.m.b8[55]; ctxt->m.b8[53] = tctxt.m.b8[54]; - ctxt->m.b8[54] = tctxt.m.b8[53]; ctxt->m.b8[55] = tctxt.m.b8[52]; - ctxt->m.b8[56] = tctxt.m.b8[59]; ctxt->m.b8[57] = tctxt.m.b8[58]; - ctxt->m.b8[58] = tctxt.m.b8[57]; ctxt->m.b8[59] = tctxt.m.b8[56]; - ctxt->m.b8[60] = tctxt.m.b8[63]; ctxt->m.b8[61] = tctxt.m.b8[62]; - ctxt->m.b8[62] = tctxt.m.b8[61]; ctxt->m.b8[63] = tctxt.m.b8[60]; -#endif - - a = H(0); b = H(1); c = H(2); d = H(3); e = H(4); - - for (t = 0; t < 20; t++) { - s = t & 0x0f; - if (t >= 16) - W(s) = S(1, W((s+13) & 0x0f) ^ W((s+8) & 0x0f) ^ - W((s+2) & 0x0f) ^ W(s)); - - tmp = S(5, a) + F0(b, c, d) + e + W(s) + K(t); - e = d; d = c; c = S(30, b); b = a; a = tmp; - } - for (t = 20; t < 40; t++) { - s = t & 0x0f; - W(s) = S(1, W((s+13) & 0x0f) ^ W((s+8) & 0x0f) ^ - W((s+2) & 0x0f) ^ W(s)); - tmp = S(5, a) + F1(b, c, d) + e + W(s) + K(t); - e = d; d = c; c = S(30, b); b = a; a = tmp; - } - for (t = 40; t < 60; t++) { - s = t & 0x0f; - W(s) = S(1, W((s+13) & 0x0f) ^ W((s+8) & 0x0f) ^ - W((s+2) & 0x0f) ^ W(s)); - tmp = S(5, a) + F2(b, c, d) + e + W(s) + K(t); - e = d; d = c; c = S(30, b); b = a; a = tmp; - } - for (t = 60; t < 80; t++) { - s = t & 0x0f; - W(s) = S(1, W((s+13) & 0x0f) ^ W((s+8) & 0x0f) ^ - W((s+2) & 0x0f) ^ W(s)); - tmp = S(5, a) + F3(b, c, d) + e + W(s) + K(t); - e = d; d = c; c = S(30, b); b = a; a = tmp; - } - - H(0) = H(0) + a; - H(1) = H(1) + b; - H(2) = H(2) + c; - H(3) = H(3) + d; - H(4) = H(4) + e; - - bzero(&ctxt->m.b8[0], 64); -} - -/*------------------------------------------------------------*/ - -static void -sha1_init(struct sha1_ctxt *ctxt) -{ - bzero(ctxt, sizeof(struct sha1_ctxt)); - H(0) = 0x67452301; - H(1) = 0xefcdab89; - H(2) = 0x98badcfe; - H(3) = 0x10325476; - H(4) = 0xc3d2e1f0; -} - -void -sha1_pad(struct sha1_ctxt *ctxt) -{ - size_t padlen; /*pad length in bytes*/ - size_t padstart; - - PUTPAD(0x80); - - padstart = COUNT % 64; - padlen = 64 - padstart; - if (padlen < 8) { - bzero(&ctxt->m.b8[padstart], padlen); - COUNT += padlen; - COUNT %= 64; - sha1_step(ctxt); - padstart = COUNT % 64; /* should be 0 */ - padlen = 64 - padstart; /* should be 64 */ - } - bzero(&ctxt->m.b8[padstart], padlen - 8); - COUNT += (padlen - 8); - COUNT %= 64; -#if BYTE_ORDER == BIG_ENDIAN - PUTPAD(ctxt->c.b8[0]); PUTPAD(ctxt->c.b8[1]); - PUTPAD(ctxt->c.b8[2]); PUTPAD(ctxt->c.b8[3]); - PUTPAD(ctxt->c.b8[4]); PUTPAD(ctxt->c.b8[5]); - PUTPAD(ctxt->c.b8[6]); PUTPAD(ctxt->c.b8[7]); -#else - PUTPAD(ctxt->c.b8[7]); PUTPAD(ctxt->c.b8[6]); - PUTPAD(ctxt->c.b8[5]); PUTPAD(ctxt->c.b8[4]); - PUTPAD(ctxt->c.b8[3]); PUTPAD(ctxt->c.b8[2]); - PUTPAD(ctxt->c.b8[1]); PUTPAD(ctxt->c.b8[0]); -#endif -} - -void -sha1_loop(struct sha1_ctxt *ctxt, const unsigned char *input, size_t len) -{ - size_t gaplen; - size_t gapstart; - size_t off; - size_t copysiz; - - off = 0; - - while (off < len) { - gapstart = COUNT % 64; - gaplen = 64 - gapstart; - - copysiz = (gaplen < len - off) ? gaplen : len - off; - memcpy(&ctxt->m.b8[gapstart], &input[off], copysiz); - COUNT += copysiz; - COUNT %= 64; - ctxt->c.b64[0] += copysiz * 8; - if (COUNT % 64 == 0) - sha1_step(ctxt); - off += copysiz; - } -} - -void -sha1_result(struct sha1_ctxt *ctxt, void *digest0) -{ - unsigned char *digest; - - digest = (unsigned char *)digest0; - sha1_pad(ctxt); -#if BYTE_ORDER == BIG_ENDIAN - memcpy(digest, &ctxt->h.b8[0], 20); -#else - digest[0] = ctxt->h.b8[3]; digest[1] = ctxt->h.b8[2]; - digest[2] = ctxt->h.b8[1]; digest[3] = ctxt->h.b8[0]; - digest[4] = ctxt->h.b8[7]; digest[5] = ctxt->h.b8[6]; - digest[6] = ctxt->h.b8[5]; digest[7] = ctxt->h.b8[4]; - digest[8] = ctxt->h.b8[11]; digest[9] = ctxt->h.b8[10]; - digest[10] = ctxt->h.b8[9]; digest[11] = ctxt->h.b8[8]; - digest[12] = ctxt->h.b8[15]; digest[13] = ctxt->h.b8[14]; - digest[14] = ctxt->h.b8[13]; digest[15] = ctxt->h.b8[12]; - digest[16] = ctxt->h.b8[19]; digest[17] = ctxt->h.b8[18]; - digest[18] = ctxt->h.b8[17]; digest[19] = ctxt->h.b8[16]; -#endif -} - -/* - * This should look and work like the libcrypto implementation - */ - -unsigned char * -SHA1(const unsigned char *d, size_t n, unsigned char *md) -{ - struct sha1_ctxt ctx; - - sha1_init(&ctx); - sha1_loop(&ctx, d, n); - sha1_result(&ctx, (void *)md); - - return md; -} - -#endif /*unsupported*/ diff --git a/core/webui/server.cpp b/core/webui/server.cpp deleted file mode 100644 index e275ad867..000000000 --- a/core/webui/server.cpp +++ /dev/null @@ -1,877 +0,0 @@ -/* - * libwebsockets-test-server - libwebsockets test implementation - * - * Copyright (C) 2010-2011 Andy Green - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation: - * version 2.1 of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301 USA - */ -#ifdef CMAKE_BUILD -#include "lws_config.h" -#endif - -#include -#include -#include -#include -#include -#include -#include - -#ifdef _WIN32 -#include -#ifdef EXTERNAL_POLL -#define poll WSAPoll -#endif -#else -#include -#include -#include -#endif - -#include "deps/libwebsocket/libwebsockets.h" -#include "oslib/oslib.h" - -static int close_testing; -int max_poll_elements; - -struct pollfd *pollfds; -int *fd_lookup; -int count_pollfds; -static volatile int force_exit = 0; -static struct libwebsocket_context *context; - -/* - * This demo server shows how to use libwebsockets for one or more - * websocket protocols in the same server - * - * It defines the following websocket protocols: - * - * dumb-increment-protocol: once the socket is opened, an incrementing - * ascii string is sent down it every 50ms. - * If you send "reset\n" on the websocket, then - * the incrementing number is reset to 0. - * - * lws-mirror-protocol: copies any received packet to every connection also - * using this protocol, including the sender - */ - -enum demo_protocols { - /* always first */ - PROTOCOL_HTTP = 0, - - PROTOCOL_DUMB_INCREMENT, - PROTOCOL_LWS_MIRROR, - - /* always last */ - DEMO_PROTOCOL_COUNT -}; - -#define WEBUI_PATH get_writable_data_path("/webui") - -/* - * We take a strict whitelist approach to stop ../ attacks - */ - -struct serveable { - const char *urlpath; - const char *mimetype; -}; - -struct per_session_data__http { - int fd; -}; - -/* - * this is just an example of parsing handshake headers, you don't need this - * in your code unless you will filter allowing connections by the header - * content - */ - -static void -dump_handshake_info(struct libwebsocket *wsi) -{ - int n; - static const char *token_names[] = { - /*[WSI_TOKEN_GET_URI] =*/ "GET URI", - /*[WSI_TOKEN_POST_URI] =*/ "POST URI", - /*[WSI_TOKEN_HOST] =*/ "Host", - /*[WSI_TOKEN_CONNECTION] =*/ "Connection", - /*[WSI_TOKEN_KEY1] =*/ "key 1", - /*[WSI_TOKEN_KEY2] =*/ "key 2", - /*[WSI_TOKEN_PROTOCOL] =*/ "Protocol", - /*[WSI_TOKEN_UPGRADE] =*/ "Upgrade", - /*[WSI_TOKEN_ORIGIN] =*/ "Origin", - /*[WSI_TOKEN_DRAFT] =*/ "Draft", - /*[WSI_TOKEN_CHALLENGE] =*/ "Challenge", - - /* new for 04 */ - /*[WSI_TOKEN_KEY] =*/ "Key", - /*[WSI_TOKEN_VERSION] =*/ "Version", - /*[WSI_TOKEN_SWORIGIN] =*/ "Sworigin", - - /* new for 05 */ - /*[WSI_TOKEN_EXTENSIONS] =*/ "Extensions", - - /* client receives these */ - /*[WSI_TOKEN_ACCEPT] =*/ "Accept", - /*[WSI_TOKEN_NONCE] =*/ "Nonce", - /*[WSI_TOKEN_HTTP] =*/ "Http", - - "Accept:", - "If-Modified-Since:", - "Accept-Encoding:", - "Accept-Language:", - "Pragma:", - "Cache-Control:", - "Authorization:", - "Cookie:", - "Content-Length:", - "Content-Type:", - "Date:", - "Range:", - "Referer:", - "Uri-Args:", - - /*[WSI_TOKEN_MUXURL] =*/ "MuxURL", - }; - char buf[256]; - - for (n = 0; n < sizeof(token_names) / sizeof(token_names[0]); n++) { - if (!lws_hdr_total_length(wsi, (lws_token_indexes)n)) - continue; - - lws_hdr_copy(wsi, buf, sizeof buf, (lws_token_indexes)n); - - fprintf(stderr, " %s = %s\n", token_names[n], buf); - } -} - -const char * get_mimetype(const char *file) -{ - int n = strlen(file); - - if (n < 5) - return NULL; - - if (!strcmp(&file[n - 4], ".ico")) - return "image/x-icon"; - - if (!strcmp(&file[n - 4], ".png")) - return "image/png"; - - if (!strcmp(&file[n - 5], ".html")) - return "text/html"; - - return NULL; -} - -/* this protocol server (always the first one) just knows how to do HTTP */ - -static int callback_http(struct libwebsocket_context *context, - struct libwebsocket *wsi, - enum libwebsocket_callback_reasons reason, void *user, - void *in, size_t len) -{ -#if 0 - char client_name[128]; - char client_ip[128]; -#endif - char buf[256]; - char leaf_path[1024]; - char b64[64]; - struct timeval tv; - int n, m; - unsigned char *p; - char *other_headers = 0; - static unsigned char buffer[4096]; - struct stat stat_buf; - struct per_session_data__http *pss = - (struct per_session_data__http *)user; - const char *mimetype; -#ifdef EXTERNAL_POLL - struct libwebsocket_pollargs *pa = (struct libwebsocket_pollargs *)in; -#endif - - const string path = WEBUI_PATH; - - const char* resource_path = path.c_str(); - - switch (reason) { - case LWS_CALLBACK_HTTP: - - dump_handshake_info(wsi); - - if (len < 1) { - libwebsockets_return_http_status(context, wsi, - HTTP_STATUS_BAD_REQUEST, NULL); - return -1; - } - - /* this server has no concept of directories */ - if (strchr((const char *)in + 1, '/')) { - libwebsockets_return_http_status(context, wsi, - HTTP_STATUS_FORBIDDEN, NULL); - return -1; - } - - /* if a legal POST URL, let it continue and accept data */ - if (lws_hdr_total_length(wsi, WSI_TOKEN_POST_URI)) - return 0; - - /* check for the "send a big file by hand" example case */ - - if (!strcmp((const char *)in, "/leaf.jpg")) { - if (strlen(resource_path) > sizeof(leaf_path) - 10) - return -1; - sprintf(leaf_path, "%s/leaf.jpg", resource_path); - - /* well, let's demonstrate how to send the hard way */ - - p = buffer; - -#ifdef WIN32 - pss->fd = open(leaf_path, O_RDONLY | _O_BINARY); -#else - pss->fd = open(leaf_path, O_RDONLY); -#endif - - if (pss->fd < 0) - return -1; - - fstat(pss->fd, &stat_buf); - - /* - * we will send a big jpeg file, but it could be - * anything. Set the Content-Type: appropriately - * so the browser knows what to do with it. - */ - - p += sprintf((char *)p, - "HTTP/1.0 200 OK\x0d\x0a" - "Server: libwebsockets\x0d\x0a" - "Content-Type: image/jpeg\x0d\x0a" - "Content-Length: %u\x0d\x0a\x0d\x0a", - (unsigned int)stat_buf.st_size); - - /* - * send the http headers... - * this won't block since it's the first payload sent - * on the connection since it was established - * (too small for partial) - */ - - n = libwebsocket_write(wsi, buffer, - p - buffer, LWS_WRITE_HTTP); - - if (n < 0) { - close(pss->fd); - return -1; - } - /* - * book us a LWS_CALLBACK_HTTP_WRITEABLE callback - */ - libwebsocket_callback_on_writable(context, wsi); - break; - } - - /* if not, send a file the easy way */ - - // FIXME: Data loss if buffer is too small - strncpy(buf, resource_path, sizeof(buf)); - buf[sizeof(buf) - 1] = '\0'; - - if (strcmp((const char*)in, "/")) { - if (*((const char *)in) != '/') - strcat(buf, "/"); - strncat(buf, (const char*)in, sizeof(buf) - strlen(resource_path)); - } else /* default file to serve */ - strcat(buf, "/debugger.html"); - buf[sizeof(buf) - 1] = '\0'; - - /* refuse to serve files we don't understand */ - mimetype = get_mimetype(buf); - if (!mimetype) { - lwsl_err("Unknown mimetype for %s\n", buf); - libwebsockets_return_http_status(context, wsi, - HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE, NULL); - return -1; - } - - if (libwebsockets_serve_http_file(context, wsi, buf, - mimetype, other_headers)) - return -1; /* through completion or error, close the socket */ - - /* - * notice that the sending of the file completes asynchronously, - * we'll get a LWS_CALLBACK_HTTP_FILE_COMPLETION callback when - * it's done - */ - - break; - - case LWS_CALLBACK_HTTP_BODY: - strncpy(buf, (const char*)in, 20); - buf[20] = '\0'; - if (len < 20) - buf[len] = '\0'; - - lwsl_notice("LWS_CALLBACK_HTTP_BODY: %s... len %d\n", - (const char *)buf, (int)len); - - break; - - case LWS_CALLBACK_HTTP_BODY_COMPLETION: - lwsl_notice("LWS_CALLBACK_HTTP_BODY_COMPLETION\n"); - /* the whole of the sent body arried, close the connection */ - libwebsockets_return_http_status(context, wsi, - HTTP_STATUS_OK, NULL); - - return -1; - - case LWS_CALLBACK_HTTP_FILE_COMPLETION: -// lwsl_info("LWS_CALLBACK_HTTP_FILE_COMPLETION seen\n"); - /* kill the connection after we sent one file */ - return -1; - - case LWS_CALLBACK_HTTP_WRITEABLE: - /* - * we can send more of whatever it is we were sending - */ - - do { - n = read(pss->fd, buffer, sizeof buffer); - /* problem reading, close conn */ - if (n < 0) - goto bail; - /* sent it all, close conn */ - if (n == 0) - goto flush_bail; - /* - * because it's HTTP and not websocket, don't need to take - * care about pre and postamble - */ - m = libwebsocket_write(wsi, buffer, n, LWS_WRITE_HTTP); - if (m < 0) - /* write failed, close conn */ - goto bail; - if (m != n) - /* partial write, adjust */ - lseek(pss->fd, m - n, SEEK_CUR); - - if (m) /* while still active, extend timeout */ - libwebsocket_set_timeout(wsi, - PENDING_TIMEOUT_HTTP_CONTENT, 5); - - } while (!lws_send_pipe_choked(wsi)); - libwebsocket_callback_on_writable(context, wsi); - break; -flush_bail: - /* true if still partial pending */ - if (lws_send_pipe_choked(wsi)) { - libwebsocket_callback_on_writable(context, wsi); - break; - } - -bail: - close(pss->fd); - return -1; - - /* - * callback for confirming to continue with client IP appear in - * protocol 0 callback since no websocket protocol has been agreed - * yet. You can just ignore this if you won't filter on client IP - * since the default uhandled callback return is 0 meaning let the - * connection continue. - */ - - case LWS_CALLBACK_FILTER_NETWORK_CONNECTION: -#if 0 - libwebsockets_get_peer_addresses(context, wsi, (int)(long)in, client_name, - sizeof(client_name), client_ip, sizeof(client_ip)); - - fprintf(stderr, "Received network connect from %s (%s)\n", - client_name, client_ip); -#endif - /* if we returned non-zero from here, we kill the connection */ - break; - -#ifdef EXTERNAL_POLL - /* - * callbacks for managing the external poll() array appear in - * protocol 0 callback - */ - - case LWS_CALLBACK_LOCK_POLL: - /* - * lock mutex to protect pollfd state - * called before any other POLL related callback - */ - break; - - case LWS_CALLBACK_UNLOCK_POLL: - /* - * unlock mutex to protect pollfd state when - * called after any other POLL related callback - */ - break; - - case LWS_CALLBACK_ADD_POLL_FD: - - if (count_pollfds >= max_poll_elements) { - lwsl_err("LWS_CALLBACK_ADD_POLL_FD: too many sockets to track\n"); - return 1; - } - - fd_lookup[pa->fd] = count_pollfds; - pollfds[count_pollfds].fd = pa->fd; - pollfds[count_pollfds].events = pa->events; - pollfds[count_pollfds++].revents = 0; - break; - - case LWS_CALLBACK_DEL_POLL_FD: - if (!--count_pollfds) - break; - m = fd_lookup[pa->fd]; - /* have the last guy take up the vacant slot */ - pollfds[m] = pollfds[count_pollfds]; - fd_lookup[pollfds[count_pollfds].fd] = m; - break; - - case LWS_CALLBACK_CHANGE_MODE_POLL_FD: - pollfds[fd_lookup[pa->fd]].events = pa->events; - break; - -#endif - - case LWS_CALLBACK_GET_THREAD_ID: - /* - * if you will call "libwebsocket_callback_on_writable" - * from a different thread, return the caller thread ID - * here so lws can use this information to work out if it - * should signal the poll() loop to exit and restart early - */ - - /* return pthread_getthreadid_np(); */ - - break; - - default: - break; - } - - return 0; -} - - -/* dumb_increment protocol */ - -/* - * one of these is auto-created for each connection and a pointer to the - * appropriate instance is passed to the callback in the user parameter - * - * for this example protocol we use it to individualize the count for each - * connection. - */ - -struct per_session_data__dumb_increment { - int number; -}; - -static int -callback_dumb_increment(struct libwebsocket_context *context, - struct libwebsocket *wsi, - enum libwebsocket_callback_reasons reason, - void *user, void *in, size_t len) -{ - int n, m; - unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + 512 + - LWS_SEND_BUFFER_POST_PADDING]; - unsigned char *p = &buf[LWS_SEND_BUFFER_PRE_PADDING]; - struct per_session_data__dumb_increment *pss = (struct per_session_data__dumb_increment *)user; - - switch (reason) { - - case LWS_CALLBACK_ESTABLISHED: - lwsl_info("callback_dumb_increment: " - "LWS_CALLBACK_ESTABLISHED\n"); - pss->number = 0; - break; - - case LWS_CALLBACK_SERVER_WRITEABLE: - n = sprintf((char *)p, "%d", pss->number++); - m = libwebsocket_write(wsi, (u8*)&p_sh4rcb->cntx, sizeof(p_sh4rcb->cntx), LWS_WRITE_BINARY); - if (m < n) { - lwsl_err("ERROR %d writing to di socket\n", n); - return -1; - } - if (close_testing && pss->number == 50) { - lwsl_info("close tesing limit, closing\n"); - return -1; - } - break; - - case LWS_CALLBACK_RECEIVE: -// fprintf(stderr, "rx %d\n", (int)len); - if (len < 6) - break; - if (strcmp((const char *)in, "reset\n") == 0) - pss->number = 0; - break; - /* - * this just demonstrates how to use the protocol filter. If you won't - * study and reject connections based on header content, you don't need - * to handle this callback - */ - - case LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION: - dump_handshake_info(wsi); - /* you could return non-zero here and kill the connection */ - break; - - default: - break; - } - - return 0; -} - - -/* lws-mirror_protocol */ - -#define MAX_MESSAGE_QUEUE 32 - -struct per_session_data__lws_mirror { - struct libwebsocket *wsi; - int ringbuffer_tail; -}; - -struct a_message { - void *payload; - size_t len; -}; - -static struct a_message ringbuffer[MAX_MESSAGE_QUEUE]; -static int ringbuffer_head; - -static int -callback_lws_mirror(struct libwebsocket_context *context, - struct libwebsocket *wsi, - enum libwebsocket_callback_reasons reason, - void *user, void *in, size_t len) -{ - int n; - struct per_session_data__lws_mirror *pss = (struct per_session_data__lws_mirror *)user; - - switch (reason) { - - case LWS_CALLBACK_ESTABLISHED: - lwsl_info("callback_lws_mirror: LWS_CALLBACK_ESTABLISHED\n"); - pss->ringbuffer_tail = ringbuffer_head; - pss->wsi = wsi; - break; - - case LWS_CALLBACK_PROTOCOL_DESTROY: - lwsl_notice("mirror protocol cleaning up\n"); - for (n = 0; n < sizeof ringbuffer / sizeof ringbuffer[0]; n++) - if (ringbuffer[n].payload) - free(ringbuffer[n].payload); - break; - - case LWS_CALLBACK_SERVER_WRITEABLE: - if (close_testing) - break; - while (pss->ringbuffer_tail != ringbuffer_head) { - - n = libwebsocket_write(wsi, (unsigned char *) - ringbuffer[pss->ringbuffer_tail].payload + - LWS_SEND_BUFFER_PRE_PADDING, - ringbuffer[pss->ringbuffer_tail].len, - LWS_WRITE_TEXT); - if (n < 0) { - lwsl_err("ERROR %d writing to mirror socket\n", n); - return -1; - } - if (n < ringbuffer[pss->ringbuffer_tail].len) - lwsl_err("mirror partial write %d vs %d\n", - n, ringbuffer[pss->ringbuffer_tail].len); - - if (pss->ringbuffer_tail == (MAX_MESSAGE_QUEUE - 1)) - pss->ringbuffer_tail = 0; - else - pss->ringbuffer_tail++; - - if (((ringbuffer_head - pss->ringbuffer_tail) & - (MAX_MESSAGE_QUEUE - 1)) == (MAX_MESSAGE_QUEUE - 15)) - libwebsocket_rx_flow_allow_all_protocol( - libwebsockets_get_protocol(wsi)); - - // lwsl_debug("tx fifo %d\n", (ringbuffer_head - pss->ringbuffer_tail) & (MAX_MESSAGE_QUEUE - 1)); - - if (lws_send_pipe_choked(wsi)) { - libwebsocket_callback_on_writable(context, wsi); - break; - } - /* - * for tests with chrome on same machine as client and - * server, this is needed to stop chrome choking - */ -#ifdef _WIN32 - Sleep(1); -#else - usleep(1); -#endif - } - break; - - case LWS_CALLBACK_RECEIVE: - - if (((ringbuffer_head - pss->ringbuffer_tail) & - (MAX_MESSAGE_QUEUE - 1)) == (MAX_MESSAGE_QUEUE - 1)) { - lwsl_err("dropping!\n"); - goto choke; - } - - if (ringbuffer[ringbuffer_head].payload) - free(ringbuffer[ringbuffer_head].payload); - - ringbuffer[ringbuffer_head].payload = - malloc(LWS_SEND_BUFFER_PRE_PADDING + len + - LWS_SEND_BUFFER_POST_PADDING); - ringbuffer[ringbuffer_head].len = len; - memcpy((char *)ringbuffer[ringbuffer_head].payload + - LWS_SEND_BUFFER_PRE_PADDING, in, len); - if (ringbuffer_head == (MAX_MESSAGE_QUEUE - 1)) - ringbuffer_head = 0; - else - ringbuffer_head++; - - if (((ringbuffer_head - pss->ringbuffer_tail) & - (MAX_MESSAGE_QUEUE - 1)) != (MAX_MESSAGE_QUEUE - 2)) - goto done; - -choke: - lwsl_debug("LWS_CALLBACK_RECEIVE: throttling %p\n", wsi); - libwebsocket_rx_flow_control(wsi, 0); - -// lwsl_debug("rx fifo %d\n", (ringbuffer_head - pss->ringbuffer_tail) & (MAX_MESSAGE_QUEUE - 1)); -done: - libwebsocket_callback_on_writable_all_protocol( - libwebsockets_get_protocol(wsi)); - break; - - /* - * this just demonstrates how to use the protocol filter. If you won't - * study and reject connections based on header content, you don't need - * to handle this callback - */ - - case LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION: - dump_handshake_info(wsi); - /* you could return non-zero here and kill the connection */ - break; - - default: - break; - } - - return 0; -} - - -/* list of supported protocols and callbacks */ - -static struct libwebsocket_protocols protocols[] = { - /* first protocol must always be HTTP handler */ - - { - "http-only", /* name */ - callback_http, /* callback */ - sizeof (struct per_session_data__http), /* per_session_data_size */ - 0, /* max frame size / rx buffer */ - }, - { - "dumb-increment-protocol", - callback_dumb_increment, - sizeof(struct per_session_data__dumb_increment), - 10, - }, - { - "lws-mirror-protocol", - callback_lws_mirror, - sizeof(struct per_session_data__lws_mirror), - 128, - }, - { NULL, NULL, 0, 0 } /* terminator */ -}; - -void sighandler(int sig) -{ - force_exit = 1; - libwebsocket_cancel_service(context); -} - -void webui_start() -{ - char cert_path[1024]; - char key_path[1024]; - int n = 0; - int use_ssl = 0; - int opts = 0; - char interface_name[128] = ""; - const char *iface = NULL; -#ifndef WIN32 - int syslog_options = LOG_PID | LOG_PERROR; -#endif - struct lws_context_creation_info info; - - int debug_level = 7; -#ifndef LWS_NO_DAEMONIZE - int daemonize = 0; -#endif - - memset(&info, 0, sizeof info); - info.port = 5678; - - const string path = WEBUI_PATH; - - const char* resource_path = path.c_str(); - -#ifndef WIN32 - /* we will only try to log things according to our debug_level */ - setlogmask(LOG_UPTO (LOG_DEBUG)); - openlog("lwsts", syslog_options, LOG_DAEMON); -#endif - - /* tell the library what debug level to emit and to send it to syslog */ - lws_set_log_level(debug_level, lwsl_emit_syslog); - - lwsl_notice("libwebsockets test server - " - "(C) Copyright 2010-2013 Andy Green - " - "licensed under LGPL2.1\n"); -#ifdef EXTERNAL_POLL - max_poll_elements = getdtablesize(); - pollfds = malloc(max_poll_elements * sizeof (struct pollfd)); - fd_lookup = malloc(max_poll_elements * sizeof (int)); - if (pollfds == NULL || fd_lookup == NULL) { - lwsl_err("Out of memory pollfds=%d\n", max_poll_elements); - return -1; - } -#endif - - info.iface = iface; - info.protocols = protocols; -#ifndef LWS_NO_EXTENSIONS - info.extensions = libwebsocket_get_internal_extensions(); -#endif - if (!use_ssl) { - info.ssl_cert_filepath = NULL; - info.ssl_private_key_filepath = NULL; - } else { - if (strlen(resource_path) > sizeof(cert_path) - 32) { - lwsl_err("resource path too long\n"); - return ; - } - sprintf(cert_path, "%s/libwebsockets-test-server.pem", - resource_path); - if (strlen(resource_path) > sizeof(key_path) - 32) { - lwsl_err("resource path too long\n"); - return; - } - sprintf(key_path, "%s/libwebsockets-test-server.key.pem", - resource_path); - - info.ssl_cert_filepath = cert_path; - info.ssl_private_key_filepath = key_path; - } - info.gid = -1; - info.uid = -1; - info.options = opts; - - context = libwebsocket_create_context(&info); - if (context == NULL) { - lwsl_err("libwebsocket init failed\n"); - return ; - } - - n = 0; - double old_time = 0; - - while (n >= 0 && !force_exit) { - - double time = os_GetSeconds(); - - /* - * This provokes the LWS_CALLBACK_SERVER_WRITEABLE for every - * live websocket connection using the DUMB_INCREMENT protocol, - * as soon as it can take more packets (usually immediately) - */ - - if ((time - old_time ) > 0.050) { - libwebsocket_callback_on_writable_all_protocol(&protocols[PROTOCOL_DUMB_INCREMENT]); - old_time = time; - } - -#ifdef EXTERNAL_POLL - - /* - * this represents an existing server's single poll action - * which also includes libwebsocket sockets - */ - - n = poll(pollfds, count_pollfds, 50); - if (n < 0) - continue; - - - if (n) - for (n = 0; n < count_pollfds; n++) - if (pollfds[n].revents) - /* - * returns immediately if the fd does not - * match anything under libwebsockets - * control - */ - if (libwebsocket_service_fd(context, - &pollfds[n]) < 0) - goto done; -#else - /* - * If libwebsockets sockets are all we care about, - * you can use this api which takes care of the poll() - * and looping through finding who needed service. - * - * If no socket needs service, it'll return anyway after - * the number of ms in the second argument. - */ - - n = libwebsocket_service(context, 50); -#endif - } - -#ifdef EXTERNAL_POLL -done: -#endif - - libwebsocket_context_destroy(context); - - lwsl_notice("libwebsockets-test-server exited cleanly\n"); - -#ifndef WIN32 - closelog(); -#endif - - return; -} diff --git a/core/webui/server.h b/core/webui/server.h deleted file mode 100644 index 2dd42c05b..000000000 --- a/core/webui/server.h +++ /dev/null @@ -1 +0,0 @@ -void webui_start(); \ No newline at end of file diff --git a/shell/android-studio/reicast/src/main/jni/Android.mk b/shell/android-studio/reicast/src/main/jni/Android.mk index cd3c4ba5a..7841229dc 100644 --- a/shell/android-studio/reicast/src/main/jni/Android.mk +++ b/shell/android-studio/reicast/src/main/jni/Android.mk @@ -18,7 +18,6 @@ LOCAL_PATH:= $(call my-dir)/.. include $(CLEAR_VARS) FOR_ANDROID := 1 -WEBUI := 1 USE_GLES := 1 CHD5_LZMA := 1 CHD5_FLAC := 1 diff --git a/shell/apple/emulator-ios/reicast-ios.xcodeproj/project.pbxproj b/shell/apple/emulator-ios/reicast-ios.xcodeproj/project.pbxproj index 1db463737..158cdeef7 100644 --- a/shell/apple/emulator-ios/reicast-ios.xcodeproj/project.pbxproj +++ b/shell/apple/emulator-ios/reicast-ios.xcodeproj/project.pbxproj @@ -1826,7 +1826,6 @@ "DEBUG=1", "TARGET_IPHONE=1", "$(inherited)", - "TARGET_NO_WEBUI=1", ); HEADER_SEARCH_PATHS = ( "$(inherited)", @@ -1861,7 +1860,6 @@ GCC_PREPROCESSOR_DEFINITIONS = ( "GLES=1", "TARGET_IPHONE=1", - "TARGET_NO_WEBUI=1", ); HEADER_SEARCH_PATHS = ( "$(inherited)", diff --git a/shell/apple/emulator-osx/reicast-osx.xcodeproj/project.pbxproj b/shell/apple/emulator-osx/reicast-osx.xcodeproj/project.pbxproj index 3130bb2ee..700df50f0 100644 --- a/shell/apple/emulator-osx/reicast-osx.xcodeproj/project.pbxproj +++ b/shell/apple/emulator-osx/reicast-osx.xcodeproj/project.pbxproj @@ -2592,7 +2592,6 @@ GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( - TARGET_NO_WEBUI, TARGET_NO_NIXPROF, TARGET_NO_COREIO_HTTP, TARGET_NO_AREC, @@ -2650,7 +2649,6 @@ ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_PREPROCESSOR_DEFINITIONS = ( - TARGET_NO_WEBUI, TARGET_NO_NIXPROF, TARGET_NO_COREIO_HTTP, TARGET_NO_AREC, @@ -2816,7 +2814,6 @@ GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( - TARGET_NO_WEBUI, TARGET_NO_NIXPROF, TARGET_NO_COREIO_HTTP, TARGET_NO_AREC, @@ -2934,7 +2931,6 @@ ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_PREPROCESSOR_DEFINITIONS = ( - TARGET_NO_WEBUI, TARGET_NO_NIXPROF, TARGET_NO_COREIO_HTTP, TARGET_NO_AREC, diff --git a/shell/cmake/CMakeLists.txt b/shell/cmake/CMakeLists.txt index aef683440..6ef80613d 100644 --- a/shell/cmake/CMakeLists.txt +++ b/shell/cmake/CMakeLists.txt @@ -21,7 +21,6 @@ option(USE_ALSA "Use ALSA" ON) option(USE_LIBAO "Use LibAO" OFF) option(USE_GLES "Use GL ES" OFF) option(USE_PULSEAUDIO "Use PulseAudio" OFF) -option(USE_WEBUI "Use WebUI" ON) option(USE_REND "Use some rendering" ON) option(USE_EVDEV "Use EVDEV" ON) option(USE_JOYSTICK "Use Joystick" ON) @@ -189,13 +188,6 @@ endif() # Optional features -if(USE_WEBUI) - add_definitions(-DWEBUI) - add_directory(core/webui) - add_directory(core/deps/libwebsocket) - # TODO, deps/ifaddrs/ for Android -endif() - if(USE_EVDEV) add_definitions(-DUSE_EVDEV) endif() diff --git a/shell/cmake/config.cmake b/shell/cmake/config.cmake index da6b9fa44..2c0967191 100644 --- a/shell/cmake/config.cmake +++ b/shell/cmake/config.cmake @@ -340,7 +340,7 @@ if (TARGET_NSW) # -DCMAKE_TOOLCHAIN_FILE=./cmake/devkitA64.cmake -DTARGET_NSW=ON add_definitions(-D__SWITCH__ -DGLES -DMESA_EGL_NO_X11_HEADERS) add_definitions(-DTARGET_NO_THREADS -DTARGET_NO_EXCEPTIONS -DTARGET_NO_NIXPROF) - add_definitions(-DTARGET_NO_COREIO_HTTP -DTARGET_NO_WEBUI -UTARGET_SOFTREND) + add_definitions(-DTARGET_NO_COREIO_HTTP -UTARGET_SOFTREND) add_definitions(-D_GLIBCXX_USE_C99_MATH_TR1 -D_LDBL_EQ_DBL) endif() @@ -352,14 +352,12 @@ if (TARGET_PS4) # -DCMAKE_TOOLCHAIN_FILE=./cmake/{ps4sdk,clang_scei}.cmake -DTAR add_definitions(-DPS4 -DTARGET_PS4 -DTARGET_BSD -D__ORBIS__ -DGLES -DMESA_EGL_NO_X11_HEADERS) ## last needed for __unix__ on eglplatform.h add_definitions(-DTARGET_NO_THREADS -DTARGET_NO_EXCEPTIONS -DTARGET_NO_NIXPROF) - add_definitions(-DTARGET_NO_COREIO_HTTP -DTARGET_NO_WEBUI -UTARGET_SOFTREND) + add_definitions(-DTARGET_NO_COREIO_HTTP -UTARGET_SOFTREND) message("*******FIXME******** LARGE PAGES !!") endif() - - if(ZBUILD) set(DEBUG_CMAKE ON) add_definitions(-D_Z_) # Get rid of some warnings and internal dev testing @@ -370,8 +368,6 @@ if(ZBUILD) endif() endif() - - # configure options for osd/ui # osd_default, osd_qt # ui_default, ui_sdl, ui_qt @@ -379,23 +375,10 @@ endif() option(USE_QT False "Use Qt5 for UI and support OS Deps.") - - - -#option TARGET_NO_WEBUI - - - - - #option(BUILD_TESTS "Build tests" OFF) # todo: luserx0 this is your arena, you want tests add em - add_definitions(-DCMAKE_BUILD) - - - add_definitions(-DHOST_OS=${HOST_OS}) add_definitions(-DHOST_CPU=${HOST_CPU}) @@ -405,14 +388,8 @@ add_definitions(-DFEAT_DSPREC=${FEAT_DSPREC}) add_definitions(-DBUILD_COMPILER=${BUILD_COMPILER}) -add_definitions(-DTARGET_NO_WEBUI) add_definitions(-DDEF_CONSOLE) set(RE_CMAKE_CONFIGURED 1) #add_definitions(-D=${}) - - - - - diff --git a/shell/emscripten/Makefile b/shell/emscripten/Makefile index 1b8ef4c22..237e10d01 100644 --- a/shell/emscripten/Makefile +++ b/shell/emscripten/Makefile @@ -26,7 +26,7 @@ LDFLAGS := -Wl,-Map,$(notdir $@).map,--gc-sections -Wl,-O3 -Wl,--sort-common CXXONLYFLAGS := -std=c++11 -CXXFLAGS := -O3 -D GLES -D RELEASE -c -D TARGET_EMSCRIPTEN -D TARGET_NO_REC -D TARGET_NO_EXCEPTIONS -D TARGET_NO_WEBUI -D TARGET_NO_THREADS -D TARGET_BOUNDED_EXECUTION -D TARGET_NO_COREIO_HTTP +CXXFLAGS := -O3 -D GLES -D RELEASE -c -D TARGET_EMSCRIPTEN -D TARGET_NO_REC -D TARGET_NO_EXCEPTIONS -D TARGET_NO_THREADS -D TARGET_BOUNDED_EXECUTION -D TARGET_NO_COREIO_HTTP CXXFLAGS += -fno-strict-aliasing CXXFLAGS += -ffast-math diff --git a/shell/linux/Makefile b/shell/linux/Makefile index 0b4f36d83..9c8caa2f8 100644 --- a/shell/linux/Makefile +++ b/shell/linux/Makefile @@ -3,7 +3,6 @@ LOCAL_PATH := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) FOR_LINUX :=1 #NO_REC := 1 #NO_REND := 1 -WEBUI :=1 USE_OSS := 1 #USE_PULSEAUDIO := 1 #USE_SDLAUDIO := 1 @@ -13,11 +12,11 @@ USE_UDEV := 1 USE_MODEM := 1 PLATFORM_EXT := elf -CXX=${CC_PREFIX}g++ -CC=${CC_PREFIX}gcc -AS=${CC_PREFIX}as -STRIP=${CC_PREFIX}strip -LD=${CC} +CXX ?= ${CC_PREFIX}g++ +CC ?= ${CC_PREFIX}gcc +AS ?= ${CC_PREFIX}as +STRIP ?= ${CC_PREFIX}strip +LD ?= ${CC} WINDRES=${CC_PREFIX}windres CHD5_LZMA := 1 CHD5_FLAC := 1 @@ -252,7 +251,7 @@ else ifneq (,$(findstring vero4k,$(platform))) # Windows else ifneq (,$(findstring win32,$(platform))) NOT_ARM := 1 - CFLAGS += -DTARGET_NO_WEBUI -fno-builtin-sqrtf -funroll-loops -DHAVE_FSEEKO -D TARGET_NO_AREC + CFLAGS += -fno-builtin-sqrtf -funroll-loops -DHAVE_FSEEKO -D TARGET_NO_AREC LDFLAGS += -static-libgcc -static-libstdc++ -Wl,-subsystem,windows LIBS := -lopengl32 -lwinmm -lgdi32 -lwsock32 -ldsound -lcomctl32 -lcomdlg32 -lxinput -liphlpapi PLATFORM_EXT := exe @@ -271,7 +270,6 @@ endif undefine USE_EVDEV undefine USE_UDEV undefine FOR_LINUX - undefine WEBUI NO_NIXPROF := 1 FOR_WINDOWS := 1 else @@ -397,6 +395,10 @@ ifdef TEST_AUTOMATION CFLAGS += -DTEST_AUTOMATION endif +ifdef DEBUGFAST + CFLAGS += -DDEBUGFAST +endif + EXECUTABLE_STRIPPED=nosym-reicast.$(PLATFORM_EXT) ifdef NAOMI CFLAGS += -D TARGET_NAOMI