From b15cc7d6f4c77fb941c74670eb58fb07bd9c7d9c Mon Sep 17 00:00:00 2001
From: Thomas Bruederli <thomas@roundcube.net>
Date: Fri, 03 May 2013 06:09:57 -0400
Subject: [PATCH] Check Google spell check service response for errors and report them accordingly

---
 program/steps/utils/spell.inc                |    7 +++++++
 program/lib/Roundcube/rcube_spellchecker.php |   15 ++++++++++-----
 2 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/program/lib/Roundcube/rcube_spellchecker.php b/program/lib/Roundcube/rcube_spellchecker.php
index 816bcad..2b48fca 100644
--- a/program/lib/Roundcube/rcube_spellchecker.php
+++ b/program/lib/Roundcube/rcube_spellchecker.php
@@ -314,11 +314,6 @@
         if (!$this->plink) {
             if (!extension_loaded('pspell')) {
                 $this->error = "Pspell extension not available";
-                rcube::raise_error(array(
-                    'code' => 500, 'type' => 'php',
-                    'file' => __FILE__, 'line' => __LINE__,
-                    'message' => $this->error), true, false);
-
                 return;
             }
 
@@ -372,9 +367,19 @@
             fclose($fp);
         }
 
+        // parse HTTP response
+        if (preg_match('!^HTTP/1.\d (\d+)(.+)!', $store, $m)) {
+            $http_status = $m[1];
+            if ($http_status != '200')
+                $this->error = 'HTTP ' . $m[1] . $m[2];
+        }
+
         if (!$store) {
             $this->error = "Empty result from spelling engine";
         }
+        else if (preg_match('/<spellresult error="([^"]+)"/', $store, $m)) {
+            $this->error = "Error code $m[1] returned";
+        }
 
         preg_match_all('/<c o="([^"]*)" l="([^"]*)" s="([^"]*)">([^<]*)<\/c>/', $store, $matches, PREG_SET_ORDER);
 
diff --git a/program/steps/utils/spell.inc b/program/steps/utils/spell.inc
index a0dd35d..b59fe79 100644
--- a/program/steps/utils/spell.inc
+++ b/program/steps/utils/spell.inc
@@ -42,6 +42,13 @@
     $result = $spellchecker->get_xml();
 }
 
+if ($err = $spellchecker->error()) {
+    raise_error(array('code' => 500, 'type' => 'php',
+        'file' => __FILE__, 'line' => __LINE__,
+        'message' => sprintf("Spell check engine error: " . $err)),
+        true, false);
+}
+
 // set response length
 header("Content-Length: " . strlen($result));
 

--
Gitblit v1.9.1