1
0
mirror of git://projects.qi-hardware.com/openwrt-xburst.git synced 2025-04-21 12:27:27 +03:00

[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@31931 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
jow
2012-05-28 00:52:24 +00:00
parent dfea949949
commit 8b4e17bfbc
18 changed files with 2637 additions and 1393 deletions

View File

@@ -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
#if defined(HAVE_CGI) || defined(HAVE_LUA)
#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) || defined(HAVE_UBUS)
int script_timeout;
#endif
#ifdef HAVE_TLS
@@ -100,41 +123,11 @@ 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 listener {
int socket;
struct sockaddr_in6 addr;
struct config *conf;
#ifdef HAVE_TLS
SSL_CTX *tls;
#endif
struct listener *next;
};
struct client {
int socket;
int peeklen;
char peekbuf[UH_LIMIT_MSGHEAD];
struct listener *server;
struct sockaddr_in6 servaddr;
struct sockaddr_in6 peeraddr;
#ifdef HAVE_TLS
SSL *tls;
#endif
struct client *next;
};
struct auth_realm {
char path[PATH_MAX];
char user[32];
char pass[128];
struct auth_realm *next;
};
struct http_request {
int method;
float version;
@@ -150,6 +143,56 @@ struct http_response {
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
SSL_CTX *tls;
#endif
struct listener *next;
};
struct client {
#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 uloop_fd fd;
};
struct auth_realm {
char path[PATH_MAX];
char user[32];
char pass[128];
struct auth_realm *next;
};
#ifdef HAVE_CGI
struct interpreter {
char path[PATH_MAX];