From 17dcd836ddfb9dc2ba9e38737d8f7c263d6e0ff5 Mon Sep 17 00:00:00 2001 From: niphlod Date: Tue, 13 Aug 2013 23:44:59 +0200 Subject: [PATCH] fixed issue with request.body. Needs refactoring --- gluon/globals.py | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/gluon/globals.py b/gluon/globals.py index 9f214837..9798cb1a 100644 --- a/gluon/globals.py +++ b/gluon/globals.py @@ -83,21 +83,21 @@ def copystream_progress(request, chunk_size=10 ** 5): X-Progress-ID:length and X-Progress-ID:uploaded """ env = request.env - if not env.content_length: + if not env.get('CONTENT_LENGTH', None): return cStringIO.StringIO() - source = env.wsgi_input + source = env['wsgi.input'] try: - size = int(env.content_length) + size = int(env['CONTENT_LENGTH']) except ValueError: raise HTTP(400, "Invalid Content-Length header") try: # Android requires this dest = tempfile.NamedTemporaryFile() except NotImplementedError: # and GAE this dest = tempfile.TemporaryFile() - if not 'X-Progress-ID' in request.vars: + if not 'X-Progress-ID' in request.get_vars: copystream(source, dest, size, chunk_size) return dest - cache_key = 'X-Progress-ID:' + request.vars['X-Progress-ID'] + cache_key = 'X-Progress-ID:' + request.get_vars['X-Progress-ID'] cache_ram = CacheInRam(request) # same as cache.ram because meta_storage cache_ram(cache_key + ':length', lambda: size, 0) cache_ram(cache_key + ':uploaded', lambda: 0, 0) @@ -150,6 +150,7 @@ class Request(Storage): self._get_vars = None self._post_vars = None self._vars = None + self._body = None self.folder = None self.application = None self.function = None @@ -162,6 +163,7 @@ class Request(Storage): self.is_local = False self.global_settings = settings.global_settings + def parse_get_vars(self): query_string = self.env.get('QUERY_STRING','') dget = cgi.parse_qs(query_string, keep_blank_values=1) @@ -173,11 +175,7 @@ class Request(Storage): def parse_post_vars(self): env = self.env post_vars = self._post_vars = Storage() - try: - self.body = body = copystream_progress(self) - except IOError: - raise HTTP(400, "Bad Request - HTTP body is incomplete") - + body = self.body #if content-type is application/json, we must read the body is_json = env.get('content_type', '')[:16] == 'application/json' @@ -230,6 +228,15 @@ class Request(Storage): if len(pvalue): post_vars[key] = (len(pvalue) > 1 and pvalue) or pvalue[0] + @property + def body(self): + if self._body is None: + try: + self._body = copystream_progress(self) + except IOError: + raise HTTP(400, "Bad Request - HTTP body is incomplete") + return self._body + def parse_all_vars(self): self._vars = copy.copy(self.get_vars) for key,value in self.post_vars.iteritems(): @@ -297,8 +304,6 @@ class Request(Storage): current.session.forget() redirect(URL(scheme='https', args=self.args, vars=self.vars)) - - def restful(self): def wrapper(action, self=self): def f(_action=action, _self=self, *a, **b):