#ifndef HTTPLISTENER_H
#define HTTPLISTENER_H
#include "sessionhandler.h"
#include "threadpools.h"
#include "config.h"
#include "../util/systems.h"
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <unistd.h>
#include <openssl/bio.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef struct _acceptor Acceptor;
typedef struct _listener_config ListenerConfig;
typedef struct _http_ssl HttpSSL;
typedef struct _ws_socket WSSocket;
union vs {
VirtualServer *vs;
char *vs_name;
};
struct _listener_config {
ServerConfiguration *cfg;
cxmutstr name;
cxmutstr vs;
cxmutstr threadpool;
char *address;
int port;
int nacceptors;
WSBool blockingio;
WSBool ssl;
cxstring certfile;
cxstring privkeyfile;
cxstring chainfile;
cxstring disable_proto;
};
struct _acceptor {
pthread_t tid;
HttpListener *listener;
WSBool ipv6;
WSBool exit;
WSBool running;
};
struct _http_listener {
ServerConfiguration *cfg;
cxmutstr name;
union vs default_vs;
int port;
WSSocket *server_socket;
WSSocket *server_socket6;
SessionHandler *session_handler;
threadpool_t *threadpool;
HttpListener *next;
Acceptor **acceptors;
Acceptor **acceptors6;
int nacceptors;
uint32_t nacceptors_running;
int running;
pthread_mutex_t shutdown_mutex;
pthread_cond_t shutdown_cond;
WSBool shutdown;
};
struct _http_ssl {
SSL_CTX *sslctx;
};
union ws_socketaddr {
struct sockaddr_in addr4;
struct sockaddr_in6 addr6;
};
struct _ws_socket {
union ws_socketaddr addr;
struct sockaddr *sockaddr;
size_t sockaddr_size;
int socket;
WSBool listening;
HttpSSL *ssl;
uint32_t ref;
};
int http_listener_global_init(
void);
int start_all_listener();
HttpListener* http_listener_create(ListenerConfig *conf);
void http_listener_destroy(HttpListener *listener);
int http_listener_start(HttpListener *listener);
int http_listener_socket_eq(HttpListener *l1, HttpListener *l2);
void http_listener_set_next(HttpListener *listener, HttpListener *next);
int http_listener_connect(HttpListener *listener, WSBool ipv6);
void http_listener_shutdown_acceptors(HttpListener *listener);
Acceptor* acceptor_new(HttpListener *listener);
void acceptor_start(Acceptor *a);
void* acceptor_thread(Acceptor *a);
void wssocket_ref(WSSocket *ws);
void wssocket_unref(WSSocket *ws);
int http_listener_apply_keep_alive_settings(HttpListener *listener,
int fd);
#ifdef __cplusplus
}
#endif
#endif