mirror of
https://github.com/lxsang/ant-http
synced 2024-11-16 00:28:21 +01:00
remove reverse proxy, it should be handled by the plugin
This commit is contained in:
parent
1f143327e4
commit
6c4713ac62
@ -46,15 +46,15 @@ ssl.enable=0
|
|||||||
; this is helpful to redirect many sub domains
|
; this is helpful to redirect many sub domains
|
||||||
; to a sub folder of the same server
|
; to a sub folder of the same server
|
||||||
; ^([a-zA-Z][a-zA-Z0-9]*)\.[a-zA-Z0-9]+\..*$ = /<1><url>?<query>
|
; ^([a-zA-Z][a-zA-Z0-9]*)\.[a-zA-Z0-9]+\..*$ = /<1><url>?<query>
|
||||||
; example of reverse proxy
|
; example of reverse proxy with the proxy plugin
|
||||||
; ^\/os\/+(.*)$ = http://localhost:80/os/router.lua?r=<1>&<query>
|
; ^\/os\/+(.*)$ = /proxy/http://localhost:80/os/router.lua?r=<1>&<query>
|
||||||
; Sytax: [regular expression on the original request]=[new request rule]
|
; Sytax: [regular expression on the original request]=[new request rule]
|
||||||
|
|
||||||
[PORT:80]
|
[PORT:80]
|
||||||
htdocs=/opt/www/htdocs
|
htdocs=/opt/www/htdocs
|
||||||
; enable or disable SSL
|
; enable or disable SSL
|
||||||
ssl.enable=0
|
ssl.enable=0
|
||||||
^\/os\/+(.*)$ = http://localhost:443/test.html?<query>
|
; ^\/os\/+(.*)$ = /proxy/http://localhost:443/test.html?<query>
|
||||||
; other config shoud be rules applied on this port
|
; other config shoud be rules applied on this port
|
||||||
; For example the following rule will
|
; For example the following rule will
|
||||||
; convert a request of type:
|
; convert a request of type:
|
||||||
|
204
http_server.c
204
http_server.c
@ -755,201 +755,6 @@ char *apply_rules(dictionary_t rules, const char *host, char *url)
|
|||||||
|
|
||||||
return strdup(query_string);
|
return strdup(query_string);
|
||||||
}
|
}
|
||||||
static void *proxy_monitor(void *data)
|
|
||||||
{
|
|
||||||
antd_request_t *rq = (antd_request_t *)data;
|
|
||||||
antd_client_t *proxy = (antd_client_t *)dvalue(rq->request, "PROXY_HANDLE");
|
|
||||||
char* method = (char *)dvalue(rq->request, "METHOD");
|
|
||||||
antd_task_t *task = antd_create_task(NULL, data, NULL, rq->client->last_io);
|
|
||||||
int ret, sz;
|
|
||||||
struct pollfd pfd[2];
|
|
||||||
char *buf = NULL;
|
|
||||||
|
|
||||||
pfd[0].fd = rq->client->sock;
|
|
||||||
pfd[1].fd = proxy->sock;
|
|
||||||
pfd[1].events = POLLIN;
|
|
||||||
pfd[0].events = POLLIN;
|
|
||||||
if(rq->client->ssl)
|
|
||||||
{
|
|
||||||
pfd[0].events |= POLLOUT;
|
|
||||||
}
|
|
||||||
// select
|
|
||||||
ret = poll(pfd, 2, POLL_EVENT_TO);
|
|
||||||
if (ret > 0)
|
|
||||||
{
|
|
||||||
if(
|
|
||||||
pfd[0].revents & POLLERR ||
|
|
||||||
pfd[0].revents & POLLRDHUP ||
|
|
||||||
pfd[0].revents & POLLHUP ||
|
|
||||||
pfd[0].revents & POLLNVAL||
|
|
||||||
pfd[1].revents & POLLERR ||
|
|
||||||
pfd[1].revents & POLLHUP ||
|
|
||||||
pfd[1].revents & POLLRDHUP ||
|
|
||||||
pfd[1].revents & POLLNVAL
|
|
||||||
)
|
|
||||||
{
|
|
||||||
(void)close(proxy->sock);
|
|
||||||
return task;
|
|
||||||
}
|
|
||||||
buf = (char *)malloc(BUFFLEN);
|
|
||||||
memset(buf, '\0', BUFFLEN);
|
|
||||||
if ((pfd[0].revents & POLLIN) || (pfd[0].revents & POLLOUT))
|
|
||||||
{
|
|
||||||
sz = antd_recv_upto(rq->client, buf, BUFFLEN);
|
|
||||||
if ( (sz < 0) || (sz == 0 && !rq->client->ssl) || ( antd_send(proxy, buf, sz) != sz ))
|
|
||||||
{
|
|
||||||
free(buf);
|
|
||||||
(void)close(proxy->sock);
|
|
||||||
return task;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (pfd[1].revents & POLLIN)
|
|
||||||
{
|
|
||||||
if ((sz = antd_recv_upto(proxy, buf, BUFFLEN)) <= 0 || antd_send(rq->client, buf, sz) != sz)
|
|
||||||
{
|
|
||||||
free(buf);
|
|
||||||
(void)close(proxy->sock);
|
|
||||||
return task;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ret < 0)
|
|
||||||
{
|
|
||||||
(void)close(proxy->sock);
|
|
||||||
return task;
|
|
||||||
}
|
|
||||||
|
|
||||||
task->handle = proxy_monitor;
|
|
||||||
task->access_time = rq->client->last_io;
|
|
||||||
// register event
|
|
||||||
if(rq->client->ssl && (EQU(method, "POST") || ws_enable(rq->request)))
|
|
||||||
{
|
|
||||||
antd_task_bind_event(task, rq->client->sock, 0, TASK_EVT_ON_READABLE | TASK_EVT_ON_WRITABLE);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
antd_task_bind_event(task, rq->client->sock, 0, TASK_EVT_ON_READABLE );
|
|
||||||
}
|
|
||||||
antd_task_bind_event(task, proxy->sock, 0, TASK_EVT_ON_READABLE);
|
|
||||||
return task;
|
|
||||||
}
|
|
||||||
static void *proxify(void *data)
|
|
||||||
{
|
|
||||||
int sock_fd, size, ret;
|
|
||||||
char *str = NULL;
|
|
||||||
chain_t it;
|
|
||||||
antd_request_t *rq = (antd_request_t *)data;
|
|
||||||
antd_client_t *proxy = NULL;
|
|
||||||
rq->client->state = ANTD_CLIENT_RESOLVE_REQUEST;
|
|
||||||
char *host = dvalue(rq->request, "PROXY_HOST");
|
|
||||||
int port = atoi(dvalue(rq->request, "PROXY_PORT"));
|
|
||||||
char *path = dvalue(rq->request, "PROXY_PATH");
|
|
||||||
char *query = dvalue(rq->request, "PROXY_QUERY");
|
|
||||||
dictionary_t xheader = dvalue(rq->request, "REQUEST_HEADER");
|
|
||||||
char* method = (char *)dvalue(rq->request, "METHOD");
|
|
||||||
antd_task_t *task = antd_create_task(NULL, data, NULL, rq->client->last_io);
|
|
||||||
if (!xheader)
|
|
||||||
{
|
|
||||||
antd_error(rq->client, 400, "Badd Request");
|
|
||||||
return task;
|
|
||||||
}
|
|
||||||
sock_fd = request_socket(ip_from_hostname(host), port);
|
|
||||||
if (sock_fd == -1)
|
|
||||||
{
|
|
||||||
antd_error(rq->client, 503, "Service Unavailable");
|
|
||||||
return task;
|
|
||||||
}
|
|
||||||
set_nonblock(sock_fd);
|
|
||||||
proxy = (antd_client_t *)malloc(sizeof(antd_client_t));
|
|
||||||
proxy->sock = sock_fd;
|
|
||||||
proxy->ssl = NULL;
|
|
||||||
proxy->zstream = NULL;
|
|
||||||
proxy->z_level = ANTD_CNONE;
|
|
||||||
// store content length here
|
|
||||||
dput(rq->request, "PROXY_HANDLE", proxy);
|
|
||||||
|
|
||||||
str = __s("%s %s?%s HTTP/1.1\r\n", (char *)dvalue(rq->request, "METHOD"), path, query);
|
|
||||||
size = strlen(str);
|
|
||||||
ret = antd_send(proxy, str, size);
|
|
||||||
free(str);
|
|
||||||
if (ret != size)
|
|
||||||
{
|
|
||||||
antd_error(rq->client, 500, "");
|
|
||||||
(void)close(sock_fd);
|
|
||||||
return task;
|
|
||||||
}
|
|
||||||
for_each_assoc(it, xheader)
|
|
||||||
{
|
|
||||||
str = __s("%s: %s\r\n", it->key, (char *)it->value);
|
|
||||||
size = strlen(str);
|
|
||||||
ret = antd_send(proxy, str, size);
|
|
||||||
free(str);
|
|
||||||
if (ret != size)
|
|
||||||
{
|
|
||||||
antd_error(rq->client, 500, "");
|
|
||||||
(void)close(sock_fd);
|
|
||||||
return task;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
(void)antd_send(proxy, "\r\n", 2);
|
|
||||||
// now monitor the proxy
|
|
||||||
task->handle = proxy_monitor;
|
|
||||||
task->access_time = rq->client->last_io;
|
|
||||||
// register event
|
|
||||||
|
|
||||||
if(rq->client->ssl && (EQU(method, "POST") || ws_enable(rq->request)))
|
|
||||||
{
|
|
||||||
antd_task_bind_event(task, rq->client->sock, 0, TASK_EVT_ON_READABLE | TASK_EVT_ON_WRITABLE);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
antd_task_bind_event(task, rq->client->sock, 0, TASK_EVT_ON_READABLE );
|
|
||||||
}
|
|
||||||
antd_task_bind_event(task, proxy->sock, 0, TASK_EVT_ON_READABLE);
|
|
||||||
return task;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Check if the current request is e reverse proxy
|
|
||||||
* return a proxy task if this is the case
|
|
||||||
*/
|
|
||||||
static void *check_proxy(antd_request_t *rq, const char *path, const char *query)
|
|
||||||
{
|
|
||||||
char *pattern = "^(https?)://([^:]+):([0-9]+)(.*)$";
|
|
||||||
char buff[256];
|
|
||||||
regmatch_t matches[5];
|
|
||||||
int ret, size;
|
|
||||||
ret = regex_match(pattern, path, 5, matches);
|
|
||||||
|
|
||||||
if (!ret)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (matches[1].rm_eo - matches[1].rm_so == 5)
|
|
||||||
{
|
|
||||||
// https is not supported for now
|
|
||||||
// TODO add https support
|
|
||||||
antd_error(rq->client, 503, "Service Unavailable");
|
|
||||||
return antd_create_task(NULL, (void *)rq, NULL, time(NULL));
|
|
||||||
}
|
|
||||||
// http proxy request
|
|
||||||
size = matches[2].rm_eo - matches[2].rm_so < (int)sizeof(buff) ? matches[2].rm_eo - matches[2].rm_so : (int)sizeof(buff);
|
|
||||||
(void)memcpy(buff, path + matches[2].rm_so, size);
|
|
||||||
buff[size] = '\0';
|
|
||||||
dput(rq->request, "PROXY_HOST", strdup(buff));
|
|
||||||
|
|
||||||
size = matches[3].rm_eo - matches[3].rm_so < (int)sizeof(buff) ? matches[3].rm_eo - matches[3].rm_so : (int)sizeof(buff);
|
|
||||||
(void)memcpy(buff, path + matches[3].rm_so, size);
|
|
||||||
buff[size] = '\0';
|
|
||||||
dput(rq->request, "PROXY_PORT", strdup(buff));
|
|
||||||
|
|
||||||
dput(rq->request, "PROXY_PATH", strdup(path + matches[4].rm_so));
|
|
||||||
dput(rq->request, "PROXY_QUERY", strdup(query));
|
|
||||||
|
|
||||||
return antd_create_task(proxify, (void *)rq, NULL, rq->client->last_io);
|
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
* Decode the HTTP request header
|
* Decode the HTTP request header
|
||||||
*/
|
*/
|
||||||
@ -1060,15 +865,6 @@ void *decode_request_header(void *data)
|
|||||||
dput(rq->request, "COOKIE", cookie);
|
dput(rq->request, "COOKIE", cookie);
|
||||||
if (host)
|
if (host)
|
||||||
free(host);
|
free(host);
|
||||||
// check if this is a reverse proxy ?
|
|
||||||
task = check_proxy(rq, buf, query);
|
|
||||||
if (task)
|
|
||||||
{
|
|
||||||
if (query)
|
|
||||||
free(query);
|
|
||||||
return task;
|
|
||||||
}
|
|
||||||
// otherwise it a normal query
|
|
||||||
dput(rq->request, "RESOURCE_PATH", url_decode(buf));
|
dput(rq->request, "RESOURCE_PATH", url_decode(buf));
|
||||||
if (query)
|
if (query)
|
||||||
{
|
{
|
||||||
|
8
httpd.c
8
httpd.c
@ -302,12 +302,12 @@ void antd_scheduler_destroy_data(void *data)
|
|||||||
|
|
||||||
int antd_task_data_id(void *data)
|
int antd_task_data_id(void *data)
|
||||||
{
|
{
|
||||||
/*antd_request_t *rq = (antd_request_t *)data;
|
antd_request_t *rq = (antd_request_t *)data;
|
||||||
if(!rq)
|
if(!rq)
|
||||||
return 0;
|
return 0;
|
||||||
return antd_scheduler_next_id(scheduler,rq->client->sock);*/
|
return antd_scheduler_next_id(scheduler,rq->client->sock);
|
||||||
UNUSED(data);
|
//UNUSED(data);
|
||||||
return antd_scheduler_next_id(scheduler,0);
|
//return antd_scheduler_next_id(scheduler,0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
|
Loading…
Reference in New Issue
Block a user