diff --git a/client.c b/client.c index 14b95e5..769dff4 100644 --- a/client.c +++ b/client.c @@ -266,8 +266,6 @@ http_on_complete(http_parser *p) { struct http_client *c = p->data; int ret = -1; - c->state = CLIENT_EXECUTING; - /* check that the command can be executed */ switch(c->verb) { case HTTP_GET: @@ -402,31 +400,17 @@ http_send_reply(struct http_client *c, short code, const char *msg, http_response_set_body(&resp, body, body_len); /* flush response in the socket */ - if(http_response_write(&resp, c->fd)) { /* failure */ - http_client_free(c); - } else { - switch(c->state) { - case CLIENT_WAITING: - if(!http_client_keep_alive(c)) { - c->state = CLIENT_BROKEN; - } - http_client_reset(c); - http_client_serve(c); - break; - - case CLIENT_EXECUTING: - if(!http_client_keep_alive(c)) { - http_client_free(c); - } else { - http_client_reset(c); - http_client_serve(c); - } - break; - - default: - break; + if(http_response_write(&resp, c->fd) || !http_client_keep_alive(c)) { /* failure */ + if(c->state == CLIENT_EXECUTING) { + http_client_free(c); + return; + } else if(c->state == CLIENT_WAITING) { + c->state = CLIENT_BROKEN; } + } else { + http_client_reset(c); } + http_client_serve(c); } void diff --git a/cmd.c b/cmd.c index c65ed62..eb7d0f8 100644 --- a/cmd.c +++ b/cmd.c @@ -131,6 +131,7 @@ cmd_run(struct server *s, struct http_client *client, /* no args (e.g. INFO command) */ if(!slash) { + client->state = CLIENT_EXECUTING; redisAsyncCommandArgv(s->ac, f_format, client, 1, cmd->argv, cmd->argv_len); return 0; } @@ -159,6 +160,7 @@ cmd_run(struct server *s, struct http_client *client, } /* push command to Redis. */ + client->state = CLIENT_EXECUTING; redisAsyncCommandArgv(s->ac, f_format, client, cmd->count, cmd->argv, cmd->argv_len); for(i = 1; i < cur_param; ++i) { diff --git a/formats/common.c b/formats/common.c index b673e31..e9aebf5 100644 --- a/formats/common.c +++ b/formats/common.c @@ -68,7 +68,7 @@ format_send_reply(struct http_client *client, const char *p, size_t sz, const ch } /* cleanup */ if(free_cmd) { - cmd_free(client->cmd); + cmd_free(cmd); } }