#define REPLY_INT 0
#define REPLY_RETCODE 1
#define REPLY_BULK 2
-#define REPLY_MBULK 2
+#define REPLY_MBULK 3
#define CLIENT_CONNECTING 0
#define CLIENT_SENDQUERY 1
c->ibuf = sdscatlen(c->ibuf,buf,nread);
processdata:
+ /* Are we waiting for the first line of the command of for sdf
+ * count in bulk or multi bulk operations? */
if (c->replytype == REPLY_INT ||
c->replytype == REPLY_RETCODE ||
(c->replytype == REPLY_BULK && c->readlen == -1) ||
(c->replytype == REPLY_MBULK && c->mbulk == -1)) {
char *p;
+ /* Check if the first line is complete. This is only true if
+ * there is a newline inside the buffer. */
if ((p = strchr(c->ibuf,'\n')) != NULL) {
if (c->replytype == REPLY_BULK ||
(c->replytype == REPLY_MBULK && c->mbulk != -1))
{
+ /* Read the count of a bulk reply (being it a single bulk or
+ * a multi bulk reply). "$<count>" for the protocol spec. */
*p = '\0';
*(p-1) = '\0';
c->readlen = atoi(c->ibuf+1)+2;
}
/* Leave all the rest in the input buffer */
c->ibuf = sdsrange(c->ibuf,(p-c->ibuf)+1,-1);
+ /* fall through to reach the point where the code will try
+ * to check if the bulk reply is complete. */
} else if (c->replytype == REPLY_MBULK && c->mbulk == -1) {
+ /* Read the count of a multi bulk reply. That is, how many
+ * bulk replies we have to read next. "*<count>" protocol. */
*p = '\0';
*(p-1) = '\0';
c->mbulk = atoi(c->ibuf+1);
}
}
/* bulk read, did we read everything? */
- if ((c->replytype == REPLY_BULK || c->replytype == REPLY_MBULK) &&
- (unsigned)c->readlen <= sdslen(c->ibuf))
+ if (((c->replytype == REPLY_MBULK && c->mbulk != -1) ||
+ (c->replytype == REPLY_BULK)) && c->readlen != -1 &&
+ (unsigned)c->readlen <= sdslen(c->ibuf))
{
if (c->replytype == REPLY_BULK) {
clientDone(c);