Minor changes required for running tests
[ipypbx] / src / ipypbx / http.py
index 285c4ec..3e76ed9 100644 (file)
@@ -37,18 +37,18 @@ Content-Length: %i
 
 %s'''
   
-    def __init__(self, window):
-        super(FreeswitchConfigServer, self).__init__(window)
+    def __init__(self, database, parent):
+        super(FreeswitchConfigServer, self).__init__(parent)
 
         self.host = None
         self.port = None
         self.connection_id = None
         self.is_running = False
         self.generators = [
-            GenClass(window, self) for GenClass in (
+            GenClass(database, self) for GenClass in (
                 SofiaConfGenerator,)]
         
-        self.httpRequestParser = HttpRequestParser(self)
+        self.httpRequestParser = HttpRequestParser()
         
     def setSocketData(self, host, port, connection_id):
         """
@@ -106,18 +106,22 @@ Content-Length: %i
     def receiveData(self):
         # TODO: read in chunks.
         for line in str(self.socket.readAll()).split('\r\n'):
-            print self.httpRequestParser.i, line
             self.httpRequestParser.handle(line)
 
+        for generator in self.generators:
+            if generator.canHandle(self.httpRequestParser.data):
+                self.state += 1
+                self.result = etree.tostring(generator.generateConfig(
+                    self.httpRequestParser.headers))
+                break
+
         response = self.httpRequestParser.result or self.configNotFound
         http_response = self.responseTemplate % (len(response), response)
         self.socket.write(http_response)
-        print
-        print http_response
-        print
         self.httpRequestParser.reset()        
         self.socket.close()
 
+
 class HttpParseError(Exception):
     """
     Error parsing HTTP request.
@@ -128,20 +132,17 @@ class HttpRequestParser(object):
     """
     A simple state machine for parsing HTTP requests.
     """
-    HTTP_NONE, HTTP_REQUEST, HTTP_HEADERS, HTTP_EMPTY, HTTP_MESSAGE, \
-        HTTP_DONE = range(6)
-    HTTP_STATES = ['NONE', 'REQUEST', 'HEADERS', 'EMPTY', 'MESSAGE', 'DONE']
+    HTTP_NONE, HTTP_REQUEST, HTTP_HEADERS, HTTP_EMPTY, HTTP_BODY, HTTP_DONE = \
+        range(6)
+    HTTP_STATES = ['NONE', 'REQUEST', 'HEADERS', 'EMPTY', 'BODY', 'DONE']
     
-    def __init__(self, parent):
-        self.parent = parent
-        self.i = 0
+    def __init__(self):
         self.reset()
 
     def reset(self):
         """
         Reset parser to initial state.
         """
-        self.i += 1
         # Initial values for request data.
         self.method = None
         self.request_path = None
@@ -198,23 +199,18 @@ class HttpRequestParser(object):
         """
         self.state += 1
 
-    def handleMessage(self, line):
+    def handleBody(self, line):
         """
         Append to message body.
         """
+        if self.method != 'POST':
+            raise HttpParseError('Only POST request are supported')
+            
         self.data = dict(pair.split('=', 2) for pair in line.split('&'))
 
-        #for k, v in self.data.items():
-        #    print k, '=>', v
-        #print
-
-        for generator in self.parent.generators:
-            if generator.canHandle(self.data):
-                self.state += 1
-                self.result = etree.tostring(generator.generateConfig(
-                    self.headers))
-                break
-
+    def handleDone(self, line):
+        raise HttpParseError("Can't read past request end")
+    
 
 class FreeswitchConfigGenerator(object):
     """
@@ -223,16 +219,15 @@ class FreeswitchConfigGenerator(object):
     
     param_match = {}
 
-    def __init__(self, model, parent):
-        self.model = model
+    def __init__(self, database, parent):
+        self.database = database
         self.parent = parent
 
-    def database(self):
-        """
-        Return database instance.
-        """
-        return self.model.controllers['connection'].model.database()
-    database = property(database)
+#    def database(self):
+#        """
+#        Return database instance.
+#        """
+#        return self.model.controllers['connection'].model.database()
 
     def canHandle(self, params):
         """
@@ -433,3 +428,12 @@ class DirectoryGenerator(FreeswitchConfigGenerator):
                 self.addParams(user_elt, params)
 
         return root_elt
+
+
+class DialplanGenerator(FreeswitchConfigGenerator):
+    """
+    Generates XML dialplans.
+    """
+
+    param_match = {'section': 'dialplan'}
+