def application(environ, start_response): """Main WSGI handler that processes client requests and calls the proper functions. """ global routes fname = environ['PATH_INFO'] # Among others, this will filter wrong function names, # but also the favicon.ico request, for instance. if fname is None: raise WIClientError('Method name not recognized!') # return send_html_response(status, 'Error! ' + status, start_response) try: outForm = 'xml' if environ['REQUEST_METHOD'] == 'GET': form = cgi.FieldStorage(fp=environ['wsgi.input'], environ=environ) if 'format' in form: outForm = form['format'].value.lower() elif environ['REQUEST_METHOD'] == 'POST': form = '' try: length = int(environ.get('CONTENT_LENGTH', '0')) except ValueError: length = 0 # If there is a body to read if length != 0: form = environ['wsgi.input'].read(length) else: form = environ['wsgi.input'].read() for line in form.splitlines(): if not len(line): continue if '=' not in line: break k, v = line.split('=') if k.strip() == 'format': outForm = v.strip() else: raise Exception except ValueError as e: if str(e) == "Maximum content length exceeded": # Add some user-friendliness (this message triggers an alert # box on the client) return send_plain_response("400 Bad Request", "maximum request size exceeded", start_response) return send_plain_response("400 Bad Request", str(e), start_response) # Check whether the function called is implemented implementedFunctions = ['query', 'application.wadl', 'localconfig', 'version', 'info'] config = configparser.RawConfigParser() here = os.path.dirname(__file__) config.read(os.path.join(here, 'routing.cfg')) #verbo = config.getint('Service', 'verbosity') verbo = config.get('Service', 'verbosity') # Warning is the default value verboNum = getattr(logging, verbo.upper(), 30) logging.basicConfig(level=verboNum) if routes is None: # Add routing cache here, to be accessible to all modules routesFile = os.path.join(here, 'data', 'routing.xml') #invFile = os.path.join(here, 'data', 'Arclink-inventory.xml') masterFile = os.path.join(here, 'data', 'masterTable.xml') #routes = RoutingCache(routesFile, masterFile, Logs(verbo)) routes = RoutingCache(routesFile, masterFile) fname = environ['PATH_INFO'].split('/')[-1] if fname not in implementedFunctions: return send_plain_response("400 Bad Request", 'Function "%s" not implemented.' % fname, start_response) if fname == 'application.wadl': iterObj = '' here = os.path.dirname(__file__) appWadl = os.path.join(here, 'application.wadl') with open(appWadl, 'r') \ as appFile: iterObj = appFile.read() status = '200 OK' return send_xml_response(status, iterObj, start_response) elif fname == 'query': makeQuery = globals()['makeQuery%s' % environ['REQUEST_METHOD']] try: iterObj = makeQuery(form) iterObj = applyFormat(iterObj, outForm) status = '200 OK' if outForm == 'xml': return send_xml_response(status, iterObj, start_response) else: return send_plain_response(status, iterObj, start_response) except WIError as w: return send_plain_response(w.status, w.body, start_response) elif fname == 'localconfig': return send_xml_response('200 OK', routes.localConfig(), start_response) elif fname == 'version': text = "1.0.2" return send_plain_response('200 OK', text, start_response) elif fname == 'info': config = configparser.RawConfigParser() here = os.path.dirname(__file__) config.read(os.path.join(here, 'routing.cfg')) text = config.get('Service', 'info') return send_plain_response('200 OK', text, start_response) raise Exception('This point should have never been reached!')