diff --git a/VERSION b/VERSION index 596fbfe9..f2f83bbb 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.6.0-development+timestamp.2013.06.29.17.06.13 +Version 2.6.0-development+timestamp.2013.06.30.09.18.36 diff --git a/gluon/globals.py b/gluon/globals.py index 940d7f3e..3aafea1f 100644 --- a/gluon/globals.py +++ b/gluon/globals.py @@ -83,7 +83,6 @@ class Request(Storage): def __init__(self): Storage.__init__(self) - self.wsgi = Storage() # hooks to environ and start_response self.env = Storage() self.cookies = Cookie.SimpleCookie() self.get_vars = Storage() diff --git a/gluon/main.py b/gluon/main.py index c0851c02..0ebeade1 100644 --- a/gluon/main.py +++ b/gluon/main.py @@ -257,51 +257,55 @@ def serve_controller(request, response, session): raise HTTP(response.status, page, **response.headers) -def start_response_aux(status, headers, exc_info, response=None): - """ - in controller you can use:: - - - request.wsgi.environ - - request.wsgi.start_response - - to call third party WSGI applications - """ - response.status = str(status).split(' ', 1)[0] - response.headers = dict(headers) - return lambda *args, **kargs: response.write(escape=False, *args, **kargs) - - -def middleware_aux(request, response, *middleware_apps): - """ - In you controller use:: - +class LazyWSGI(object): + def __init__(self, environ, request, response): + self.wsgi_environ = environ + self.request = request + self.response = response + @property + def environ(self): + if not hasattr(self,'_environ'): + new_environ = self.wsgi_environ + new_environ['wsgi.input'] = self.request.body + new_environ['wsgi.version'] = 1 + self._environ = new_environ + return self._environ + def start_response(self,status='200', headers=[], exec_info=None): + """ + in controller you can use:: + + - request.wsgi.environ + - request.wsgi.start_response + + to call third party WSGI applications + """ + self.response.status = str(status).split(' ', 1)[0] + self.response.headers = dict(headers) + return lambda *args, **kargs: \ + self.response.write(escape=False, *args, **kargs) + def middleware(self,*a): + """ + In you controller use:: + @request.wsgi.middleware(middleware1, middleware2, ...) - - to decorate actions with WSGI middleware. actions must return strings. - uses a simulated environment so it may have weird behavior in some cases - """ - def middleware(f): - def app(environ, start_response): - data = f() - start_response(response.status, response.headers.items()) - if isinstance(data, list): - return data - return [data] - for item in middleware_apps: - app = item(app) - - def caller(app): - wsgi = request.wsgi - return app(wsgi.environ, wsgi.start_response) - return lambda caller=caller, app=app: caller(app) - return middleware - - -def environ_aux(environ, request): - new_environ = copy.copy(environ) - new_environ['wsgi.input'] = request.body - new_environ['wsgi.version'] = 1 - return new_environ + + to decorate actions with WSGI middleware. actions must return strings. + uses a simulated environment so it may have weird behavior in some cases + """ + def middleware(f): + def app(environ, start_response): + data = f() + start_response(self.response.status, + self.response.headers.items()) + if isinstance(data, list): + return data + return [data] + for item in middleware_apps: + app = item(app) + def caller(app): + return app(self.environ, self.start_response) + return lambda caller=caller, app=app: caller(app) + return middleware ISLE25 = sys.version_info[1] <= 5 @@ -537,13 +541,7 @@ def wsgibase(environ, responder): # expose wsgi hooks for convenience # ################################################## - request.wsgi.environ = environ_aux(environ, request) - 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 = LazyWSGI(environ, request, response) # ################################################## # load cookies diff --git a/gluon/rewrite.py b/gluon/rewrite.py index baebe8c7..a96c4302 100644 --- a/gluon/rewrite.py +++ b/gluon/rewrite.py @@ -638,6 +638,8 @@ def regex_url_in(request, environ): if match.group('c') == 'static': application = match.group('a') version, filename = None, match.group('z') + if not filename: + raise HTTP(404) items = filename.split('/', 1) if regex_version.match(items[0]): version, filename = items