sanic/tests
L. Kärkkäinen bffdb3b5c2 More robust response datatype handling (#1674)
* HTTP1 header formatting moved to headers.format_headers and rewritten.

- New implementation is one line of code and twice faster than the old one.
- Whole header block encoded to UTF-8 in one pass.
- No longer supports custom encode method on header values.
- Cookie objects now have __str__ in addition to encode, to work with this.

* Linter

* format_http1_response

* Replace encode_body with faster implementation based on f-string.

Benchmarks:

def encode_body(data):
    try:
        # Try to encode it regularly
        return data.encode()
    except AttributeError:
        # Convert it to a str if you can't
        return str(data).encode()

def encode_body2(data):
    return f"{data}".encode()

def encode_body3(data):
    return str(data).encode()

data_str, data_int = "foo", 123

%timeit encode_body(data_int)
928 ns ± 2.96 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit encode_body2(data_int)
280 ns ± 2.09 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit encode_body3(data_int)
387 ns ± 1.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit encode_body(data_str)
202 ns ± 1.9 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit encode_body2(data_str)
197 ns ± 0.507 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

%timeit encode_body3(data_str)
313 ns ± 1.28 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

* Wtf linter

* Content-type fixes.

* Body encoding sanitation, first pass.
- body/data type autodetection fixed.
- do not repr(body).encode() bytes-ish values.
- support __html__ and _repr_html_ in sanic.response.html().

* <any type>-to-str response autoconversion limited to sanic.response.text() only.

* Workaround MyPy issue.

* Add an empty line to make isort happy.

* Add html test for __html__ and _repr_html_.

* Remove StreamingHTTPResponse.get_headers helper function.

* Add back HTTPResponse Keep-Alive removed by earlier merge or something.

* Revert "Remove StreamingHTTPResponse.get_headers helper function."

Tests depend on this otherwise useless function.

This reverts commit 9651e6ae01.

* Add deprecation warnings; instead of assert for wrong HTTP version, and for non-string response.text.

* Add back missing import.

* Avoid duplicate response header tweaking code.

* Linter errors
2020-01-20 10:34:32 -06:00
..
benchmark Create requests-async based TestClient, remove aiohttp dependency, drop Python 3.5 2019-04-30 15:26:06 +03:00
certs initial commit 2017-03-03 11:44:50 -05:00
performance Create requests-async based TestClient, remove aiohttp dependency, drop Python 3.5 2019-04-30 15:26:06 +03:00
static Add content_type flag to Sanic.static (#1267) 2018-07-20 22:31:15 -07:00
conftest.py Create requests-async based TestClient, remove aiohttp dependency, drop Python 3.5 2019-04-30 15:26:06 +03:00
test_app.py Add server.start_serving and server.serve_forever to AsyncioServer proxy object, to match asyncio-python3.7 example doc, fixes #1754 (#1762) 2020-01-20 09:00:48 -06:00
test_asgi_client.py Increase testing coverage for ASGI 2019-06-19 00:38:58 +03:00
test_asgi.py Swap out requests-async for httpx (#1728) 2019-12-20 19:23:52 -08:00
test_bad_request.py No tracebacks on normal errors and prettier error pages (#1768) 2020-01-20 08:58:14 -06:00
test_blueprint_group.py GIT-37: fix blueprint middleware application (#1690) 2019-12-20 10:01:04 -06:00
test_blueprints.py GIT-37: fix blueprint middleware application (#1690) 2019-12-20 10:01:04 -06:00
test_config.py Add custom request support to ASGI mode; fix a couple tests 2019-06-24 22:59:23 +03:00
test_cookies.py Lifespan and code cleanup 2019-06-04 10:58:00 +03:00
test_create_task.py Create requests-async based TestClient, remove aiohttp dependency, drop Python 3.5 2019-04-30 15:26:06 +03:00
test_custom_protocol.py Create requests-async based TestClient, remove aiohttp dependency, drop Python 3.5 2019-04-30 15:26:06 +03:00
test_custom_request.py Created methods to append and finish body content on Request (#1379) 2018-11-12 09:11:41 -06:00
test_dynamic_routes.py Create requests-async based TestClient, remove aiohttp dependency, drop Python 3.5 2019-04-30 15:26:06 +03:00
test_exceptions_handler.py No tracebacks on normal errors and prettier error pages (#1768) 2020-01-20 08:58:14 -06:00
test_exceptions.py No tracebacks on normal errors and prettier error pages (#1768) 2020-01-20 08:58:14 -06:00
test_headers.py deprecate None value support for app name (#1705) 2019-10-23 09:12:20 -07:00
test_helpers.py Add custom request support to ASGI mode; fix a couple tests 2019-06-24 22:59:23 +03:00
test_keep_alive_timeout.py Swap out requests-async for httpx (#1728) 2019-12-20 19:23:52 -08:00
test_logging.py Create requests-async based TestClient, remove aiohttp dependency, drop Python 3.5 2019-04-30 15:26:06 +03:00
test_logo.py Set testing.PORT on all app.create_server() in tests (#1593) 2019-05-30 09:10:00 -05:00
test_middleware.py No tracebacks on normal errors and prettier error pages (#1768) 2020-01-20 08:58:14 -06:00
test_multiprocessing.py Fix tests for multiprocessing pickle app and pickle blueprint (#1680) 2019-09-18 10:22:24 -07:00
test_named_routes.py Create requests-async based TestClient, remove aiohttp dependency, drop Python 3.5 2019-04-30 15:26:06 +03:00
test_payload_too_large.py No tracebacks on normal errors and prettier error pages (#1768) 2020-01-20 08:58:14 -06:00
test_redirect.py GIT-1591 Strict Slashes behavior fix (#1594) 2019-06-06 07:21:58 -05:00
test_request_buffer_queue_size.py Swap out requests-async for httpx (#1728) 2019-12-20 19:23:52 -08:00
test_request_cancel.py GIT-1591 Strict Slashes behavior fix (#1594) 2019-06-06 07:21:58 -05:00
test_request_data.py deprecate None value support for app name (#1705) 2019-10-23 09:12:20 -07:00
test_request_stream.py No tracebacks on normal errors and prettier error pages (#1768) 2020-01-20 08:58:14 -06:00
test_request_timeout.py No tracebacks on normal errors and prettier error pages (#1768) 2020-01-20 08:58:14 -06:00
test_requests.py More robust response datatype handling (#1674) 2020-01-20 10:34:32 -06:00
test_response_timeout.py No tracebacks on normal errors and prettier error pages (#1768) 2020-01-20 08:58:14 -06:00
test_response.py More robust response datatype handling (#1674) 2020-01-20 10:34:32 -06:00
test_routes.py Allow route decorators to stack up again (#1764) 2020-01-10 21:50:16 -08:00
test_server_events.py deprecate None value support for app name (#1705) 2019-10-23 09:12:20 -07:00
test_signal_handlers.py Create requests-async based TestClient, remove aiohttp dependency, drop Python 3.5 2019-04-30 15:26:06 +03:00
test_static.py No tracebacks on normal errors and prettier error pages (#1768) 2020-01-20 08:58:14 -06:00
test_test_client_port.py Create requests-async based TestClient, remove aiohttp dependency, drop Python 3.5 2019-04-30 15:26:06 +03:00
test_url_building.py Create requests-async based TestClient, remove aiohttp dependency, drop Python 3.5 2019-04-30 15:26:06 +03:00
test_url_for_static.py Run linter 2018-12-30 13:18:06 +02:00
test_utf8.py Swap out requests-async for httpx (#1728) 2019-12-20 19:23:52 -08:00
test_vhosts.py Run linter 2018-12-30 13:18:06 +02:00
test_views.py No tracebacks on normal errors and prettier error pages (#1768) 2020-01-20 08:58:14 -06:00
test_worker.py Create requests-async based TestClient, remove aiohttp dependency, drop Python 3.5 2019-04-30 15:26:06 +03:00