2010-06-04 23:10:06 +01:00
|
|
|
#include <openssl/ssl.h>
|
|
|
|
|
2012-02-02 01:10:39 +00:00
|
|
|
#define BUFSIZE 65536
|
|
|
|
#define DBUFSIZE (BUFSIZE * 3) / 4 - 20
|
|
|
|
|
|
|
|
#define SERVER_HANDSHAKE_HIXIE "HTTP/1.1 101 Web Socket Protocol Handshake\r\n\
|
|
|
|
Upgrade: WebSocket\r\n\
|
|
|
|
Connection: Upgrade\r\n\
|
|
|
|
%sWebSocket-Origin: %s\r\n\
|
|
|
|
%sWebSocket-Location: %s://%s%s\r\n\
|
|
|
|
%sWebSocket-Protocol: %s\r\n\
|
|
|
|
\r\n%s"
|
|
|
|
|
|
|
|
#define SERVER_HANDSHAKE_HYBI "HTTP/1.1 101 Switching Protocols\r\n\
|
|
|
|
Upgrade: websocket\r\n\
|
|
|
|
Connection: Upgrade\r\n\
|
|
|
|
Sec-WebSocket-Accept: %s\r\n\
|
|
|
|
Sec-WebSocket-Protocol: %s\r\n\
|
|
|
|
\r\n"
|
|
|
|
|
|
|
|
#define HYBI_GUID "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
|
|
|
|
|
|
|
|
#define HYBI10_ACCEPTHDRLEN 29
|
|
|
|
|
|
|
|
#define HIXIE_MD5_DIGEST_LENGTH 16
|
|
|
|
|
|
|
|
#define POLICY_RESPONSE "<cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\" /></cross-domain-policy>\n"
|
|
|
|
|
2010-06-04 23:10:06 +01:00
|
|
|
typedef struct {
|
2012-02-02 01:10:39 +00:00
|
|
|
char path[1024+1];
|
|
|
|
char host[1024+1];
|
|
|
|
char origin[1024+1];
|
|
|
|
char version[1024+1];
|
|
|
|
char connection[1024+1];
|
|
|
|
char protocols[1024+1];
|
|
|
|
char key1[1024+1];
|
|
|
|
char key2[1024+1];
|
|
|
|
char key3[8+1];
|
|
|
|
} headers_t;
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
int sockfd;
|
|
|
|
SSL_CTX *ssl_ctx;
|
|
|
|
SSL *ssl;
|
|
|
|
int hixie;
|
|
|
|
int hybi;
|
|
|
|
headers_t *headers;
|
2012-02-02 22:04:21 +00:00
|
|
|
char *cin_buf;
|
|
|
|
char *cout_buf;
|
|
|
|
char *tin_buf;
|
|
|
|
char *tout_buf;
|
2010-06-04 23:10:06 +01:00
|
|
|
} ws_ctx_t;
|
|
|
|
|
2010-06-17 22:06:18 +01:00
|
|
|
typedef struct {
|
2010-09-11 21:10:54 +01:00
|
|
|
int verbose;
|
2010-06-17 22:06:18 +01:00
|
|
|
char listen_host[256];
|
|
|
|
int listen_port;
|
|
|
|
void (*handler)(ws_ctx_t*);
|
2010-09-10 19:05:48 +01:00
|
|
|
int handler_id;
|
2010-11-06 15:55:09 +00:00
|
|
|
char *cert;
|
|
|
|
char *key;
|
2010-06-17 22:06:18 +01:00
|
|
|
int ssl_only;
|
|
|
|
int daemon;
|
2012-04-13 16:36:16 +01:00
|
|
|
int run_once;
|
2010-06-17 22:06:18 +01:00
|
|
|
} settings_t;
|
|
|
|
|
2010-06-04 23:10:06 +01:00
|
|
|
|
2017-10-18 15:35:52 +01:00
|
|
|
int resolve_host(struct in_addr *sin_addr, const char *hostname);
|
|
|
|
|
2010-06-04 23:10:06 +01:00
|
|
|
ssize_t ws_recv(ws_ctx_t *ctx, void *buf, size_t len);
|
|
|
|
|
|
|
|
ssize_t ws_send(ws_ctx_t *ctx, const void *buf, size_t len);
|
|
|
|
|
|
|
|
/* base64.c declarations */
|
|
|
|
//int b64_ntop(u_char const *src, size_t srclength, char *target, size_t targsize);
|
|
|
|
//int b64_pton(char const *src, u_char *target, size_t targsize);
|
|
|
|
|
2010-09-10 19:05:48 +01:00
|
|
|
#define gen_handler_msg(stream, ...) \
|
|
|
|
if (! settings.daemon) { \
|
2010-09-11 21:10:54 +01:00
|
|
|
fprintf(stream, " %d: ", settings.handler_id); \
|
2010-09-10 19:05:48 +01:00
|
|
|
fprintf(stream, __VA_ARGS__); \
|
|
|
|
}
|
|
|
|
|
|
|
|
#define handler_msg(...) gen_handler_msg(stdout, __VA_ARGS__);
|
|
|
|
#define handler_emsg(...) gen_handler_msg(stderr, __VA_ARGS__);
|
|
|
|
|
2017-10-18 15:35:52 +01:00
|
|
|
void traffic(const char * token);
|
|
|
|
|
|
|
|
int encode_hixie(u_char const *src, size_t srclength,
|
|
|
|
char *target, size_t targsize);
|
|
|
|
int decode_hixie(char *src, size_t srclength,
|
|
|
|
u_char *target, size_t targsize,
|
|
|
|
unsigned int *opcode, unsigned int *left);
|
|
|
|
int encode_hybi(u_char const *src, size_t srclength,
|
|
|
|
char *target, size_t targsize, unsigned int opcode);
|
|
|
|
int decode_hybi(unsigned char *src, size_t srclength,
|
|
|
|
u_char *target, size_t targsize,
|
|
|
|
unsigned int *opcode, unsigned int *left);
|
|
|
|
|
|
|
|
void start_server();
|