X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=apache%2Fplc.wsgi;h=b16b7f2792a219e19ff2cef3e7f0094457f414ce;hb=ae8b10f8363f7a1df02e77cbd820904c4ded10b8;hp=a720088915a7d950ad86a98f9a0ee81670bab932;hpb=6ce6589692d760ba10b47af0d24651c3481e389a;p=plcapi.git diff --git a/apache/plc.wsgi b/apache/plc.wsgi index a720088..b16b7f2 100644 --- a/apache/plc.wsgi +++ b/apache/plc.wsgi @@ -9,41 +9,56 @@ import sys sys.path.append('/usr/share/plc_api') sys.stdout = sys.stderr import traceback -from PLC.Debug import log +from PLC.Logger import logger from PLC.API import PLCAPI -api = PLCAPI() - -# recipe from this page -# http://code.google.com/p/modwsgi/wiki/DebuggingTechniques -# let ErrorMiddleware deal with exceptions def application(environ, start_response): - status = '200 OK' - if environ.get('REQUEST_METHOD') != 'POST': - content_type = 'text/html' - output = """ + try: + status = '200 OK' + if environ.get('REQUEST_METHOD') != 'POST': + content_type = 'text/html; charset=utf-8' + output = """ PLCAPI WSGI XML-RPC/SOAP Interface

PLCAPI WSGI XML-RPC/SOAP Interface

Please use XML-RPC or SOAP to access the PLCAPI.

+

At the very least you need to use a POST method.

""" - else: - api.environ = environ - content_type = 'text/xml' - ip = environ.get('REMOTE_ADDR') - port = environ.get('REMOTE_PORT') - output = api.handle((ip,port),environ.get('wsgi.input').read()) - # Shut down database connection, otherwise up to MaxClients DB - # connections will remain open. - api.db.close() + else: + # Thomas Dreibholz + # Note that this function is called within multiple threads! + # "api" MUST be a local variable instead of a global one. + # Otherwise, this causes concurrent accesses to the same + # object within different threads! + api = PLCAPI() + api.environ = environ + content_type = 'text/xml; charset=utf-8' + ip = environ.get('REMOTE_ADDR') + port = environ.get('REMOTE_PORT') + output = api.handle((ip,port), environ.get('wsgi.input').read()) +# uncomment for debug +# try: +# with open("/tmp/dbgplc.log", "a") as f: +# print(f"{ip=} {port=}\n" +# f"{output=}", +# file=f) +# except Exception as exc: +# pass + # Shut down database connection, otherwise up to MaxClients DB + # connections will remain open. + api.db.close() + except Exception as err: + status = '500 Internal Server Error' + content_type = 'text/html; charset=utf-8' + output = 'Internal Server Error' + logger.exception("INTERNAL ERROR !!") # Write response + # with python3 wsgi expects a bytes object here + output = output.encode() response_headers = [('Content-type', '%s' % content_type), ('Content-Length', str(len(output)))] start_response(status, response_headers) - return [output] - -from paste.exceptions.errormiddleware import ErrorMiddleware -application = ErrorMiddleware(application, debug=True) + return [output]