Add a check for request body functions and a test for NotImplementedError.
This commit is contained in:
		
							
								
								
									
										11
									
								
								sanic/app.py
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								sanic/app.py
									
									
									
									
									
								
							| @@ -22,6 +22,7 @@ from sanic.constants import HTTP_METHODS | |||||||
| from sanic.exceptions import SanicException, ServerError, URLBuildError | from sanic.exceptions import SanicException, ServerError, URLBuildError | ||||||
| from sanic.handlers import ErrorHandler | from sanic.handlers import ErrorHandler | ||||||
| from sanic.log import LOGGING_CONFIG_DEFAULTS, error_logger, logger | from sanic.log import LOGGING_CONFIG_DEFAULTS, error_logger, logger | ||||||
|  | from sanic.request import Request | ||||||
| from sanic.response import BaseHTTPResponse, HTTPResponse | from sanic.response import BaseHTTPResponse, HTTPResponse | ||||||
| from sanic.router import Router | from sanic.router import Router | ||||||
| from sanic.server import ( | from sanic.server import ( | ||||||
| @@ -61,7 +62,15 @@ class Sanic: | |||||||
|             ) |             ) | ||||||
|             frame_records = stack()[1] |             frame_records = stack()[1] | ||||||
|             name = getmodulename(frame_records[1]) |             name = getmodulename(frame_records[1]) | ||||||
|  |         # Check for unsupported function on custom request objects | ||||||
|  |         if request_class and any(hasattr(request_class, m) for m in ( | ||||||
|  |             "body_init", "body_push", "body_finish" | ||||||
|  |         )) and request_class.receive_body is Request.receive_body: | ||||||
|  |             raise NotImplementedError( | ||||||
|  |                 "Request methods body_init, body_push and body_finish " | ||||||
|  |                 f"are no longer supported. {request_class!r} should " | ||||||
|  |                 "implement receive_body. It is okay to implement both APIs.", | ||||||
|  |             ) | ||||||
|         # logging |         # logging | ||||||
|         if configure_logging: |         if configure_logging: | ||||||
|             logging.config.dictConfig(log_config or LOGGING_CONFIG_DEFAULTS) |             logging.config.dictConfig(log_config or LOGGING_CONFIG_DEFAULTS) | ||||||
|   | |||||||
| @@ -1,10 +1,17 @@ | |||||||
| from io import BytesIO | from io import BytesIO | ||||||
|  |  | ||||||
|  | import pytest | ||||||
|  |  | ||||||
| from sanic import Sanic | from sanic import Sanic | ||||||
| from sanic.request import Request | from sanic.request import Request | ||||||
| from sanic.response import json_dumps, text | from sanic.response import json_dumps, text | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class DeprecCustomRequest(Request): | ||||||
|  |     """Using old API should fail when receive_body is not implemented""" | ||||||
|  |     def body_push(self, data): | ||||||
|  |         pass | ||||||
|  |  | ||||||
| class CustomRequest(Request): | class CustomRequest(Request): | ||||||
|     """Alternative implementation for loading body (non-streaming handlers)""" |     """Alternative implementation for loading body (non-streaming handlers)""" | ||||||
|     async def receive_body(self): |     async def receive_body(self): | ||||||
| @@ -13,6 +20,14 @@ class CustomRequest(Request): | |||||||
|             buffer.write(data) |             buffer.write(data) | ||||||
|         self.body = buffer.getvalue().upper() |         self.body = buffer.getvalue().upper() | ||||||
|         buffer.close() |         buffer.close() | ||||||
|  |     # Old API may be implemented but won't be used here | ||||||
|  |     def body_push(self, data): | ||||||
|  |         assert False | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def test_deprecated_custom_request(): | ||||||
|  |     with pytest.raises(NotImplementedError): | ||||||
|  |         Sanic(request_class=DeprecCustomRequest) | ||||||
|  |  | ||||||
| def test_custom_request(): | def test_custom_request(): | ||||||
|     app = Sanic(request_class=CustomRequest) |     app = Sanic(request_class=CustomRequest) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 L. Kärkkäinen
					L. Kärkkäinen