I agree with you. I committed your proposed change to master. Please confirm this indeed fixes it and I will make another release.
On Wednesday, 4 October 2023 at 08:26:46 UTC-7 CarlosDB wrote: > Hello, > > Today, I downloaded web2py from GitHub to start testing a future update. I > have several "upload" fields for images, and they have all started to fail. > > After some investigation, I found that this issue started after Pull > Request (PR) #2471 (Sanitize Headers) was merged. Link to PR > <https://github.com/web2py/web2py/pull/2471/commits/70dd3a950b3517a1e31741a2eebfa85874085686>. > > This PR modifies the file gluon/http.py. > > The following code: > @cache.action(time_expire=86400) > def download(): > return response.download(request, db) > > has stopped working. > > If I remove the line "@cache.action(time_expire=86400)", it works, but > that's not a good solution. > > While investigating the root of the problem, I found the issue around line > 123 of gluon/http.py. It used to be like this: > > rheaders = [] > for k, v in iteritems(headers): > if isinstance(v, list): > rheaders += [(k, item) for item in v] > else: > rheaders.append((k, v)) > responder(status, rheaders) > > Now it looks like this: > > rheaders = [] > for k, v in iteritems(headers): > if isinstance(v, list): > rheaders += [(k, str(item)) for item in v] > elif v is not None: > rheaders.append((k, str(v))) > responder(status, rheaders) > > > The variable "rheaders" contains the HTTP headers, but with these > modifications, some values are int or None, but they should be str. For > example: > ('Content-Length', 29563) > ('Pragma', None) > > ('Content-Length', 29563) should be ('Content-Length', '29563'), and I > believe ('Pragma', None) is a deprecated header that should be removed. > > A possible solution could be to revert part of the PR, but I think there > might be a better solution. > > The real issue seems to originate from the files gluon/streamer.py and > gluon/cache.py. I have commented on the lines that have problems: > > *In gluon/streamer.py, line 127*: > > # in all the other cases (not 304, not 206, but 200 or error page) > if status != 206: > enc = request.env.http_accept_encoding > if enc and 'gzip' in enc and not 'Content-Encoding' in headers: > gzipped = static_file + '.gz' > if os.path.isfile(gzipped) and os.path.getmtime(gzipped) >= > modified: > static_file = gzipped > fsize = os.path.getsize(gzipped) > headers['Content-Encoding'] = 'gzip' > headers['Vary'] = 'Accept-Encoding' > try: > stream = open(static_file, 'rb') > except IOError as e: > # this better not happen when returning an error page ;-) > if e.errno in (errno.EISDIR, errno.EACCES): > raise HTTP(403) > else: > raise HTTP(404) > headers['Content-Length'] = fsize # should be: > headers['Content-Length'] = str(fsize) > > *In gluon/cache.py, line 676:* > > if send_headers: > headers = {'Pragma': None, # Deprecated: This > feature is no longer recommended > 'Expires': expires, > 'Cache-Control': cache_control} > > > What is your opinion? > Best way to solve it? > > Carlos. -- Resources: - http://web2py.com - http://web2py.com/book (Documentation) - http://github.com/web2py/web2py (Source code) - https://code.google.com/p/web2py/issues/list (Report Issues) --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to web2py+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/web2py/67791b69-f9c6-41cc-a663-0951d8288127n%40googlegroups.com.