387 lines
8.8 KiB
C
387 lines
8.8 KiB
C
/*
|
|
* LibNoPoll: A websocket library
|
|
* Copyright (C) 2013 Advanced Software Production Line, S.L.
|
|
*
|
|
* This program 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 program 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 program; if not, write to the Free
|
|
* Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
|
* 02111-1307 USA
|
|
*
|
|
* You may find a copy of the license under this software is released
|
|
* at COPYING file. This is LGPL software: you are welcome to develop
|
|
* proprietary applications using this library without any royalty or
|
|
* fee but returning back any change, improvement or addition in the
|
|
* form of source code, project image, documentation patches, etc.
|
|
*
|
|
* For commercial support on build Websocket enabled solutions
|
|
* contact us:
|
|
*
|
|
* Postal address:
|
|
* Advanced Software Production Line, S.L.
|
|
* Edificio Alius A, Oficina 102,
|
|
* C/ Antonio Suarez Nº 10,
|
|
* Alcalá de Henares 28802 Madrid
|
|
* Spain
|
|
*
|
|
* Email address:
|
|
* info@aspl.es - http://www.aspl.es/nopoll
|
|
*/
|
|
#ifndef __NOPOLL_PRIVATE_H__
|
|
#define __NOPOLL_PRIVATE_H__
|
|
|
|
#include "openssl/ssl.h"
|
|
#include <nopoll_handlers.h>
|
|
|
|
typedef struct _noPollCertificate {
|
|
|
|
char * serverName;
|
|
char * certificateFile;
|
|
char * privateKey;
|
|
char * optionalChainFile;
|
|
|
|
} noPollCertificate;
|
|
|
|
struct _noPollCtx {
|
|
/**
|
|
* @internal Controls logs output..
|
|
*/
|
|
/* context reference counting */
|
|
int refs;
|
|
|
|
/* console log */
|
|
nopoll_bool not_executed;
|
|
nopoll_bool debug_enabled;
|
|
|
|
/* colored log */
|
|
nopoll_bool not_executed_color;
|
|
nopoll_bool debug_color_enabled;
|
|
|
|
nopoll_bool keep_looping;
|
|
|
|
/**
|
|
* @internal noPollConn connection timeout.
|
|
*/
|
|
long conn_connect_std_timeout;
|
|
|
|
/**
|
|
* @internal Default listener connection backlog
|
|
*/
|
|
int backlog;
|
|
|
|
/**
|
|
* @internal Currently selected io engine on this context.
|
|
*/
|
|
noPollIoEngine * io_engine;
|
|
|
|
/**
|
|
* @internal Connection array list and its length.
|
|
*/
|
|
int conn_id;
|
|
noPollConn ** conn_list;
|
|
int conn_length;
|
|
/**
|
|
* @internal Number of connections registered on this context.
|
|
*/
|
|
int conn_num;
|
|
|
|
/**
|
|
* @internal Reference to defined on accept handling.
|
|
*/
|
|
noPollActionHandler on_accept;
|
|
noPollPtr on_accept_data;
|
|
|
|
/**
|
|
* @internal Reference to defined on ready handling.
|
|
*/
|
|
noPollActionHandler on_ready;
|
|
noPollPtr on_ready_data;
|
|
|
|
/**
|
|
* @internal Reference to defined on open handling.
|
|
*/
|
|
noPollActionHandler on_open;
|
|
noPollPtr on_open_data;
|
|
|
|
/**
|
|
* @internal Reference to the defined on message handling.
|
|
*/
|
|
noPollOnMessageHandler on_msg;
|
|
noPollPtr on_msg_data;
|
|
|
|
/**
|
|
* @internal Basic fake support for protocol version, by
|
|
* default: 13, due to RFC6455 standard
|
|
*/
|
|
int protocol_version;
|
|
|
|
/**
|
|
* @internal Certificates added..
|
|
*/
|
|
noPollCertificate * certificates;
|
|
int certificates_length;
|
|
|
|
/* mutex */
|
|
noPollPtr ref_mutex;
|
|
|
|
/* log handling */
|
|
noPollLogHandler log_handler;
|
|
noPollPtr log_user_data;
|
|
|
|
/* context creator */
|
|
noPollSslContextCreator context_creator;
|
|
noPollPtr context_creator_data;
|
|
|
|
/* SSL postcheck */
|
|
noPollSslPostCheck post_ssl_check;
|
|
noPollPtr post_ssl_check_data;
|
|
};
|
|
|
|
struct _noPollConn {
|
|
/**
|
|
* @internal Connection id.
|
|
*/
|
|
int id;
|
|
|
|
/**
|
|
* @internal The context associated to this connection.
|
|
*/
|
|
noPollCtx * ctx;
|
|
|
|
/**
|
|
* @internal This is the actual socket handler associated to
|
|
* the noPollConn object.
|
|
*/
|
|
NOPOLL_SOCKET session;
|
|
/**
|
|
* @internal Flag to signal this connection has finished its
|
|
* handshake.
|
|
*/
|
|
nopoll_bool handshake_ok;
|
|
|
|
/**
|
|
* @internal Current connection receive function.
|
|
*/
|
|
noPollRead receive;
|
|
|
|
/**
|
|
* @internal Current connection receive function.
|
|
*/
|
|
noPollRead sends;
|
|
|
|
/**
|
|
* @internal The connection role.
|
|
*/
|
|
noPollRole role;
|
|
|
|
/**
|
|
* @internal Conection host ip location (connecting or listening).
|
|
*/
|
|
char * host;
|
|
|
|
/**
|
|
* @internal Connection port location (connecting or
|
|
* listening).
|
|
*/
|
|
char * port;
|
|
|
|
/**
|
|
* @internal Host name requested on the connection.
|
|
*/
|
|
char * host_name;
|
|
/**
|
|
* @internal Origin requested on the connection.
|
|
*/
|
|
char * origin;
|
|
|
|
/**
|
|
* @internal reference to the get url.
|
|
*/
|
|
char * get_url;
|
|
|
|
/**
|
|
* @internal Reference to protocols requested to be opened on
|
|
* this connection.
|
|
*/
|
|
char * protocols;
|
|
/* @internal reference to the protocol that was replied by the server */
|
|
char * accepted_protocol;
|
|
|
|
/* close status and reason */
|
|
int peer_close_status;
|
|
char * peer_close_reason;
|
|
|
|
/**
|
|
* @internal Reference to the defined on message handling.
|
|
*/
|
|
noPollOnMessageHandler on_msg;
|
|
noPollPtr on_msg_data;
|
|
|
|
/**
|
|
* @internal Reference to defined on ready handling.
|
|
*/
|
|
noPollActionHandler on_ready;
|
|
noPollPtr on_ready_data;
|
|
|
|
/**
|
|
* @internal Reference to the defined on close handling.
|
|
*/
|
|
noPollOnCloseHandler on_close;
|
|
noPollPtr on_close_data;
|
|
|
|
/* reference to the handshake */
|
|
noPollHandShake * handshake;
|
|
|
|
/* reference to a buffer with pending content */
|
|
char * pending_line;
|
|
|
|
/**
|
|
* @internal connection reference counting.
|
|
*/
|
|
int refs;
|
|
|
|
/**
|
|
* @internal References to pending content to be read
|
|
*/
|
|
noPollMsg * pending_msg;
|
|
long int pending_diff;
|
|
long int pending_desp;
|
|
|
|
/**
|
|
* @internal Flag to handle TLS support upon connection
|
|
* reception.
|
|
*/
|
|
nopoll_bool tls_on;
|
|
/**
|
|
* @internal Flag that indicates that the provided session
|
|
* must call to accept the TLS session before proceeding.
|
|
*/
|
|
nopoll_bool pending_ssl_accept;
|
|
|
|
/* SSL support */
|
|
SSL_CTX * ssl_ctx;
|
|
SSL * ssl;
|
|
|
|
/* certificates */
|
|
char * certificate;
|
|
char * private_key;
|
|
char * chain_certificate;
|
|
|
|
/* pending buffer */
|
|
char pending_buf[100];
|
|
int pending_buf_bytes;
|
|
|
|
/**
|
|
* @internal Support for an user defined pointer.
|
|
*/
|
|
noPollPtr hook;
|
|
|
|
/**
|
|
* @internal Mutex
|
|
*/
|
|
noPollPtr ref_mutex;
|
|
|
|
/**
|
|
* @internal Variable to track pending bytes from previous
|
|
* read that must be completed.
|
|
*/
|
|
noPollMsg * previous_msg;
|
|
/* allows to track if previous message was a fragment to flag
|
|
* next message, even having FIN enabled as a fragment. */
|
|
nopoll_bool previous_was_fragment;
|
|
|
|
char * pending_write;
|
|
int pending_write_bytes;
|
|
|
|
/**
|
|
* @internal Internal reference to the connection options.
|
|
*/
|
|
noPollConnOpts * opts;
|
|
|
|
/**
|
|
* @internal Reference to the listener in the case this is a
|
|
* connection that was created due to a listener running.
|
|
*/
|
|
noPollConn * listener;
|
|
};
|
|
|
|
struct _noPollIoEngine {
|
|
noPollPtr io_object;
|
|
noPollCtx * ctx;
|
|
noPollIoMechCreate create;
|
|
noPollIoMechDestroy destroy;
|
|
noPollIoMechClear clear;
|
|
noPollIoMechWait wait;
|
|
noPollIoMechAddTo addto;
|
|
noPollIoMechIsSet isset;
|
|
};
|
|
|
|
struct _noPollMsg {
|
|
nopoll_bool has_fin;
|
|
short op_code;
|
|
nopoll_bool is_masked;
|
|
|
|
noPollPtr payload;
|
|
long int payload_size;
|
|
|
|
int refs;
|
|
noPollPtr ref_mutex;
|
|
|
|
char mask[4];
|
|
int remain_bytes;
|
|
|
|
nopoll_bool is_fragment;
|
|
int unmask_desp;
|
|
};
|
|
|
|
struct _noPollHandshake {
|
|
/**
|
|
* @internal Reference to the to the GET url HTTP/1.1 header
|
|
* part.
|
|
*/
|
|
nopoll_bool upgrade_websocket;
|
|
nopoll_bool connection_upgrade;
|
|
nopoll_bool received_101;
|
|
char * websocket_key;
|
|
char * websocket_version;
|
|
char * websocket_accept;
|
|
char * expected_accept;
|
|
|
|
/* reference to cookie header */
|
|
char * cookie;
|
|
};
|
|
|
|
struct _noPollConnOpts {
|
|
/* If the connection options object should be reused across calls */
|
|
nopoll_bool reuse;
|
|
|
|
/* mutex */
|
|
noPollPtr mutex;
|
|
int refs;
|
|
|
|
/* What ssl protocol should be used */
|
|
noPollSslProtocol ssl_protocol;
|
|
|
|
/* SSL options */
|
|
char * certificate;
|
|
char * private_key;
|
|
char * chain_certificate;
|
|
char * ca_certificate;
|
|
|
|
nopoll_bool disable_ssl_verify;
|
|
|
|
/* cookie support */
|
|
char * cookie;
|
|
};
|
|
|
|
#endif
|