changeset 63:b19641a0d5ad

Refactoring: better querystring parsing.
author Atul Varma <varmaa@toolness.com>
date Wed, 29 Apr 2009 16:26:21 -0700
parents b7b9932823e4
children 559c48a58254
files openwebchat.py
diffstat 1 files changed, 27 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/openwebchat.py	Wed Apr 29 06:15:32 2009 -0700
+++ b/openwebchat.py	Wed Apr 29 16:26:21 2009 -0700
@@ -6,6 +6,7 @@
 import cStringIO
 import mimetools
 import weakref
+import cgi
 
 from cosocket import *
 import channels
@@ -48,8 +49,15 @@
         self.__file.write('%s\n' % json.dumps(item))
         self.__file.flush()
 
+def _parse_qs(querystring):
+    querydict = {}
+    cgi_querydict = cgi.parse_qs(querystring)
+    for key, value in cgi_querydict.items():
+        querydict[key] = cgi_querydict[key][0]
+    return querydict
+
 class OpenWebChatServer(object):
-    LISTEN_TEMPLATE = re.compile('listen/multipart\?start=([0-9]+)')
+    QUERYSTRING_TEMPLATE = re.compile('([^\?]*)\?(.*)')
     REDIRECT_TEMPLATE = re.compile('\/([A-Za-z0-9_]+)')
     URL_TEMPLATE = re.compile('\/([A-Za-z0-9_]+)/(.*)')
 
@@ -141,11 +149,26 @@
                  self.__multipart_boundary(boundary))
                 ))
 
+    def _parse_id(self, string):
+        i = 0
+        if string:
+            try:
+                i = int(string)
+                if i < 0:
+                    i = 0
+            except ValueError:
+                pass
+        return i
+
     def _until_conv_request_processed(self, addr, headers, method,
                                       conv_name, page):
-        listen_match = self.LISTEN_TEMPLATE.match(page)
-        if listen_match:
-            i = int(listen_match.group(1))
+        match = self.QUERYSTRING_TEMPLATE.match(page)
+        querydict = {}
+        if match:
+            querydict.update(_parse_qs(match.group(2)))
+            page = match.group(1)
+        if page == 'listen/multipart':
+            i = self._parse_id(querydict.get('start'))
             yield self._until_multipart_header_sent(self.BOUNDARY)
             conv = self._convs.get(conv_name)
             while 1: