summaryrefslogtreecommitdiff
path: root/uhttpd.h
diff options
context:
space:
mode:
authorjow <jow@3c298f89-4303-0410-b956-a3cf2f4a3e73>2012-05-28 00:52:24 +0000
committerjow <jow@3c298f89-4303-0410-b956-a3cf2f4a3e73>2012-05-28 00:52:24 +0000
commit4e8baff3b76ee5ff24da13a8e7cf2d220c2aa35d (patch)
tree2ce9e371fcd1f59ca5c6c2d8a296c9a42048821b /uhttpd.h
parent9f8cff6fab8c49d4a6c094e00e71212ebbd39601 (diff)
downloaduhttpd-4e8baff3b76ee5ff24da13a8e7cf2d220c2aa35d.tar.gz
[package] 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 git-svn-id: svn://svn.openwrt.org/openwrt/trunk/package/uhttpd/src@31931 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'uhttpd.h')
-rw-r--r--uhttpd.h89
1 files changed, 66 insertions, 23 deletions
diff --git a/uhttpd.h b/uhttpd.h
index c03d1ae..8fa3f21 100644
--- a/uhttpd.h
+++ b/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];