summaryrefslogtreecommitdiff
path: root/data/lighttpd/lighttpd-1.4.53/src/base.h
diff options
context:
space:
mode:
Diffstat (limited to 'data/lighttpd/lighttpd-1.4.53/src/base.h')
-rw-r--r--data/lighttpd/lighttpd-1.4.53/src/base.h468
1 files changed, 468 insertions, 0 deletions
diff --git a/data/lighttpd/lighttpd-1.4.53/src/base.h b/data/lighttpd/lighttpd-1.4.53/src/base.h
new file mode 100644
index 000000000..b3c508c83
--- /dev/null
+++ b/data/lighttpd/lighttpd-1.4.53/src/base.h
@@ -0,0 +1,468 @@
+#ifndef _BASE_H_
+#define _BASE_H_
+#include "first.h"
+
+#include "settings.h"
+
+#include <sys/types.h>
+#include <sys/time.h>
+
+#include "base_decls.h"
+#include "buffer.h"
+#include "array.h"
+#include "chunk.h"
+#include "http_kv.h"
+#include "sock_addr.h"
+#include "etag.h"
+
+struct fdevents; /* declaration */
+struct stat_cache; /* declaration */
+
+#define DIRECT 0 /* con->mode */
+
+
+typedef struct {
+ /** HEADER */
+ /* the request-line */
+ buffer *request;
+ buffer *uri;
+
+ buffer *orig_uri;
+
+ http_method_t http_method;
+ http_version_t http_version;
+
+ buffer *request_line;
+
+ /* strings to the header */
+ buffer *http_host; /* not alloced */
+
+ unsigned int htags; /* bitfield of flagged headers present in request */
+ array *headers;
+
+ /* CONTENT */
+ off_t content_length; /* returned by strtoll() */
+ off_t te_chunked;
+
+ /* internal */
+ buffer *pathinfo;
+} request;
+
+typedef struct {
+ off_t content_length;
+ int keep_alive; /* used by the subrequests in proxy, cgi and fcgi to say the subrequest was keep-alive or not */
+
+ unsigned int htags; /* bitfield of flagged headers present in response */
+ array *headers;
+ int send_chunked;
+} response;
+
+typedef struct {
+ buffer *scheme; /* scheme without colon or slashes ( "http" or "https" ) */
+
+ /* authority with optional portnumber ("site.name" or "site.name:8080" ) NOTE: without "username:password@" */
+ buffer *authority;
+
+ /* path including leading slash ("/" or "/index.html") - urldecoded, and sanitized ( buffer_path_simplify() && buffer_urldecode_path() ) */
+ buffer *path;
+ buffer *path_raw; /* raw path, as sent from client. no urldecoding or path simplifying */
+ buffer *query; /* querystring ( everything after "?", ie: in "/index.php?foo=1", query is "foo=1" ) */
+} request_uri;
+
+typedef struct {
+ buffer *path;
+ buffer *basedir; /* path = "(basedir)(.*)" */
+
+ buffer *doc_root; /* path = doc_root + rel_path */
+ buffer *rel_path;
+
+ buffer *etag;
+} physical;
+
+typedef struct {
+ array *mimetypes;
+
+ /* virtual-servers */
+ buffer *document_root;
+ buffer *server_name;
+ buffer *error_handler;
+ buffer *error_handler_404;
+ buffer *server_tag;
+ buffer *dirlist_encoding;
+ buffer *errorfile_prefix;
+ buffer *socket_perms;
+
+ unsigned short high_precision_timestamps;
+ unsigned short max_keep_alive_requests;
+ unsigned short max_keep_alive_idle;
+ unsigned short max_read_idle;
+ unsigned short max_write_idle;
+ unsigned short use_xattr;
+ unsigned short follow_symlink;
+ unsigned short range_requests;
+ unsigned short stream_request_body;
+ unsigned short stream_response_body;
+ unsigned short error_intercept;
+
+ /* debug */
+
+ unsigned short log_file_not_found;
+ unsigned short log_request_header;
+ unsigned short log_request_handling;
+ unsigned short log_response_header;
+ unsigned short log_condition_handling;
+ unsigned short log_timeouts;
+
+
+ /* server wide */
+ unsigned short use_ipv6, set_v6only; /* set_v6only is only a temporary option */
+ unsigned short defer_accept;
+ unsigned short ssl_enabled; /* only interesting for setting up listening sockets. don't use at runtime */
+ unsigned short allow_http11;
+ unsigned short etag_use_inode;
+ unsigned short etag_use_mtime;
+ unsigned short etag_use_size;
+ unsigned short force_lowercase_filenames; /* if the FS is case-insensitive, force all files to lower-case */
+ unsigned int http_parseopts;
+ unsigned int max_request_size;
+ int listen_backlog;
+
+ unsigned short kbytes_per_second; /* connection kb/s limit */
+
+ /* configside */
+ unsigned short global_kbytes_per_second; /* */
+
+ off_t global_bytes_per_second_cnt;
+ /* server-wide traffic-shaper
+ *
+ * each context has the counter which is inited once
+ * a second by the global_kbytes_per_second config-var
+ *
+ * as soon as global_kbytes_per_second gets below 0
+ * the connected conns are "offline" a little bit
+ *
+ * the problem:
+ * we somehow have to loose our "we are writable" signal
+ * on the way.
+ *
+ */
+ off_t *global_bytes_per_second_cnt_ptr; /* */
+
+#if defined(__FreeBSD__) || defined(__NetBSD__) \
+ || defined(__OpenBSD__) || defined(__DragonFly__)
+ buffer *bsd_accept_filter;
+#endif
+
+} specific_config;
+
+/* the order of the items should be the same as they are processed
+ * read before write as we use this later */
+typedef enum {
+ CON_STATE_CONNECT,
+ CON_STATE_REQUEST_START,
+ CON_STATE_READ,
+ CON_STATE_REQUEST_END,
+ CON_STATE_READ_POST,
+ CON_STATE_HANDLE_REQUEST,
+ CON_STATE_RESPONSE_START,
+ CON_STATE_WRITE,
+ CON_STATE_RESPONSE_END,
+ CON_STATE_ERROR,
+ CON_STATE_CLOSE
+} connection_state_t;
+
+typedef enum {
+ /* condition not active at the moment because itself or some
+ * pre-condition depends on data not available yet
+ */
+ COND_RESULT_UNSET,
+
+ /* special "unset" for branches not selected due to pre-conditions
+ * not met (but pre-conditions are not "unset" anymore)
+ */
+ COND_RESULT_SKIP,
+
+ /* actually evaluated the condition itself */
+ COND_RESULT_FALSE, /* not active */
+ COND_RESULT_TRUE /* active */
+} cond_result_t;
+
+typedef struct cond_cache_t {
+ /* current result (with preconditions) */
+ cond_result_t result;
+ /* result without preconditions (must never be "skip") */
+ cond_result_t local_result;
+ int patterncount;
+ int matches[3 * 10];
+ buffer *comp_value; /* just a pointer */
+} cond_cache_t;
+
+struct connection {
+ connection_state_t state;
+
+ /* timestamps */
+ time_t read_idle_ts;
+ time_t close_timeout_ts;
+ time_t write_request_ts;
+
+ time_t connection_start;
+ time_t request_start;
+ struct timespec request_start_hp;
+
+ size_t request_count; /* number of requests handled in this connection */
+ size_t loops_per_request; /* to catch endless loops in a single request
+ *
+ * used by mod_rewrite, mod_fastcgi, ... and others
+ * this is self-protection
+ */
+
+ int fd; /* the FD for this connection */
+ int fde_ndx; /* index for the fdevent-handler */
+ int ndx; /* reverse mapping to server->connection[ndx] */
+
+ /* fd states */
+ int is_readable;
+ int is_writable;
+
+ int keep_alive; /* only request.c can enable it, all other just disable */
+ int keep_alive_idle; /* remember max_keep_alive_idle from config */
+
+ int file_started;
+ int file_finished;
+
+ chunkqueue *write_queue; /* a large queue for low-level write ( HTTP response ) [ file, mem ] */
+ chunkqueue *read_queue; /* a small queue for low-level read ( HTTP request ) [ mem ] */
+ chunkqueue *request_content_queue; /* takes request-content into tempfile if necessary [ tempfile, mem ]*/
+
+ int traffic_limit_reached;
+
+ off_t bytes_written; /* used by mod_accesslog, mod_rrd */
+ off_t bytes_written_cur_second; /* used by mod_accesslog, mod_rrd */
+ off_t bytes_read; /* used by mod_accesslog, mod_rrd */
+ off_t bytes_header;
+
+ int http_status;
+
+ sock_addr dst_addr;
+ buffer *dst_addr_buf;
+
+ /* request */
+ buffer *parse_request;
+
+ request request;
+ request_uri uri;
+ physical physical;
+ response response;
+
+ size_t header_len;
+
+ array *environment; /* used to pass lighttpd internal stuff to the FastCGI/CGI apps, setenv does that */
+
+ unsigned int mode; /* DIRECT (0) or plugin id */
+ int async_callback;
+
+ void **plugin_ctx; /* plugin connection specific config */
+
+ specific_config conf; /* global connection specific config */
+ cond_cache_t *cond_cache;
+
+ buffer *server_name;
+ buffer *proto;
+
+ /* error-handler */
+ int error_handler_saved_status;
+ http_method_t error_handler_saved_method;
+
+ struct server_socket *srv_socket; /* reference to the server-socket */
+ int (* network_write)(struct server *srv, struct connection *con, chunkqueue *cq, off_t max_bytes);
+ int (* network_read)(struct server *srv, struct connection *con, chunkqueue *cq, off_t max_bytes);
+
+ /* etag handling */
+ etag_flags_t etag_flags;
+
+ int8_t conditional_is_valid[16]; /* MUST be >= COMP_LAST_ELEMENT] */
+};
+
+typedef struct {
+ connection **ptr;
+ size_t size;
+ size_t used;
+} connections;
+
+typedef struct {
+ time_t mtime; /* the key */
+ buffer *str; /* a buffer for the string represenation */
+} mtime_cache_type;
+
+typedef struct {
+ void *ptr;
+ size_t used;
+ size_t size;
+} buffer_plugin;
+
+typedef struct {
+ unsigned short port;
+ buffer *bindhost;
+
+ buffer *errorlog_file;
+ unsigned short errorlog_use_syslog;
+ buffer *breakagelog_file;
+
+ unsigned short dont_daemonize;
+ unsigned short preflight_check;
+ buffer *changeroot;
+ buffer *username;
+ buffer *groupname;
+
+ buffer *pid_file;
+
+ buffer *event_handler;
+
+ buffer *modules_dir;
+ buffer *network_backend;
+ array *modules;
+ array *upload_tempdirs;
+ unsigned int upload_temp_file_size;
+ unsigned int max_request_field_size;
+
+ unsigned short max_worker;
+ unsigned short max_fds;
+ unsigned short max_conns;
+
+ unsigned short log_request_header_on_error;
+ unsigned short log_state_handling;
+
+ int stat_cache_engine;
+ unsigned short enable_cores;
+ unsigned short reject_expect_100_with_417;
+ buffer *xattr_name;
+
+ unsigned short http_header_strict;
+ unsigned short http_host_strict;
+ unsigned short http_host_normalize;
+ unsigned short http_url_normalize;
+ unsigned short high_precision_timestamps;
+ time_t loadts;
+ double loadavg[3];
+ buffer *syslog_facility;
+
+ unsigned short compat_module_load;
+ unsigned short systemd_socket_activation;
+} server_config;
+
+typedef struct server_socket {
+ sock_addr addr;
+ int fd;
+ int fde_ndx;
+
+ unsigned short is_ssl;
+ unsigned short sidx;
+
+ buffer *srv_token;
+} server_socket;
+
+typedef struct {
+ server_socket **ptr;
+
+ size_t size;
+ size_t used;
+} server_socket_array;
+
+struct server {
+ server_socket_array srv_sockets;
+
+ /* the errorlog */
+ int errorlog_fd;
+ enum { ERRORLOG_FILE, ERRORLOG_FD, ERRORLOG_SYSLOG, ERRORLOG_PIPE } errorlog_mode;
+ buffer *errorlog_buf;
+
+ struct fdevents *ev;
+
+ buffer_plugin plugins;
+ void *plugin_slots;
+
+ /* counters */
+ int con_opened;
+ int con_read;
+ int con_written;
+ int con_closed;
+
+ int max_fds; /* max possible fds */
+ int cur_fds; /* currently used fds */
+ int want_fds; /* waiting fds */
+ int sockets_disabled;
+
+ size_t max_conns;
+
+ /* buffers */
+ buffer *parse_full_path;
+ buffer *response_header;
+ buffer *response_range;
+ buffer *tmp_buf;
+
+ buffer *tmp_chunk_len;
+
+ buffer *empty_string; /* is necessary for cond_match */
+
+ buffer *cond_check_buf;
+
+ /* caches */
+ mtime_cache_type mtime_cache[FILE_CACHE_MAX];
+
+ array *split_vals;
+
+ /* Timestamps */
+ time_t cur_ts;
+ time_t last_generated_date_ts;
+ time_t last_generated_debug_ts;
+ time_t startup_ts;
+
+ buffer *ts_debug_str;
+ buffer *ts_date_str;
+
+ /* config-file */
+ array *config_touched;
+
+ array *config_context;
+ specific_config **config_storage;
+
+ server_config srvconf;
+
+ short int config_deprecated;
+ short int config_unsupported;
+
+ connections *conns;
+ connections *joblist;
+ connections *fdwaitqueue;
+
+ struct stat_cache *stat_cache;
+
+ /**
+ * The status array can carry all the status information you want
+ * the key to the array is <module-prefix>.<name>
+ * and the values are counters
+ *
+ * example:
+ * fastcgi.backends = 10
+ * fastcgi.active-backends = 6
+ * fastcgi.backend.<key>.load = 24
+ * fastcgi.backend.<key>....
+ *
+ * fastcgi.backend.<key>.disconnects = ...
+ */
+ array *status;
+
+ int event_handler;
+
+ int (* network_backend_write)(struct server *srv, int fd, chunkqueue *cq, off_t max_bytes);
+ handler_t (* request_env)(struct server *srv, connection *con);
+
+ uid_t uid;
+ gid_t gid;
+ pid_t pid;
+
+ server_socket_array srv_sockets_inherited;
+};
+
+
+#endif