diff --git a/README.markdown b/README.markdown index 964fa31..3f4cf6c 100644 --- a/README.markdown +++ b/README.markdown @@ -25,7 +25,7 @@ curl -d "GET/hello" http://127.0.0.1:7379/ * Possible Redis authentication in the config file. * Pub/Sub using `Transfer-Encoding: chunked`, works with JSONP as well. Webdis can be used as a Comet server. * Drop privileges on startup. -* Custom Content-Type using a pre-defined file extension. +* Custom Content-Type using a pre-defined file extension, or with `?type=some/thing`. * URL-encoded parameters for binary data or slashes. For instance, `%2f` is decoded as `/` but not used as a command separator. # Ideas, TODO... @@ -157,7 +157,11 @@ Several content-types are available: * `.json` for `application/json` (this is the default Content-Type). * `.txt` for `text/plain` * `.html` for `text/html` + * `xhtml` for `application/xhtml+xml` + * `xml` for `text/xml` * `.png` for `image/png` + * `jpg` or `jpeg` for `image/jpeg` + * Any other with the `?type=anything/youwant` query string.
 curl -v "http://127.0.0.1:7379/GET/hello.html"	# the key is “hello” here, not “hello.html”
diff --git a/cmd.c b/cmd.c
index fa42bc9..596d4a4 100644
--- a/cmd.c
+++ b/cmd.c
@@ -172,7 +172,7 @@ cmd_run(struct server *s, struct evhttp_request *rq,
 	/* push command to Redis. */
 	redisAsyncCommandArgv(s->ac, f_format, cmd, cmd->count, cmd->argv, cmd->argv_len);
 
-	for(i = 1; i < cmd->count; ++i) {
+	for(i = 1; i < cur_param; ++i) {
 		free((char*)cmd->argv[i]);
 	}
 
@@ -186,7 +186,8 @@ cmd_run(struct server *s, struct evhttp_request *rq,
 int
 cmd_select_format(struct cmd *cmd, const char *uri, size_t uri_len, formatting_fun *f_format) {
 
-	const char *ext, *accept_ct;
+	struct evkeyval *kv;
+	const char *ext;
 	int ext_len = -1;
 	unsigned int i;
 
@@ -202,19 +203,17 @@ cmd_select_format(struct cmd *cmd, const char *uri, size_t uri_len, formatting_f
 		{.s = "raw", .sz = 3, .f = raw_reply, .ct = "binary/octet-stream"},
 		{.s = "txt", .sz = 3, .f = custom_type_reply, .ct = "text/plain"},
 		{.s = "html", .sz = 4, .f = custom_type_reply, .ct = "text/html"},
+		{.s = "xhtml", .sz = 5, .f = custom_type_reply, .ct = "application/xhtml+xml"},
+		{.s = "xml", .sz = 3, .f = custom_type_reply, .ct = "text/xml"},
+
 		{.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"},
 	};
 
 	/* default */
 	*f_format = json_reply;
 
-	/* if there is an Accept header, use it */
-	if((accept_ct = evhttp_find_header(cmd->rq->input_headers, "Accept"))) {
-		cmd->mime = strdup(accept_ct);
-		cmd->mime_free = 1;
-		// printf("Accept: [%s]\n", cmd->mime);
-	}
-
 	/* find extension */
 	for(ext = uri + uri_len - 1; ext != uri && *ext != '/'; --ext) {
 		if(*ext == '.') {
@@ -236,6 +235,18 @@ cmd_select_format(struct cmd *cmd, const char *uri, size_t uri_len, formatting_f
 			*f_format = funs[i].f;
 		}
 	}
+
+	/* the user can force it with ?type=some/thing */
+	TAILQ_FOREACH(kv, &cmd->uri_params, next) {
+		if(strcmp(kv->key, "type") == 0) {
+
+			*f_format = custom_type_reply;
+			cmd->mime = strdup(kv->value);
+			cmd->mime_free = 1;
+
+			break;
+		}
+	}
 	return uri_len - ext_len - 1;
 }