diff options
author | Jo-Philipp Wich <jow@openwrt.org> | 2012-05-28 00:52:24 +0000 |
---|---|---|
committer | Jo-Philipp Wich <jow@openwrt.org> | 2012-05-28 00:52:24 +0000 |
commit | 022fa36b40b02248436584cf0f71bb26d79eb644 (patch) | |
tree | 8cb1f4d8f1ab4f1aee4538621684a188101c867c /package/uhttpd/src/uhttpd.h | |
parent | 8039a1bbb2056019458b5179108e399d0fcb0622 (diff) | |
download | upstream-022fa36b40b02248436584cf0f71bb26d79eb644.tar.gz upstream-022fa36b40b02248436584cf0f71bb26d79eb644.tar.bz2 upstream-022fa36b40b02248436584cf0f71bb26d79eb644.zip |
uhttpd: - rewrite large parts of the server, use uloop event driven structure - support concurrent requests and make the upper limit configurable - implement initial version of HTTP-to-ubus JSON proxy and session.* namespace - add compile time support for debug information - code style changes - bump package revision
SVN-Revision: 31931
Diffstat (limited to 'package/uhttpd/src/uhttpd.h')
-rw-r--r-- | package/uhttpd/src/uhttpd.h | 89 |
1 files changed, 66 insertions, 23 deletions
diff --git a/package/uhttpd/src/uhttpd.h b/package/uhttpd/src/uhttpd.h index c03d1ae651..8fa3f219b7 100644 --- a/package/uhttpd/src/uhttpd.h +++ b/package/uhttpd/src/uhttpd.h @@ -20,6 +20,7 @@ #include <stdio.h> #include <stdlib.h> +#include <stdbool.h> #include <string.h> #include <unistd.h> #include <signal.h> @@ -36,6 +37,9 @@ #include <errno.h> #include <dlfcn.h> +#include <libubox/list.h> +#include <libubox/uloop.h> + #ifdef HAVE_LUA #include <lua.h> @@ -50,6 +54,12 @@ #define SOL_TCP 6 #endif +#ifdef DEBUG +#define D(...) fprintf(stderr, __VA_ARGS__) +#else +#define D(...) +#endif + #define UH_LIMIT_MSGHEAD 4096 #define UH_LIMIT_HEADERS 64 @@ -60,10 +70,14 @@ #define UH_HTTP_MSG_HEAD 1 #define UH_HTTP_MSG_POST 2 +#define UH_SOCK_CLIENT 0 +#define UH_SOCK_SERVER 1 + struct listener; struct client; struct interpreter; struct http_request; +struct uh_ubus_state; struct config { char docroot[PATH_MAX]; @@ -76,6 +90,7 @@ struct config { int network_timeout; int rfc1918_filter; int tcp_keepalive; + int max_requests; #ifdef HAVE_CGI char *cgi_prefix; #endif @@ -85,9 +100,17 @@ struct config { lua_State *lua_state; lua_State * (*lua_init) (const struct config *conf); void (*lua_close) (lua_State *L); - void (*lua_request) (struct client *cl, struct http_request *req, lua_State *L); + bool (*lua_request) (struct client *cl, lua_State *L); +#endif +#ifdef HAVE_UBUS + char *ubus_prefix; + char *ubus_socket; + void *ubus_state; + struct uh_ubus_state * (*ubus_init) (const struct config *conf); + void (*ubus_close) (struct uh_ubus_state *state); + bool (*ubus_request) (struct client *cl, struct uh_ubus_state *state); #endif -#if defined(HAVE_CGI) || defined(HAVE_LUA) +#if defined(HAVE_CGI) || defined(HAVE_LUA) || defined(HAVE_UBUS) int script_timeout; #endif #ifdef HAVE_TLS @@ -100,13 +123,30 @@ struct config { void (*tls_free) (struct listener *l); int (*tls_accept) (struct client *c); void (*tls_close) (struct client *c); - int (*tls_recv) (struct client *c, void *buf, int len); - int (*tls_send) (struct client *c, void *buf, int len); + int (*tls_recv) (struct client *c, char *buf, int len); + int (*tls_send) (struct client *c, const char *buf, int len); #endif }; +struct http_request { + int method; + float version; + int redirect_status; + char *url; + char *headers[UH_LIMIT_HEADERS]; + struct auth_realm *realm; +}; + +struct http_response { + int statuscode; + char *statusmsg; + char *headers[UH_LIMIT_HEADERS]; +}; + struct listener { + struct uloop_fd fd; int socket; + int n_clients; struct sockaddr_in6 addr; struct config *conf; #ifdef HAVE_TLS @@ -116,16 +156,34 @@ struct listener { }; struct client { - int socket; - int peeklen; - char peekbuf[UH_LIMIT_MSGHEAD]; +#ifdef HAVE_TLS + SSL *tls; +#endif + struct uloop_fd fd; + struct uloop_process proc; + struct uloop_timeout timeout; + bool (*cb)(struct client *); + void *priv; + bool dispatched; + bool dead; + struct { + char buf[UH_LIMIT_MSGHEAD]; + char *ptr; + int len; + } httpbuf; struct listener *server; + struct http_request request; + struct http_response response; struct sockaddr_in6 servaddr; struct sockaddr_in6 peeraddr; + struct client *next; +}; + +struct client_light { #ifdef HAVE_TLS SSL *tls; #endif - struct client *next; + struct uloop_fd fd; }; struct auth_realm { @@ -135,21 +193,6 @@ struct auth_realm { struct auth_realm *next; }; -struct http_request { - int method; - float version; - int redirect_status; - char *url; - char *headers[UH_LIMIT_HEADERS]; - struct auth_realm *realm; -}; - -struct http_response { - int statuscode; - char *statusmsg; - char *headers[UH_LIMIT_HEADERS]; -}; - #ifdef HAVE_CGI struct interpreter { char path[PATH_MAX]; |