ubus: duplicate request buffer to avoid memory corruption with multiple requests
[project/uhttpd.git] / uhttpd.h
index 3226f8d..0137eef 100644 (file)
--- a/uhttpd.h
+++ b/uhttpd.h
@@ -62,9 +62,11 @@ struct config {
        int network_timeout;
        int rfc1918_filter;
        int tcp_keepalive;
-       int max_requests;
+       int max_script_requests;
+       int max_connections;
        int http_keepalive;
        int script_timeout;
+       int ubus_noauth;
 };
 
 struct auth_realm {
@@ -86,12 +88,26 @@ enum http_version {
        UH_HTTP_VER_1_1,
 };
 
+enum http_user_agent {
+       UH_UA_UNKNOWN,
+       UH_UA_GECKO,
+       UH_UA_CHROME,
+       UH_UA_SAFARI,
+       UH_UA_MSIE,
+       UH_UA_KONQUEROR,
+       UH_UA_OPERA,
+       UH_UA_MSIE_OLD,
+       UH_UA_MSIE_NEW,
+};
+
 struct http_request {
        enum http_method method;
        enum http_version version;
+       enum http_user_agent ua;
        int redirect_status;
        int content_length;
        bool expect_cont;
+       bool connection_close;
        uint8_t transfer_chunked;
        const struct auth_realm *realm;
 };
@@ -130,9 +146,11 @@ struct env_var {
 struct relay {
        struct ustream_fd sfd;
        struct uloop_process proc;
+       struct uloop_timeout timeout;
        struct client *cl;
 
        bool process_done;
+       bool error;
        int ret;
        int header_ofs;
 
@@ -142,6 +160,7 @@ struct relay {
 };
 
 struct dispatch_proc {
+       struct uloop_timeout timeout;
        struct blob_buf hdr;
        struct uloop_fd wrfd;
        struct relay r;
@@ -151,6 +170,7 @@ struct dispatch_proc {
 
 struct dispatch_handler {
        struct list_head list;
+       bool script;
 
        bool (*check_url)(const char *url);
        bool (*check_path)(struct path_info *pi, const char *url);
@@ -184,6 +204,10 @@ struct dispatch {
        void (*write_cb)(struct client *cl);
        void (*close_fds)(struct client *cl);
        void (*free)(struct client *cl);
+
+       void *req_data;
+       void (*req_free)(struct client *cl);
+
        bool data_blocked;
 
        union {
@@ -208,6 +232,7 @@ struct client {
        struct ustream_ssl ssl;
 #endif
        struct uloop_timeout timeout;
+       int requests;
 
        enum client_state state;
        bool tls;
@@ -265,6 +290,7 @@ void uh_dispatch_add(struct dispatch_handler *d);
 void uh_relay_open(struct client *cl, struct relay *r, int fd, int pid);
 void uh_relay_close(struct relay *r, int ret);
 void uh_relay_free(struct relay *r);
+void uh_relay_kill(struct client *cl, struct relay *r);
 
 struct env_var *uh_get_process_vars(struct client *cl, struct path_info *pi);
 bool uh_create_process(struct client *cl, struct path_info *pi, char *url,