diff --git a/Makefile b/Makefile index 95fcafb9..0bab2855 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ OUT=webdis HIREDIS_OBJ=hiredis/hiredis.o hiredis/sds.o hiredis/net.o hiredis/async.o hiredis/dict.o JANSSON_OBJ=jansson/src/dump.o jansson/src/error.o jansson/src/hashtable.o jansson/src/load.o jansson/src/strbuffer.o jansson/src/utf.o jansson/src/value.o jansson/src/variadic.o -FORMAT_OBJS=formats/json.o formats/raw.o +FORMAT_OBJS=formats/json.o formats/raw.o formats/common.o OBJS=webdis.o conf.o $(FORMAT_OBJS) cmd.o server.o $(HIREDIS_OBJ) $(JANSSON_OBJ) libb64/cencode.o CFLAGS=-O0 -ggdb -Wall -Wextra -I. -Ijansson/src LDFLAGS=-levent diff --git a/formats/common.c b/formats/common.c new file mode 100644 index 00000000..277354fe --- /dev/null +++ b/formats/common.c @@ -0,0 +1,37 @@ +#include "common.h" +#include "cmd.h" + +#include + +void +format_send_reply(struct cmd *cmd, const char *p, size_t sz, const char *content_type) { + + struct evbuffer *body; + int free_cmd = 1; + + /* send reply */ + body = evbuffer_new(); + evbuffer_add(body, p, sz); + evhttp_add_header(cmd->rq->output_headers, "Content-Type", content_type); + + if(cmd_is_subscribe(cmd)) { + free_cmd = 0; + + /* start streaming */ + if(cmd->started_responding == 0) { + cmd->started_responding = 1; + evhttp_send_reply_start(cmd->rq, 200, "OK"); + } + evhttp_send_reply_chunk(cmd->rq, body); + + } else { + evhttp_send_reply(cmd->rq, 200, "OK", body); + } + /* cleanup */ + evbuffer_free(body); + if(free_cmd) { + evhttp_clear_headers(&cmd->uri_params); + cmd_free(cmd); + } +} + diff --git a/formats/common.h b/formats/common.h new file mode 100644 index 00000000..c47c4f23 --- /dev/null +++ b/formats/common.h @@ -0,0 +1,11 @@ +#ifndef FORMATS_COMMON_H +#define FORMATS_COMMON_H + +#include + +struct cmd; + +void +format_send_reply(struct cmd *cmd, const char *p, size_t sz, const char *content_type); + +#endif diff --git a/formats/json.c b/formats/json.c index b1d649d9..605dbf22 100644 --- a/formats/json.c +++ b/formats/json.c @@ -1,4 +1,5 @@ #include "json.h" +#include "common.h" #include "cmd.h" #include @@ -15,12 +16,10 @@ json_wrap_redis_reply(const struct cmd *cmd, const redisReply *r); void json_reply(redisAsyncContext *c, void *r, void *privdata) { - struct evbuffer *body; redisReply *reply = r; struct cmd *cmd = privdata; json_t *j; char *jstr; - int free_cmd = 1; (void)c; if(cmd == NULL) { @@ -40,32 +39,11 @@ json_reply(redisAsyncContext *c, void *r, void *privdata) { jstr = json_string_output(j, cmd); /* send reply */ - body = evbuffer_new(); - evbuffer_add(body, jstr, strlen(jstr)); - evhttp_add_header(cmd->rq->output_headers, "Content-Type", "application/json"); - - if(cmd_is_subscribe(cmd)) { - free_cmd = 0; - - /* start streaming */ - if(cmd->started_responding == 0) { - cmd->started_responding = 1; - evhttp_send_reply_start(cmd->rq, 200, "OK"); - } - evhttp_send_reply_chunk(cmd->rq, body); - - } else { - evhttp_send_reply(cmd->rq, 200, "OK", body); - } + format_send_reply(cmd, jstr, strlen(jstr), "application/json"); /* cleanup */ - evbuffer_free(body); json_decref(j); free(jstr); - if(free_cmd) { - evhttp_clear_headers(&cmd->uri_params); - cmd_free(cmd); - } } static json_t * diff --git a/formats/raw.c b/formats/raw.c index aae13c43..8c162fd4 100644 --- a/formats/raw.c +++ b/formats/raw.c @@ -1,5 +1,6 @@ #include "raw.h" #include "cmd.h" +#include "common.h" #include #include @@ -13,7 +14,6 @@ raw_wrap(const redisReply *r, size_t *sz); void raw_reply(redisAsyncContext *c, void *r, void *privdata) { - struct evbuffer *body; redisReply *reply = r; struct cmd *cmd = privdata; char *raw_out; @@ -30,14 +30,9 @@ raw_reply(redisAsyncContext *c, void *r, void *privdata) { raw_out = raw_wrap(r, &sz); /* send reply */ - body = evbuffer_new(); - evbuffer_add(body, raw_out, sz); - evhttp_add_header(cmd->rq->output_headers, "Content-Type", "binary/octet-stream"); - evhttp_send_reply(cmd->rq, 200, "OK", body); + format_send_reply(cmd, raw_out, sz, "binary/octet-stream"); /* cleanup */ - evbuffer_free(body); - cmd_free(cmd); free(raw_out); }