summaryrefslogtreecommitdiff
path: root/hiredis.c
diff options
context:
space:
mode:
authorMichael Grunder <michael.grunder@gmail.com>2020-05-19 12:56:02 -0700
committerGitHub <noreply@github.com>2020-05-19 12:56:02 -0700
commit5c9f49e2123c5df7148939a70b80cd72e4e59646 (patch)
tree7b91fb91c8f32870028ad564f0503e68921e2e8e /hiredis.c
parent243099ccd24b3a02aa3685abcfac77306a3b7d67 (diff)
Resp3 verbatim string support (#805)
Pull RESP3 verbatim string handling from Redis Fixes #802
Diffstat (limited to 'hiredis.c')
-rw-r--r--hiredis.c34
1 files changed, 24 insertions, 10 deletions
diff --git a/hiredis.c b/hiredis.c
index 8e438f2..deb65a9 100644
--- a/hiredis.c
+++ b/hiredis.c
@@ -107,6 +107,7 @@ void freeReplyObject(void *reply) {
case REDIS_REPLY_STATUS:
case REDIS_REPLY_STRING:
case REDIS_REPLY_DOUBLE:
+ case REDIS_REPLY_VERB:
free(r->str);
break;
}
@@ -121,21 +122,34 @@ static void *createStringObject(const redisReadTask *task, char *str, size_t len
if (r == NULL)
return NULL;
- buf = malloc(len+1);
- if (buf == NULL) {
- freeReplyObject(r);
- return NULL;
- }
-
assert(task->type == REDIS_REPLY_ERROR ||
task->type == REDIS_REPLY_STATUS ||
- task->type == REDIS_REPLY_STRING);
+ task->type == REDIS_REPLY_STRING ||
+ task->type == REDIS_REPLY_VERB);
/* Copy string value */
- memcpy(buf,str,len);
- buf[len] = '\0';
+ if (task->type == REDIS_REPLY_VERB) {
+ buf = malloc(len-4+1); /* Skip 4 bytes of verbatim type header. */
+ if (buf == NULL) {
+ freeReplyObject(r);
+ return NULL;
+ }
+ memcpy(r->vtype,str,3);
+ r->vtype[3] = '\0';
+ memcpy(buf,str+4,len-4);
+ buf[len-4] = '\0';
+ r->len = len - 4;
+ } else {
+ buf = malloc(len+1);
+ if (buf == NULL) {
+ freeReplyObject(r);
+ return NULL;
+ }
+ memcpy(buf,str,len);
+ buf[len] = '\0';
+ r->len = len;
+ }
r->str = buf;
- r->len = len;
if (task->parent) {
parent = task->parent->obj;