From a8bccb4d40b0a5008f9a7db2dcfd12e73159d88c Mon Sep 17 00:00:00 2001 From: Nicolas Favre-Felix Date: Sat, 1 Jan 2011 14:27:57 +0100 Subject: [PATCH] Refactoring --- cmd.h | 2 +- server.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++ server.h | 9 +++++++ webdis.c | 72 ++++---------------------------------------------------- 4 files changed, 83 insertions(+), 69 deletions(-) diff --git a/cmd.h b/cmd.h index a30f339..e2e1857 100644 --- a/cmd.h +++ b/cmd.h @@ -4,8 +4,8 @@ #include #include #include -#include #include +#include struct evhttp_request; struct server; diff --git a/server.c b/server.c index e04d99a..fe2ebc4 100644 --- a/server.c +++ b/server.c @@ -6,6 +6,20 @@ #include #include +#include +#include + +struct server * +server_new(const char *filename) { + struct server *s = calloc(1, sizeof(struct server)); + + s->cfg = conf_read(filename); + s->base = event_base_new(); + s->http = evhttp_new(s->base); + + return s; +} + static void connectCallback(const redisAsyncContext *c) { ((void)c); @@ -79,3 +93,58 @@ server_copy(const struct server *s) { return ret; } +void +on_request(struct evhttp_request *rq, void *ctx) { + + const char *uri = evhttp_request_uri(rq); + struct server *s = ctx; + int ret; + + if(!s->ac) { /* redis is unavailable */ + printf("503\n"); + evhttp_send_reply(rq, 503, "Service Unavailable", NULL); + return; + } + + /* check that the command can be executed */ + switch(rq->type) { + case EVHTTP_REQ_GET: + ret = cmd_run(s, rq, 1+uri, strlen(uri)-1); + break; + + case EVHTTP_REQ_POST: + ret = cmd_run(s, rq, + (const char*)EVBUFFER_DATA(rq->input_buffer), + EVBUFFER_LENGTH(rq->input_buffer)); + break; + + default: + printf("405\n"); + evhttp_send_reply(rq, 405, "Method Not Allowed", NULL); + return; + } + + if(ret < 0) { + evhttp_send_reply(rq, 403, "Forbidden", NULL); + } +} + +void +server_start(struct server *s) { + + /* ignore sigpipe */ +#ifdef SIGPIPE + signal(SIGPIPE, SIG_IGN); +#endif + + /* start http server */ + evhttp_bind_socket(s->http, s->cfg->http_host, s->cfg->http_port); + evhttp_set_gencb(s->http, on_request, s); + + /* attach hiredis to libevent base */ + webdis_connect(s); + + /* loop */ + event_base_dispatch(s->base); +} + diff --git a/server.h b/server.h index fdfaf5a..998c9a0 100644 --- a/server.h +++ b/server.h @@ -6,11 +6,14 @@ #include #include +struct evhttp; + struct server { struct conf *cfg; struct event_base *base; redisAsyncContext *ac; + struct evhttp *http; struct event ev_reconnect; struct timeval tv_reconnect; @@ -19,8 +22,14 @@ struct server { void webdis_connect(struct server *s); +struct server * +server_new(const char *filename); + struct server * server_copy(const struct server *s); +void +server_start(struct server *s); + #endif diff --git a/webdis.c b/webdis.c index 9756ecb..aecfa02 100644 --- a/webdis.c +++ b/webdis.c @@ -1,82 +1,18 @@ #include -#include -#include -#include -#include -#include -#include - -#include -#include - #include "server.h" -#include "conf.h" -#include "cmd.h" - - -void -on_request(struct evhttp_request *rq, void *ctx) { - - const char *uri = evhttp_request_uri(rq); - struct server *s = ctx; - int ret; - - if(!s->ac) { /* redis is unavailable */ - printf("503\n"); - evhttp_send_reply(rq, 503, "Service Unavailable", NULL); - return; - } - - /* check that the command can be executed */ - switch(rq->type) { - case EVHTTP_REQ_GET: - ret = cmd_run(s, rq, 1+uri, strlen(uri)-1); - break; - - case EVHTTP_REQ_POST: - ret = cmd_run(s, rq, - (const char*)EVBUFFER_DATA(rq->input_buffer), - EVBUFFER_LENGTH(rq->input_buffer)); - break; - - default: - printf("405\n"); - evhttp_send_reply(rq, 405, "Method Not Allowed", NULL); - return; - } - - if(ret < 0) { - evhttp_send_reply(rq, 403, "Forbidden", NULL); - } -} int main(int argc, char *argv[]) { - struct server *s = calloc(1, sizeof(struct server)); - s->base = event_base_new(); - struct evhttp *http = evhttp_new(s->base); + struct server *s; if(argc > 1) { - s->cfg = conf_read(argv[1]); + s = server_new(argv[1]); } else { - s->cfg = conf_read("webdis.json"); + s = server_new("webdis.json"); } - /* ignore sigpipe */ -#ifdef SIGPIPE - signal(SIGPIPE, SIG_IGN); -#endif - - /* start http server */ - evhttp_bind_socket(http, s->cfg->http_host, s->cfg->http_port); - evhttp_set_gencb(http, on_request, s); - - /* attach hiredis to libevent base */ - webdis_connect(s); - - /* loop */ - event_base_dispatch(s->base); + server_start(s); return EXIT_SUCCESS; }