Modifying behavior to bounce connection in the case of a bad value from
[awesomized/libmemcached] / lib / memcached_response.c
index 4b29a1cbbec259211ef3800954a580f13f4512f9..33dc0b1e5bfd41d9c28bb41d061028ab313fa619 100644 (file)
@@ -19,6 +19,16 @@ memcached_return memcached_response(memcached_server_st *ptr,
 
 
   send_length= 0;
+  /* UDP at the moment is odd...*/
+  if (ptr->type == MEMCACHED_CONNECTION_UDP)
+  {
+    char buffer[8];
+    ssize_t read_length;
+
+    return MEMCACHED_SUCCESS;
+
+    read_length= memcached_io_read(ptr, buffer, 8);
+  }
 
   /* We may have old commands in the buffer not set, first purge */
   if (ptr->root->flags & MEM_NO_BLOCK)
@@ -30,14 +40,19 @@ memcached_return memcached_response(memcached_server_st *ptr,
     size_t total_length= 0;
     buffer_ptr= buffer;
 
+
     while (1)
     {
-      unsigned int read_length;
+      ssize_t read_length;
 
       read_length= memcached_io_read(ptr, buffer_ptr, 1);
+      WATCHPOINT_ASSERT(isgraph(*buffer_ptr) || isspace(*buffer_ptr));
 
       if (read_length != 1)
+      {
+        memcached_io_reset(ptr);
         return  MEMCACHED_UNKNOWN_READ_FAILURE;
+      }
 
       if (*buffer_ptr == '\n')
         break;
@@ -48,7 +63,10 @@ memcached_return memcached_response(memcached_server_st *ptr,
       WATCHPOINT_ASSERT(total_length <= buffer_length);
 
       if (total_length >= buffer_length)
+      {
+        memcached_io_reset(ptr);
         return MEMCACHED_PROTOCOL_ERROR;
+      }
     }
     buffer_ptr++;
     *buffer_ptr= 0;
@@ -80,6 +98,7 @@ memcached_return memcached_response(memcached_server_st *ptr,
     {
       WATCHPOINT_STRING(buffer);
       WATCHPOINT_ASSERT(0);
+      memcached_io_reset(ptr);
       return MEMCACHED_UNKNOWN_READ_FAILURE;
     }
   case 'O': /* OK */
@@ -99,6 +118,7 @@ memcached_return memcached_response(memcached_server_st *ptr,
       {
         WATCHPOINT_STRING(buffer);
         WATCHPOINT_ASSERT(0);
+        memcached_io_reset(ptr);
         return MEMCACHED_UNKNOWN_READ_FAILURE;
       }
     }
@@ -111,20 +131,31 @@ memcached_return memcached_response(memcached_server_st *ptr,
       else if (buffer[4] == 'S')
         return MEMCACHED_NOTSTORED;
       else
+      {
+        memcached_io_reset(ptr);
         return MEMCACHED_UNKNOWN_READ_FAILURE;
+      }
     }
   case 'E': /* PROTOCOL ERROR or END */
     {
       if (buffer[1] == 'N')
         return MEMCACHED_END;
       else if (buffer[1] == 'R')
+      {
+        memcached_io_reset(ptr);
         return MEMCACHED_PROTOCOL_ERROR;
+      }
       else
+      {
+        memcached_io_reset(ptr);
         return MEMCACHED_UNKNOWN_READ_FAILURE;
+      }
     }
   case 'C': /* CLIENT ERROR */
+    memcached_io_reset(ptr);
     return MEMCACHED_CLIENT_ERROR;
   default:
+    memcached_io_reset(ptr);
     return MEMCACHED_UNKNOWN_READ_FAILURE;
 
   }