Index: mollom.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/mollom/mollom.inc,v
retrieving revision 1.8
diff -u -p -r1.8 mollom.inc
--- mollom.inc	12 Sep 2010 18:12:50 -0000	1.8
+++ mollom.inc	13 Sep 2010 18:09:53 -0000
@@ -68,24 +68,49 @@ function _mollom_authentication($public_
 function _mollom_retrieve_server_list() {
   // Start from a hard-coded list of servers.
   $servers = array('http://xmlrpc1.mollom.com', 'http://xmlrpc2.mollom.com', 'http://xmlrpc3.mollom.com');
+  $messages = array();
 
   // Use the list of servers to retrieve a list of servers from mollom.com:
+  $method = 'mollom.getServerList';
   foreach ($servers as $server) {
-    $result = xmlrpc($server . '/' . MOLLOM_API_VERSION, array('mollom.getServerList' => array(_mollom_authentication())));
-    if (!xmlrpc_error()) {
-      return $result;
+    $result = xmlrpc($server . '/' . MOLLOM_API_VERSION, array($method => array(_mollom_authentication())));
+    // The mollom.getServerList call can only have one valid error condition:
+    // MOLLOM_REDIRECT, directing us to try the next server in the list. All
+    // other errors are either invalid in this context (i.e., MOLLOM_REFRESH),
+    // or real errors (e.g., invalid API keys).
+    if ($result === FALSE && ($error = xmlrpc_error())) {
+      // Skip to the next server, if requested.
+      if ($error->code === MOLLOM_REDIRECT) {
+        $messages[] = array(
+          'Server %server redirected to: %next.' => array('%server' => $server, '%next' => $next),
+        );
+        continue;
+      }
+      // Any other error is a hard error and we need to stop trying.
+      else {
+        $messages[] = array(
+          'Error @errno from %server for %method: %message' => array(
+            '@errno' => $error->code,
+            '%server' => $server,
+            '%method' => $method,
+            '%message' => $error->message,
+          ),
+        );
+        break;
+      }
     }
+    // Otherwise, we have a valid result.
     else {
-      _mollom_watchdog(array(
-        'Error @errno %message from %server mollom.getServerList' => array(
-          '@errno' => xmlrpc_errno(),
-          '%server' => $server,
-          '%message' => xmlrpc_error_msg(),
-        ),
-      ), WATCHDOG_ERROR);
+      break;
     }
   }
-
-  return xmlrpc_errno();
+  if (is_array($result)) {
+    _mollom_watchdog_multiple($messages, WATCHDOG_DEBUG);
+    return $result;
+  }
+  else {
+    _mollom_watchdog_multiple($messages, WATCHDOG_ERROR);
+    return xmlrpc_errno();
+  }
 }
 
