1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 #ifndef HTTPLISTENER_H
30 #define HTTPLISTENER_H
31
32 #include "sessionhandler.h"
33 #include "threadpools.h"
34 #include "config.h"
35 #include "../util/systems.h"
36
37 #include <arpa/inet.h>
38 #include <netinet/in.h>
39 #include <sys/socket.h>
40 #include <sys/types.h>
41 #include <netdb.h>
42 #include <unistd.h>
43
44 #include <openssl/bio.h>
45 #include <openssl/ssl.h>
46 #include <openssl/err.h>
47
48 #ifdef __cplusplus
49 extern "C" {
50 #endif
51
52
53 typedef struct _acceptor Acceptor;
54 typedef struct _listener_config ListenerConfig;
55 typedef struct _http_ssl HttpSSL;
56
57 typedef struct _ws_socket WSSocket;
58
59
60 union vs {
61 VirtualServer *vs;
62 char *vs_name;
63 };
64 struct _listener_config {
65 ServerConfiguration *cfg;
66 cxmutstr name;
67 cxmutstr vs;
68 cxmutstr threadpool;
69 char *address;
70 int port;
71 int nacceptors;
72 WSBool blockingio;
73 WSBool ssl;
74 cxstring certfile;
75 cxstring privkeyfile;
76 cxstring chainfile;
77 cxstring disable_proto;
78 };
79
80 struct _acceptor {
81 pthread_t tid;
82 HttpListener *listener;
83 WSBool ipv6;
84 WSBool exit;
85 WSBool running;
86 };
87
88 struct _http_listener {
89 ServerConfiguration *cfg;
90 cxmutstr name;
91 union vs default_vs;
92 int port;
93 WSSocket *server_socket;
94 WSSocket *server_socket6;
95 SessionHandler *session_handler;
96 threadpool_t *threadpool;
97 HttpListener *next;
98 Acceptor **acceptors;
99 Acceptor **acceptors6;
100 int nacceptors;
101 uint32_t nacceptors_running;
102 int running;
103
104 pthread_mutex_t shutdown_mutex;
105 pthread_cond_t shutdown_cond;
106 WSBool shutdown;
107 };
108
109 struct _http_ssl {
110
111
112
113
114
115
116
117
118
119 SSL_CTX *sslctx;
120
121
122 };
123
124 union ws_socketaddr {
125 struct sockaddr_in addr4;
126 struct sockaddr_in6 addr6;
127 };
128
129 struct _ws_socket {
130 union ws_socketaddr addr;
131 struct sockaddr *sockaddr;
132 size_t sockaddr_size;
133 int socket;
134 WSBool listening;
135 HttpSSL *ssl;
136 uint32_t ref;
137 };
138
139
140
141
142
143 int http_listener_global_init(
void);
144
145 int start_all_listener();
146
147 HttpListener* http_listener_create(ListenerConfig *conf);
148
149 void http_listener_destroy(HttpListener *listener);
150
151 int http_listener_start(HttpListener *listener);
152
153
154
155
156
157 int http_listener_socket_eq(HttpListener *l1, HttpListener *l2);
158
159
160
161
162 void http_listener_set_next(HttpListener *listener, HttpListener *next);
163
164
165
166
167
168 int http_listener_connect(HttpListener *listener, WSBool ipv6);
169
170
171
172
173
174
175 void http_listener_shutdown_acceptors(HttpListener *listener);
176
177 Acceptor* acceptor_new(HttpListener *listener);
178
179 void acceptor_start(Acceptor *a);
180
181 void* acceptor_thread(Acceptor *a);
182
183 void wssocket_ref(WSSocket *ws);
184 void wssocket_unref(WSSocket *ws);
185
186 int http_listener_apply_keep_alive_settings(HttpListener *listener,
int fd);
187
188
189 #ifdef __cplusplus
190 }
191 #endif
192
193 #endif
194
195