1 #ifndef _BASE_H_
2 #define _BASE_H_
3 #include "first.h"
4
5 #include "sys-time.h"
6
7 #include "base_decls.h"
8 #include "buffer.h"
9 #include "array.h"
10 #include "chunk.h"
11 #include "http_kv.h"
12 #include "request.h"
13 #include "sock_addr.h"
14
15 struct fdevents; /* declaration */
16 struct server_socket; /* declaration */
17
18
19 struct connection {
20
21 request_st request;
22 h2con *h2;
23
24 int fd; /* the FD for this connection */
25 fdnode *fdn; /* fdevent (fdnode *) object */
26 connection *jqnext;
27
28 /* fd states */
29 signed char is_readable;
30 signed char is_writable;
31 char is_ssl_sock;
32 char traffic_limit_reached;
33 uint16_t revents_err;
34 uint16_t proto_default_port;
35
36 chunkqueue *write_queue; /* a large queue for low-level write ( HTTP response ) [ file, mem ] */
37 chunkqueue *read_queue; /* a small queue for low-level read ( HTTP request ) [ mem ] */
38
39 off_t bytes_written_cur_second; /* used by rate-limiting and mod_status */
40
41 int (* network_write)(struct connection *con, chunkqueue *cq, off_t max_bytes);
42 int (* network_read)(struct connection *con, chunkqueue *cq, off_t max_bytes);
43 handler_t (* reqbody_read)(struct request_st *r);
44
45 server *srv;
46 void *plugin_slots;
47 void **plugin_ctx; /* plugin connection specific config */
48 void *config_data_base;
49
50 sock_addr dst_addr;
51 buffer dst_addr_buf;
52 const struct server_socket *srv_socket; /* reference to the server-socket */
53
54 /* timestamps */
55 unix_time64_t read_idle_ts;
56 unix_time64_t close_timeout_ts;
57 unix_time64_t write_request_ts;
58 unix_time64_t connection_start;
59
60 uint32_t request_count; /* number of requests handled in this connection */
61 int keep_alive_idle; /* remember max_keep_alive_idle from config */
62
63 connection *next;
64 connection *prev;
65 };
66
67 /* log_con_jqueue is in log.c to be defined in shared object */
68 #define joblist_append(con) connection_jq_append(con)
69 extern connection *log_con_jqueue;
70 static inline void connection_jq_append(connection * const restrict con);
connection_jq_append(connection * const restrict con)71 static inline void connection_jq_append(connection * const restrict con)
72 {
73 if (!con->jqnext) {
74 con->jqnext = log_con_jqueue;
75 log_con_jqueue = con;
76 }
77 }
78
79 typedef struct {
80 /*(used sparsely, if at all, after config at startup)*/
81
82 uint32_t max_request_field_size;
83 unsigned char log_request_header_on_error;
84 unsigned char http_header_strict;
85 unsigned char http_host_strict;
86 unsigned char http_host_normalize;
87 unsigned char http_method_get_body;
88 unsigned char high_precision_timestamps;
89 unsigned char h2proto;
90 unsigned char absolute_dir_redirect;
91 unsigned short http_url_normalize;
92
93 unsigned short max_worker;
94 unsigned short max_fds;
95 unsigned short max_conns;
96 unsigned short port;
97
98 unsigned int upload_temp_file_size;
99 array *upload_tempdirs;
100
101 unsigned char dont_daemonize;
102 unsigned char preflight_check;
103 unsigned char enable_cores;
104 unsigned char compat_module_load;
105 unsigned char config_deprecated;
106 unsigned char config_unsupported;
107 unsigned char systemd_socket_activation;
108 unsigned char errorlog_use_syslog;
109 const buffer *syslog_facility;
110 const buffer *bindhost;
111 const buffer *changeroot;
112 const buffer *username;
113 const buffer *groupname;
114 const buffer *network_backend;
115 const array *feature_flags;
116 const char *event_handler;
117 const char *modules_dir;
118 buffer *pid_file;
119 array *modules;
120 array *config_touched;
121 array empty_array;
122 } server_config;
123
124 typedef struct server_socket {
125 sock_addr addr;
126 int fd;
127
128 uint8_t is_ssl;
129 uint8_t srv_token_colon;
130 unsigned short sidx;
131
132 fdnode *fdn;
133 server *srv;
134 buffer *srv_token;
135 } server_socket;
136
137 typedef struct {
138 server_socket **ptr;
139 uint32_t used;
140 } server_socket_array;
141
142 struct server {
143 void *plugin_slots;
144 array *config_context;
145 int config_captures;
146
147 struct fdevents *ev;
148 int (* network_backend_write)(int fd, chunkqueue *cq, off_t max_bytes, log_error_st *errh);
149 handler_t (* request_env)(request_st *r);
150
151 /* buffers */
152 buffer *tmp_buf;
153
154 int max_fds; /* max possible fds */
155 int max_fds_lowat;/* low watermark */
156 int max_fds_hiwat;/* high watermark */
157 int cur_fds; /* currently used fds */
158 int sockets_disabled;
159
160 uint32_t lim_conns;
161 connection *conns;
162 connection *conns_pool;
163
164 log_error_st *errh;
165
166 unix_time64_t loadts;
167 double loadavg[3];
168
169 /* members used at start-up or rarely used */
170
171 handler_t (* plugins_request_reset)(request_st *r);/*(for cgi.local-redir)*/
172
173 server_config srvconf;
174 void *config_data_base;
175
176 server_socket_array srv_sockets;
177 server_socket_array srv_sockets_inherited;
178 struct { void *ptr; uint32_t used; } plugins;
179
180 unix_time64_t startup_ts;
181 unix_time64_t graceful_expire_ts;
182
183 uid_t uid;
184 gid_t gid;
185 pid_t pid;
186 int stdin_fd;
187
188 const buffer *default_server_tag;
189 char **argv;
190 #ifdef HAVE_PCRE2_H
191 void *match_data; /*(shared and reused)*/
192 #endif
193 };
194
195
196 #endif
197