Index: tracspamfilter/captcha/api.py
===================================================================
--- tracspamfilter/captcha/api.py	(revision 9697)
+++ tracspamfilter/captcha/api.py	(working copy)
@@ -18,7 +18,7 @@
 
 from trac.core import *
 from trac.config import ExtensionOption, IntOption
-from trac.web.api import IRequestHandler
+from trac.web.api import IRequestFilter, IRequestHandler
 from tracspamfilter.api import IFilterStrategy, IRejectHandler, RejectContent
 
 
@@ -32,8 +32,10 @@
 
 
 class CaptchaSystem(Component):
-    implements(IRequestHandler, IRejectHandler, IFilterStrategy)
+    implements(IRequestHandler, IRejectHandler, IFilterStrategy, IRequestFilter)
 
+    handlers = ExtensionPoint(IRequestHandler)
+
     captcha = ExtensionOption('spam-filter', 'captcha', ICaptchaMethod,
                               'ExpressionCaptcha',
         """ CAPTCHA method to use for verifying humans. """)
@@ -61,6 +63,8 @@
         if self._expired(req):
             req.session['captcha_reject_reason'] = message
             req.session['captcha_redirect'] = req.href(req.path_info)
+            for key, value in req.args.iteritems():
+                req.session['captcha_arg_%s' % (key)] = value
             req.redirect(req.href.captcha())
         else:
             raise RejectContent(message)
@@ -73,16 +77,8 @@
     def process_request(self, req):
         data = {}
         if req.method == 'POST':
-            self.env.log.debug('CAPTCHA response: %s (expected %s)' % 
-                (req.args['captcha_response'], req.session['captcha_expected']))
             if req.args['captcha_response'] == req.session['captcha_expected']:
-                redirect = req.session.get('captcha_redirect', req.href())
-                del req.session['captcha_redirect']
-                del req.session['captcha_expected']
-                del req.session['captcha_reject_reason']
-                req.session['captcha_verified'] = int(time.time())
-                req.session.save()
-                req.redirect(redirect)
+                data['error'] = 'CAPTCHA failed to handle original request'
             else:
                 data['error'] = 'CAPTCHA verification failed'
         else:
@@ -93,6 +89,38 @@
         req.session.save()
         return 'verify_captcha.html', data, None
 
+    def pre_process_request(self, req, handler):
+        if(req.path_info == '/captcha' and req.method == 'POST' and
+        req.args['captcha_response'] == req.session['captcha_expected']):
+            req.environ['PATH_INFO'] = req.session.get('captcha_redirect', req.href())
+            del req.session['captcha_redirect']
+            del req.session['captcha_expected']
+            del req.session['captcha_reject_reason']
+            req.session['captcha_verified'] = int(time.time())
+            for key, value in req.session.iteritems():
+                if key.startswith('captcha_arg_'):
+                    arg = key[12:]
+                    req.args[arg] = value
+            keys = req.session.keys()
+            for key in keys:
+                if key.startswith('captcha_arg_'):
+                    del req.session[key]
+            req.session.save()
+            try:
+                for newhandler in self.handlers:
+                    if newhandler.match_request(req):
+                        handler = newhandler
+                        break
+            except TracError, e:
+                return (handler)
+        return (handler)
+
+    def post_process_request(self, req, template, content_type):
+        return (template, content_type)
+
+    def post_process_request(self, req, template, data, content_type):
+        return (template, data, content_type)
+
     # Internal methods
 
     def _expired(self, req):
Index: tracspamfilter/adapters.py
===================================================================
--- tracspamfilter/adapters.py	(revision 9697)
+++ tracspamfilter/adapters.py	(working copy)
@@ -87,7 +87,7 @@
 
         text = req.args['text']
         author = req.args.get('author', req.authname)
-        comment = req.args['comment']
+        comment = req.args.get('comment')
 
         # Test the actual page changes as well as the comment
         changes = [(page.text, text), (None, author)]

