Author: remi
Date: 2009-02-17 16:01:58 +0100 (Tue, 17 Feb 2009)
New Revision: 3716
Added:
software_suite_v2/tuxware/pytuxisalive/trunk/src/tuxisalive/lib/httpserver/TDBaseRequestHandler.py
Modified:
software_suite_v2/tuxware/pytuxisalive/trunk/src/tuxisalive/lib/httpserver/TDHTTPServer.py
Log:
* splited the request executions from the HTTP handling
Added:
software_suite_v2/tuxware/pytuxisalive/trunk/src/tuxisalive/lib/httpserver/TDBaseRequestHandler.py
===================================================================
---
software_suite_v2/tuxware/pytuxisalive/trunk/src/tuxisalive/lib/httpserver/TDBaseRequestHandler.py
(rev 0)
+++
software_suite_v2/tuxware/pytuxisalive/trunk/src/tuxisalive/lib/httpserver/TDBaseRequestHandler.py
2009-02-17 15:01:58 UTC (rev 3716)
@@ -0,0 +1,127 @@
+# -*- coding: latin1 -*-
+
+import version
+__author__ = version.author
+__date__ = version.date
+__version__ = version.version
+__licence__ = version.licence
+del version
+
+# Copyright (C) 2008 C2ME Sa
+# Remi Jocaille <[email protected]>
+# Distributed under the terms of the GNU General Public License
+# http://www.gnu.org/copyleft/gpl.html
+
+import re
+import urllib
+import sys
+import traceback
+
+from tuxisalive.lib.logger import *
+
+tdServices = []
+
+class TDBaseRequestHandler(object):
+
+ def __matchService(self, services, path):
+
+ def getService(service, path):
+ if path.find(service['name']) == 0:
+ path = path[len(service['name']):]
+ localSub = None
+ if len(service['sub_services']) > 0:
+ for sService in service['sub_services']:
+ tmpSub, path = getService(sService, path)
+ if tmpSub != None:
+ localSub = tmpSub
+ break
+ if localSub != None:
+ return localSub, path
+ else:
+ return service, path
+ else:
+ return None, path
+
+ id = None
+ p = re.compile('/(\d+)/')
+ res = p.findall(path)
+ if len(res) > 0:
+ tmp_id = res[0]
+ idx = path.find(tmp_id)
+ if idx == 1:
+ path = path[idx+len(tmp_id):]
+ id = eval(tmp_id)
+
+ if len(services) > 0:
+ for service in services:
+ ss, pp = getService(service, path)
+ if ss != None:
+ return ss, pp, id
+ else:
+ return None, path, id
+
+ def __parseParameters(self, paramStr):
+ params = {}
+ while paramStr.find('&') != -1:
+ sep_pos = paramStr.find('&')
+ equ_pos = paramStr.find('=')
+ if paramStr.find('=') != -1:
+ name = paramStr[:equ_pos]
+ value = paramStr[equ_pos + 1:sep_pos]
+ if (name != '') and (value != ''):
+ params[name] = urllib.unquote_plus(value)
+ paramStr = paramStr[sep_pos + 1:]
+ if len(paramStr) > 0:
+ equ_pos = paramStr.find('=')
+ if paramStr.find('=') != -1:
+ name = paramStr[:equ_pos]
+ value = paramStr[equ_pos + 1:]
+ if (name != '') and (value != ''):
+ params[name] = urllib.unquote_plus(value)
+ return params
+
+ def getHeaderAndContent(self, path):
+
+ def formatException():
+ fList = traceback.format_exception(sys.exc_info()[0],
+ sys.exc_info()[1],
+ sys.exc_info()[2])
+ result = ""
+ for line in fList:
+ result += line
+ return result
+
+ try:
+ path = urllib.unquote_plus(path)
+ service, paramStr, id = self.__matchService(tdServices, path)
+ paramDict = self.__parseParameters(paramStr)
+ if id == None:
+ id = -1
+ if service != None:
+ if service['service_callback']:
+ service['mutex'].acquire()
+ try:
+ ret = service['service_callback'](id, paramDict)
+ except:
+ service['mutex'].release()
+ self.__logger = SimpleLogger("tuxhttpserver_resources")
+ self.__logger.setLevel(LOG_LEVEL_DEBUG)
+ self.__logger.setTarget(LOG_TARGET_BOTH)
+ self.__logger.logError("Bugged service : (%s)" % path)
+ self.__logger.logError(formatException())
+ return None, None
+ service['mutex'].release()
+ return ret
+ else:
+ self.__logger = SimpleLogger("tuxhttpserver")
+ self.__logger.setLevel(LOG_LEVEL_DEBUG)
+ self.__logger.setTarget(LOG_TARGET_BOTH)
+ self.__logger.logWarning("Server received a wrong request :
(%s)" % path)
+ return None, None
+ except:
+ self.__logger = SimpleLogger("tuxhttpserver_resources")
+ self.__logger.setLevel(LOG_LEVEL_DEBUG)
+ self.__logger.setTarget(LOG_TARGET_BOTH)
+ self.__logger.logError("Bugged service : (%s)" % path)
+ self.__logger.logError(formatException())
+ return None, None
Property changes on:
software_suite_v2/tuxware/pytuxisalive/trunk/src/tuxisalive/lib/httpserver/TDBaseRequestHandler.py
___________________________________________________________________
Name: svn:keywords
+ Id
Modified:
software_suite_v2/tuxware/pytuxisalive/trunk/src/tuxisalive/lib/httpserver/TDHTTPServer.py
===================================================================
---
software_suite_v2/tuxware/pytuxisalive/trunk/src/tuxisalive/lib/httpserver/TDHTTPServer.py
2009-02-17 13:46:01 UTC (rev 3715)
+++
software_suite_v2/tuxware/pytuxisalive/trunk/src/tuxisalive/lib/httpserver/TDHTTPServer.py
2009-02-17 15:01:58 UTC (rev 3716)
@@ -15,17 +15,12 @@
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
from SocketServer import ThreadingMixIn
import threading
-import re
-import urllib
-import sys
-import traceback
import os
from tuxisalive.lib.logger import *
+from TDBaseRequestHandler import tdServices
+from TDBaseRequestHandler import TDBaseRequestHandler
-tdServices = []
-myMutex = threading.Lock()
-
class TDHTTPServer(object):
"""
HTTP Server class
@@ -40,11 +35,11 @@
self.__startedMutex = threading.Lock()
self.__server = None
self.__createServer()
-
+
def __createServer(self):
if self.__server != None:
return False
-
+
try:
if os.name == 'nt':
self.__server = ThreadedHTTPServer(('127.0.0.1', self.__port),
@@ -56,27 +51,27 @@
except:
self.__server = None
return False
-
+
return True
-
+
def start(self):
if self.__getStarted():
return False
-
+
if self.__server == None:
return False
-
+
try:
- self.__setStarted(True)
+ self.__setStarted(True)
self.__logger.logInfo("Server started.")
- self.__server.serve_forever()
+ self.__server.serve_forever()
except:
pass
-
+
self.__logger.logInfo("Server stopped.")
- self.__setStarted(False)
+ self.__setStarted(False)
return True
-
+
def registerService(self, baseService, name, serviceCallback):
service = {
'name' : name,
@@ -84,148 +79,40 @@
'sub_services' : [],
'mutex' : threading.Lock(),
}
-
+
if baseService == None:
services = tdServices
else:
services = baseService['sub_services']
-
+
services.append(service)
-
+
self.__logger.logDebug("Service (%s) has been registered" % name)
return service
-
+
def __setStarted(self, value = True):
self.__startedMutex.acquire()
self.__started = value
self.__startedMutex.release()
-
+
def __getStarted(self):
value = False
-
+
self.__startedMutex.acquire()
value = self.__started
self.__startedMutex.release()
-
- return value
-
+
+ return value
+
def getStarted(self):
- return self.__getStarted()
+ return self.__getStarted()
-
+
class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
"""Handle requests in a separate thread."""
-class TDHttpRequestHandler(BaseHTTPRequestHandler):
+class TDHttpRequestHandler(BaseHTTPRequestHandler, TDBaseRequestHandler):
- def __matchService(self, services, path):
-
- def getService(service, path):
- if path.find(service['name']) == 0:
- path = path[len(service['name']):]
- localSub = None
- if len(service['sub_services']) > 0:
- for sService in service['sub_services']:
- tmpSub, path = getService(sService, path)
- if tmpSub != None:
- localSub = tmpSub
- break
- if localSub != None:
- return localSub, path
- else:
- return service, path
- else:
- return None, path
-
- id = None
- p = re.compile('/(\d+)/')
- res = p.findall(path)
- if len(res) > 0:
- tmp_id = res[0]
- idx = path.find(tmp_id)
- if idx == 1:
- path = path[idx+len(tmp_id):]
- id = eval(tmp_id)
-
- if len(services) > 0:
- for service in services:
- ss, pp = getService(service, path)
- if ss != None:
- return ss, pp, id
- else:
- return None, path, id
-
- def __parseParameters(self, paramStr):
- params = {}
- while paramStr.find('&') != -1:
- sep_pos = paramStr.find('&')
- equ_pos = paramStr.find('=')
- if paramStr.find('=') != -1:
- name = paramStr[:equ_pos]
- value = paramStr[equ_pos + 1:sep_pos]
- if (name != '') and (value != ''):
- params[name] = urllib.unquote_plus(value)
- paramStr = paramStr[sep_pos + 1:]
- if len(paramStr) > 0:
- equ_pos = paramStr.find('=')
- if paramStr.find('=') != -1:
- name = paramStr[:equ_pos]
- value = paramStr[equ_pos + 1:]
- if (name != '') and (value != ''):
- params[name] = urllib.unquote_plus(value)
- return params
-
- def __getHeaderAndContent(self):
- global myMutex
-
- def formatException():
- fList = traceback.format_exception(sys.exc_info()[0],
- sys.exc_info()[1],
- sys.exc_info()[2])
- result = ""
- for line in fList:
- result += line
- return result
-
- try:
- self.path = urllib.unquote_plus(self.path)
- #print self.path
- service, paramStr, id = self.__matchService(tdServices, self.path)
- paramDict = self.__parseParameters(paramStr)
- if id == None:
- id = -1
- if service != None:
- if service['service_callback']:
- #myMutex.acquire()
- service['mutex'].acquire()
- try:
- ret = service['service_callback'](id, paramDict)
- except:
- #myMutex.release()
- service['mutex'].release()
- self.__logger = SimpleLogger("tuxhttpserver_resources")
- self.__logger.setLevel(LOG_LEVEL_DEBUG)
- self.__logger.setTarget(LOG_TARGET_BOTH)
- self.__logger.logError("Bugged service : (%s)" %
self.path)
- self.__logger.logError(formatException())
- return None, None
- #myMutex.release()
- service['mutex'].release()
- return ret
- else:
- self.__logger = SimpleLogger("tuxhttpserver")
- self.__logger.setLevel(LOG_LEVEL_DEBUG)
- self.__logger.setTarget(LOG_TARGET_BOTH)
- self.__logger.logWarning("Server received a wrong request :
(%s)" % self.path)
- return None, None
- except:
- self.__logger = SimpleLogger("tuxhttpserver_resources")
- self.__logger.setLevel(LOG_LEVEL_DEBUG)
- self.__logger.setTarget(LOG_TARGET_BOTH)
- self.__logger.logError("Bugged service : (%s)" % self.path)
- self.__logger.logError(formatException())
- return None, None
-
def __sendHeaders(self, headers, content):
try:
if headers != None:
@@ -238,50 +125,49 @@
except:
print "Error on sending headers"
return False
-
+
def do_HEADER(self):
- headers, content = self.__getHeaderAndContent()
-
+ headers, content = self.getHeaderAndContent(self.path)
+
if (headers == None) and (content == None):
try:
self.send_error(404, 'Service Not Found')
except:
print "Handle error"
return
-
- try:
+
+ try:
self.send_response(200)
self.__sendHeaders(headers, content)
except:
print "Handle error"
-
- def do_GET(self):
- headers, content = self.__getHeaderAndContent()
-
+
+ def do_GET(self):
+ headers, content = self.getHeaderAndContent(self.path)
+
if (headers == None) and (content == None):
try:
self.send_error(404, 'Service Not Found')
except:
print "Handle error"
return
-
- try:
+
+ try:
self.send_response(200)
if not self.__sendHeaders(headers, content):
return
if content != None:
self.wfile.write(content)
- self.wfile.flush()
+ self.wfile.flush()
except:
print "Handle error"
-
+
def handle_one_request(self):
try:
BaseHTTPRequestHandler.handle_one_request(self)
except:
print "handle_one_request error"
-
+
def log_request(self, code='-', size='-'):
pass
-
\ No newline at end of file
------------------------------------------------------------------------------
Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA
-OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise
-Strategies to boost innovation and cut costs with open source participation
-Receive a $600 discount off the registration fee with the source code: SFAD
http://p.sf.net/sfu/XcvMzF8H
_______________________________________________
Tux-droid-svn mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tux-droid-svn