diff --git a/README.markdown b/README.markdown index db98035..d35011d 100644 --- a/README.markdown +++ b/README.markdown @@ -2,6 +2,7 @@ A very simple web server providing an HTTP interface to Redis. It uses [hiredis](https://github.com/antirez/hiredis), [jansson](https://github.com/akheron/jansson), [libevent](http://monkey.org/~provos/libevent/), and [http-parser](https://github.com/ry/http-parser/). +Webdis depends on libevent-dev. You can install it on Ubuntu by typing `sudo apt-get install libevent-dev` or on OS X by typing `brew install libevent`.
 make clean all
 
diff --git a/cmd.c b/cmd.c
index 09abccc..1ed83f3 100644
--- a/cmd.c
+++ b/cmd.c
@@ -204,6 +204,9 @@ cmd_select_format(struct http_client *client, struct cmd *cmd,
 		{.s = "png", .sz = 3, .f = custom_type_reply, .ct = "image/png"},
 		{.s = "jpg", .sz = 3, .f = custom_type_reply, .ct = "image/jpeg"},
 		{.s = "jpeg", .sz = 4, .f = custom_type_reply, .ct = "image/jpeg"},
+
+		{.s = "js", .sz = 2, .f = custom_type_reply, .ct = "application/javascript"},
+		{.s = "css", .sz = 3, .f = custom_type_reply, .ct = "text/css"},
 	};
 
 	/* default */
diff --git a/formats/raw.c b/formats/raw.c
index f8a1767..11c293c 100644
--- a/formats/raw.c
+++ b/formats/raw.c
@@ -55,17 +55,17 @@ raw_array(const redisReply *r, size_t *sz) {
 
 	/* compute size */
 	*sz = 0;
-	*sz += 1 + integer_length(r->elements) + 1;
+	*sz += 1 + integer_length(r->elements) + 2;
 	for(i = 0; i < r->elements; ++i) {
 		redisReply *e = r->element[i];
 		switch(e->type) {
 			case REDIS_REPLY_STRING:
-				*sz += 1 + integer_length(e->len) + 1
-					+ e->len + 1;
+				*sz += 1 + integer_length(e->len) + 2
+					+ e->len + 2;
 				break;
 			case REDIS_REPLY_INTEGER:
-				*sz += 1 + integer_length(integer_length(e->integer)) + 1
-					+ integer_length(e->integer) + 1;
+				*sz += 1 + integer_length(integer_length(e->integer)) + 2
+					+ integer_length(e->integer) + 2;
 				break;
 
 		}
@@ -73,21 +73,23 @@ raw_array(const redisReply *r, size_t *sz) {
 
 	/* allocate */
 	p = ret = malloc(*sz);
-	p += sprintf(p, "*%zd\n", r->elements);
+	p += sprintf(p, "*%zd\r\n", r->elements);
 
 	/* copy */
 	for(i = 0; i < r->elements; ++i) {
 		redisReply *e = r->element[i];
 		switch(e->type) {
 			case REDIS_REPLY_STRING:
-				p += sprintf(p, "$%d\n", e->len);
+				p += sprintf(p, "$%d\r\n", e->len);
 				memcpy(p, e->str, e->len);
 				p += e->len;
+				*p = '\r';
+				p++;
 				*p = '\n';
 				p++;
 				break;
 			case REDIS_REPLY_INTEGER:
-				p += sprintf(p, "$%d\n%lld\n",
+				p += sprintf(p, "$%d\r\n%lld\r\n",
 					integer_length(e->integer), e->integer);
 				break;
 		}
@@ -104,34 +106,34 @@ raw_wrap(const redisReply *r, size_t *sz) {
 	switch(r->type) {
 		case REDIS_REPLY_STATUS:
 		case REDIS_REPLY_ERROR:
-			*sz = 2 + r->len;
+			*sz = 3 + r->len;
 			ret = malloc(*sz);
 			ret[0] = (r->type == REDIS_REPLY_STATUS?'+':'-');
-			memcpy(ret+1, r->str, *sz-2);
-			memcpy(ret+*sz - 1, "\n", 1);
+			memcpy(ret+1, r->str, *sz-3);
+			memcpy(ret+*sz - 2, "\r\n", 2);
 			return ret;
 
 		case REDIS_REPLY_STRING:
-			*sz = 1 + integer_length(r->len) + 1 + r->len + 1;
+			*sz = 1 + integer_length(r->len) + 2 + r->len + 2;
 			p = ret = malloc(*sz);
-			p += sprintf(p, "$%d\n", r->len);
-			memcpy(p, r->str, *sz - 1 - (p-ret));
-			memcpy(ret + *sz - 1, "\n", 1);
+			p += sprintf(p, "$%d\r\n", r->len);
+			memcpy(p, r->str, *sz - 2 - (p-ret));
+			memcpy(ret + *sz - 2, "\r\n", 2);
 			return ret;
 
 		case REDIS_REPLY_INTEGER:
-			*sz = 2 + integer_length(r->integer);
-			ret = malloc(3+*sz);
-			sprintf(ret, ":%lld\n", r->integer);
+			*sz = 3 + integer_length(r->integer);
+			ret = malloc(4+*sz);
+			sprintf(ret, ":%lld\r\n", r->integer);
 			return ret;
 
 		case REDIS_REPLY_ARRAY:
 			return raw_array(r, sz);
 
 		default:
-			*sz = 4;
+			*sz = 5;
 			ret = malloc(*sz);
-			memcpy(ret, "$-1\n", 4);
+			memcpy(ret, "$-1\r\n", 5);
 			return ret;
 	}
 }