1 # Copyright (c) Stas Shtin, 2010
3 # This file is part of IPyPBX.
5 # IPyPBX is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
10 # IPyPBX is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with IPyPBX. If not, see <http://www.gnu.org/licenses/>.
18 from PyQt4 import QtCore, QtNetwork
21 class FreeswitchConfigServer(QtNetwork.QTcpServer):
22 def setSocket(self, host, port):
26 def startServer(self):
27 self.newConnection.connect(self.clientConnecting)
28 self.listen(QtNetwork.QHostAddress(self.host), self.port)
33 def clientConnecting(self, socket):
34 if self.hasPendingConnections():
35 connectingClient = self.server.nextPendingConnection()
36 connectingClient.readyRead.connect(self.receiveData)
38 def receiveData(self, socket):
40 while socket.canReadLine():
41 line = socket.readLine().strip()
45 class HttpParseError(Exception):
49 class HttpRequestParser(object):
51 A simple state machine for parsing HTTP requests.
53 HTTP_NONE, HTTP_REQUEST, HTTP_HEADERS, HTTP_EMPTY, HTTP_MESSAGE = range(5)
54 HTTP_STATES = ['NONE', 'REQUEST', 'HEADERS', 'EMPTY', 'MESSAGE']
57 super(HttpParser, self).__init__()
61 Reset parser to initial state.
63 # Initial values for request data.
65 self.request_path = None
66 self.http_version = None
70 self.state = HTTP_NONE
72 def handle(self, line):
74 Dispatch line to current state handler.
76 for state in HTTP_STATES:
77 if getattr(self, 'HTTP_%s' % state) == self.state:
78 getattr(self, 'handle%s' % state.title()).(line)
81 raise HttpParseError('Unknown HTTP state')
83 def handleNone(self, line):
85 Pass line to next state.
90 def handleRequest(self, line):
92 Retrieve HTTP method, request path and HTTP version from request.
94 self.method, self.request_path, self.http_version = line.split(' ')
97 def handleHeaders(self, line):
99 Parse headers while not found an empty line.
102 key, value = line.split(': ')
103 self.headers[key] = value
107 def handleEmpty(self, line):
109 Empty line separator is found - proceed to next state.
113 def handleMessage(self, line):
115 Append to message body.