X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Fmemcached_response.c;h=ba0691b504a39590c67184d830e2c1753222cec4;hb=30578d352bf73625ef5a7528b7d583e5acd1ed1a;hp=193bfd8c2c3b3ad6f5fafd469504688e24cfcace;hpb=a91a68a7c685f82bc6f46c09fa2036e44a82e7f7;p=m6w6%2Flibmemcached diff --git a/libmemcached/memcached_response.c b/libmemcached/memcached_response.c index 193bfd8c..ba0691b5 100644 --- a/libmemcached/memcached_response.c +++ b/libmemcached/memcached_response.c @@ -237,8 +237,34 @@ static memcached_return textual_read_one_response(memcached_server_st *ptr, memcached_server_response_increment(ptr); return MEMCACHED_STAT; } - else if (buffer[1] == 'E') - return MEMCACHED_SERVER_ERROR; + else if (buffer[1] == 'E') /* SERVER_ERROR */ + { + char *rel_ptr; + char *startptr= buffer + 13, *endptr= startptr; + + while (*endptr != '\r' && *endptr != '\n') endptr++; + + /* + Yes, we could make this "efficent" but to do that we would need + to maintain more state for the size of the buffer. Why waste + memory in the struct, which is important, for something that + rarely should happen? + */ + rel_ptr= (char *)ptr->root->call_realloc(ptr->root, ptr->cached_server_error, endptr - startptr + 1); + + if (rel_ptr == NULL) + { + /* If we happened to have some memory, we just null it since we don't know the size */ + if (ptr->cached_server_error) + ptr->cached_server_error[0]= 0; + return MEMCACHED_SERVER_ERROR; + } + ptr->cached_server_error= rel_ptr; + + memcpy(ptr->cached_server_error, startptr, endptr - startptr); + ptr->cached_server_error[endptr - startptr]= 0; + return MEMCACHED_SERVER_ERROR; + } else if (buffer[1] == 'T') return MEMCACHED_STORED; else @@ -270,6 +296,10 @@ static memcached_return textual_read_one_response(memcached_server_st *ptr, else return MEMCACHED_UNKNOWN_READ_FAILURE; } + case 'I': /* CLIENT ERROR */ + /* We add back in one because we will need to search for END */ + memcached_server_response_increment(ptr); + return MEMCACHED_ITEM; case 'C': /* CLIENT ERROR */ return MEMCACHED_CLIENT_ERROR; default: @@ -391,13 +421,11 @@ static memcached_return binary_read_one_response(memcached_server_st *ptr, WATCHPOINT_ASSERT(bodylen == 0); return MEMCACHED_SUCCESS; } - break; case PROTOCOL_BINARY_CMD_NOOP: { WATCHPOINT_ASSERT(bodylen == 0); return MEMCACHED_END; } - break; case PROTOCOL_BINARY_CMD_STAT: { if (bodylen == 0)