/* * libwebsockets-test-server - libwebsockets test implementation * * Copyright (C) 2010-2016 Andy Green * * This file is made available under the Creative Commons CC0 1.0 * Universal Public Domain Dedication. * * The person who associated a work with this deed has dedicated * the work to the public domain by waiving all of his or her rights * to the work worldwide under copyright law, including all related * and neighboring rights, to the extent allowed by law. You can copy, * modify, distribute and perform the work, even for commercial purposes, * all without asking permission. * * The test apps are intended to be adapted for use in your code, which * may be proprietary. So unlike the library itself, they are licensed * Public Domain. */ #if defined(_WIN32) && defined(EXTERNAL_POLL) #define WINVER 0x0600 #define _WIN32_WINNT 0x0600 #define poll(fdArray, fds, timeout) WSAPoll((LPWSAPOLLFD)(fdArray), (ULONG)(fds), (INT)(timeout)) #endif #include "lws_config.h" #include #include #include #include #include #include #include #include #include "../lib/libwebsockets.h" #ifdef _WIN32 #include #include "gettimeofday.h" #else #include #include #include #endif extern int close_testing; extern int max_poll_elements; #ifdef EXTERNAL_POLL extern struct lws_pollfd *pollfds; extern int *fd_lookup; extern int count_pollfds; #endif extern volatile int force_exit; extern struct lws_context *context; extern char *resource_path; #if defined(LWS_OPENSSL_SUPPORT) && defined(LWS_HAVE_SSL_CTX_set1_param) extern char crl_path[1024]; #endif extern void test_server_lock(int care); extern void test_server_unlock(int care); #ifndef __func__ #define __func__ __FUNCTION__ #endif struct per_session_data__http { lws_filefd_type fd; #ifdef LWS_WITH_CGI struct lws_cgi_args args; #endif #if defined(LWS_WITH_CGI) || !defined(LWS_NO_CLIENT) int reason_bf; #endif unsigned int client_finished:1; struct lws_spa *spa; char result[500 + LWS_PRE]; int result_len; char filename[256]; long file_length; lws_filefd_type post_fd; }; /* * 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; }; struct per_session_data__lws_mirror { struct lws *wsi; int ringbuffer_tail; }; struct per_session_data__echogen { size_t total; size_t total_rx; int fd; int fragsize; int wr; }; struct per_session_data__lws_status { struct per_session_data__lws_status *list; struct timeval tv_established; int last; char ip[270]; char user_agent[512]; const char *pos; int len; }; extern int callback_http(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len); extern int callback_lws_mirror(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len); extern int callback_dumb_increment(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len); extern int callback_lws_echogen(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len); extern int callback_lws_status(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len); extern void dump_handshake_info(struct lws *wsi);