@@ -27,11 +27,11 @@ import socket import tempfile import random import string import platform -from fileutils import abspath, write_file +from fileutils import abspath, write_file, parse_version from settings import global_settings from admin import add_path_first, create_missing_folders, create_missing_app_folders from globals import current from custom_import import custom_import_install @@ -101,12 +101,13 @@ # pattern used to validate client address regex_client = re.compile('[\w\-:]+(\.[\w\-]+)*\.?') # ## to account for IPV6 version_info = open(abspath('VERSION', gluon=True), 'r') -web2py_version = version_info.read() +web2py_version = parse_version(version_info.read().strip()) version_info.close() +global_settings.web2py_version = web2py_version try: import rocket except: if not global_settings.web2py_runtime_gae: @@ -416,17 +417,18 @@ if not os.path.exists(request.folder): if request.application == rewrite.thread.routes.default_application and request.application != 'welcome': request.application = 'welcome' redirect(Url(r=request)) elif rewrite.thread.routes.error_handler: - redirect(Url(rewrite.thread.routes.error_handler['application'], - rewrite.thread.routes.error_handler['controller'], - rewrite.thread.routes.error_handler['function'], + _handler = rewrite.thread.routes.error_handler + redirect(Url(_handler['application'], + _handler['controller'], + _handler['function'], args=request.application)) else: - raise HTTP(404, - rewrite.thread.routes.error_message % 'invalid request', + raise HTTP(404, rewrite.thread.routes.error_message \ + % 'invalid request', web2py_error='invalid application') request.url = Url(r=request, args=request.args, extension=request.raw_extension) # ################################################## @@ -444,14 +446,16 @@ # ################################################## # expose wsgi hooks for convenience # ################################################## request.wsgi.environ = environ_aux(environ,request) - request.wsgi.start_response = lambda status='200', headers=[], \ + request.wsgi.start_response = \ + lambda status='200', headers=[], \ exec_info=None, response=response: \ start_response_aux(status, headers, exec_info, response) - request.wsgi.middleware = lambda *a: middleware_aux(request,response,*a) + request.wsgi.middleware = \ + lambda *a: middleware_aux(request,response,*a) # ################################################## # load cookies # ################################################## @@ -469,11 +473,12 @@ # ################################################## # set no-cache headers # ################################################## - response.headers['Content-Type'] = contenttype('.'+request.extension) + response.headers['Content-Type'] = \ + contenttype('.'+request.extension) response.headers['Cache-Control'] = \ 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0' response.headers['Expires'] = \ time.strftime('%a, %d %b %Y %H:%M:%S GMT', time.gmtime()) response.headers['Pragma'] = 'no-cache' @@ -548,12 +553,12 @@ response._custom_rollback() else: BaseAdapter.close_all_instances('rollback') http_response = \ - HTTP(500, - rewrite.thread.routes.error_message_ticket % dict(ticket=ticket), + HTTP(500, rewrite.thread.routes.error_message_ticket % \ + dict(ticket=ticket), web2py_error='ticket %s' % ticket) except: if request.body: @@ -571,16 +576,17 @@ except: pass e = RestrictedError('Framework', '', '', locals()) ticket = e.log(request) or 'unrecoverable' http_response = \ - HTTP(500, - rewrite.thread.routes.error_message_ticket % dict(ticket=ticket), + HTTP(500, rewrite.thread.routes.error_message_ticket \ + % dict(ticket=ticket), web2py_error='ticket %s' % ticket) finally: - if response and hasattr(response, 'session_file') and response.session_file: + if response and hasattr(response, 'session_file') \ + and response.session_file: response.session_file.close() # if global_settings.debugging: # import gluon.debug # gluon.debug.stop_trace() @@ -590,11 +596,11 @@ if not http_response: return wsgibase(new_environ,responder) if global_settings.web2py_crontype == 'soft': newcron.softcron(global_settings.applications_parent).start() return http_response.to(responder) - + def save_password(password, port): """ used by main() to save the password in the parameters_port.py file. """ @@ -716,10 +722,11 @@ pid_filename='httpserver.pid', log_filename='httpserver.log', profiler_filename=None, ssl_certificate=None, ssl_private_key=None, + ssl_ca_certificate=None, min_threads=None, max_threads=None, server_name=None, request_queue_size=5, timeout=10, @@ -767,10 +774,13 @@ logger.warning('unable to open SSL certificate. SSL is OFF') elif not os.path.exists(ssl_private_key): logger.warning('unable to open SSL private key. SSL is OFF') else: sock_list.extend([ssl_private_key, ssl_certificate]) + if ssl_ca_certificate: + sock_list.append(ssl_ca_certificate) + logger.info('SSL is ON') app_info = {'wsgi_app': appfactory(wsgibase, log_filename, profiler_filename) } @@ -805,6 +815,8 @@ self.server.stop(stoplogging) try: os.unlink(self.pid_filename) except: pass + +