Use voussoirkit.flasktools for gzip_response.
This commit is contained in:
		
							parent
							
								
									c73556d1e6
								
							
						
					
					
						commit
						ff1ec3896b
					
				
					 1 changed files with 2 additions and 46 deletions
				
			
		|  | @ -3,12 +3,11 @@ Do not execute this file directly. | ||||||
| Use etiquette_flask_dev.py or etiquette_flask_prod.py. | Use etiquette_flask_dev.py or etiquette_flask_prod.py. | ||||||
| ''' | ''' | ||||||
| import flask; from flask import request | import flask; from flask import request | ||||||
| import gzip |  | ||||||
| import io |  | ||||||
| import mimetypes | import mimetypes | ||||||
| import traceback | import traceback | ||||||
| 
 | 
 | ||||||
| from voussoirkit import bytestring | from voussoirkit import bytestring | ||||||
|  | from voussoirkit import flasktools | ||||||
| from voussoirkit import pathclass | from voussoirkit import pathclass | ||||||
| 
 | 
 | ||||||
| import etiquette | import etiquette | ||||||
|  | @ -82,54 +81,11 @@ def before_request(): | ||||||
|     if site.localhost_only and not request.is_localhost: |     if site.localhost_only and not request.is_localhost: | ||||||
|         flask.abort(403) |         flask.abort(403) | ||||||
| 
 | 
 | ||||||
| gzip_minimum_size = 500 * bytestring.BYTE |  | ||||||
| gzip_maximum_size = 5 * bytestring.MIBIBYTE |  | ||||||
| gzip_level = 3 |  | ||||||
| def should_gzip(response): |  | ||||||
|     if response.direct_passthrough: |  | ||||||
|         return False |  | ||||||
| 
 | 
 | ||||||
|     if response.status_code < 200: |  | ||||||
|         return False |  | ||||||
| 
 |  | ||||||
|     if response.status_code >= 300: |  | ||||||
|         return False |  | ||||||
| 
 |  | ||||||
|     content_length = response.headers.get('Content-Length', None) |  | ||||||
|     if content_length is not None and int(content_length) > gzip_maximum_size: |  | ||||||
|         return False |  | ||||||
| 
 |  | ||||||
|     if content_length is not None and int(content_length) < gzip_minimum_size: |  | ||||||
|         return False |  | ||||||
| 
 |  | ||||||
|     if 'Content-Encoding' in response.headers: |  | ||||||
|         return False |  | ||||||
| 
 |  | ||||||
|     accept_encoding = request.headers.get('Accept-Encoding', '') |  | ||||||
|     if 'gzip' not in accept_encoding.lower(): |  | ||||||
|         return False |  | ||||||
| 
 |  | ||||||
|     content_type = response.headers.get('Content-Type', '') |  | ||||||
|     if not (content_type.startswith('application/json') or content_type.startswith('text/')): |  | ||||||
|         return False |  | ||||||
| 
 |  | ||||||
|     return True |  | ||||||
| 
 | 
 | ||||||
| @site.after_request | @site.after_request | ||||||
| def after_request(response): | def after_request(response): | ||||||
|     if not should_gzip(response): |     response = flasktools.gzip_response(request, response) | ||||||
|         return response |  | ||||||
| 
 |  | ||||||
|     ### |  | ||||||
| 
 |  | ||||||
|     gzip_buffer = io.BytesIO() |  | ||||||
|     gzip_file = gzip.GzipFile(mode='wb', compresslevel=gzip_level, fileobj=gzip_buffer) |  | ||||||
|     gzip_file.write(response.get_data()) |  | ||||||
|     gzip_file.close() |  | ||||||
|     response.set_data(gzip_buffer.getvalue()) |  | ||||||
|     response.headers['Content-Encoding'] = 'gzip' |  | ||||||
|     response.headers['Content-Length'] = len(response.get_data()) |  | ||||||
| 
 |  | ||||||
|     return response |     return response | ||||||
| 
 | 
 | ||||||
| # P functions ###################################################################################### | # P functions ###################################################################################### | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue