sanic/tests
L. Kärkkäinen 1e4b1c4d1a Forwarded headers and otherwise improved proxy handling (#1638)
* Added support for HTTP Forwarded header and combined parsing of other proxy headers.

- Accessible via request.forwarded that tries parse_forwarded and then parse_xforwarded
- parse_forwarded uses the Forwarded header, if config.FORWARDED_SECRET is provided and a matching header field is found
- parse_xforwarded uses X-Real-IP and X-Forwarded-* much alike the existing implementation
- This commit does not change existing request properties that still use the old code and won't make use of Forwarded headers.

* Use req.forwarded in req properties server_name, server_port, scheme and remote_addr.

X-Scheme handling moved to parse_xforwarded.

* Cleanup and fix req.server_port; no longer reports socket port if any forwards headers are used.

* Update docstrings to incidate that forwarded header is used first.

* Remove testing function.

* Fix tests and linting.

- One test removed due to change of semantics - no socket port will be used if any forwarded headers are in effect.
- Other tests augmented with X-Forwarded-For, to allow the header being tested take effect (shouldn't affect old implementation).

* Try to workaround buggy tools complaining about incorrect ordering of imports.

* Cleanup forwarded processing, add comments. secret is now also returned.

* Added tests, fixed quoted string handling, cleanup.

* Further tests for full coverage.

* Try'n make linter happy.

* Add support for multiple Forwarded headers. Unify parse_forwarded parameters with parse_xforwarded.

* Implement multiple headers support for X-Forwarded-For.

- Previously only the first header was used, so this BUGFIX may affect functionality.

* Bugfix for request.server_name: strip port and other parts.

- request.server_name docs claim that it returns the hostname only (no port).
- config.SERVER_NAME may be full URL, so strip scheme, port and path
- HTTP Host and consequently forwarded Host may include port number, so
  strip that also for forwarded hosts (previously only done for HTTP Host).
- Possible performance benefit of limiting to one split.

* Fallback to app.url_for and let it handle SERVER_NAME if defined (until a proper solution is implemented).

* Revise previous commit. Only fallback for full URL SERVER_NAMEs; allows host to be defined and proxied information still being used.

* Heil lintnazi.

* Modify testcase not to use underscores in URLs. Use hyphens which the spec allows for.

* Forwarded and Host header parsing improved.

- request.forwarded lowercases hosts, separates host:port into their own fields and lowercases addresses
- forwarded.parse_host helper function added and used for parsing all host-style headers (IPv6 cannot be simply split(":")).
- more tests fixed not to use underscores in hosts as those are no longer accepted and lead to the field being rejected

* Fixed typo in docstring.

* Added IPv6 address tests for Host header.

* Fix regex.

* Further tests and stricter forwarded handling.

* Fix merge commit

* Linter

* Linter

* Linter

* Add  to avoid re-using the  variable. Make a few raw strings non-raw.

* Remove unnecessary or

* Updated docs (work in progress).

* Enable REAL_IP_HEADER parsing irregardless of PROXIES_COUNT setting.

- Also cleanup and added comments

* New defaults for PROXIES_COUNT and REAL_IP_HEADER, updated tests.

* Remove support for PROXIES_COUNT=-1.

* Linter errors.

- This is getting ridiculous: cannot fit an URL on one line, linter requires
  splitting the string literal!

* Add support for by=_proxySecret, updated docs, updated tests.

* Forwarded headers' semantics tuning.

- Forwarded host is now preserved in original format
- request.host now returns a forwarded host if available, else the Host header
- Forwarded options are preserved in original order, and later keys override earlier ones
- Forwarded path is automatically URL-unquoted
- Forwarded 'by' and 'for' are omitted if their value is unknown
- Tests modified accordingly
- Cleanup and improved documentation

* Add ASGI test.

* Linter

* Linter #2
2019-09-02 08:50:56 -05: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 Lifespan and code cleanup 2019-06-04 10:58:00 +03:00
test_asgi_client.py Increase testing coverage for ASGI 2019-06-19 00:38:58 +03:00
test_asgi.py Add content-type headers in response in ASGI mode 2019-08-11 11:29:08 +03:00
test_bad_request.py Run linter 2018-12-30 13:18:06 +02:00
test_blueprint_group.py Create requests-async based TestClient, remove aiohttp dependency, drop Python 3.5 2019-04-30 15:26:06 +03:00
test_blueprints.py GIT-1591 Strict Slashes behavior fix (#1594) 2019-06-06 07:21:58 -05: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 Create requests-async based TestClient, remove aiohttp dependency, drop Python 3.5 2019-04-30 15:26:06 +03:00
test_exceptions.py Create requests-async based TestClient, remove aiohttp dependency, drop Python 3.5 2019-04-30 15:26:06 +03:00
test_headers.py PEP 594 has cgi module scheduled for deprecation in Python 3.8 (#1649) 2019-08-27 08:30:23 -05: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 GIT-1591 Strict Slashes behavior fix (#1594) 2019-06-06 07:21:58 -05: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 Create requests-async based TestClient, remove aiohttp dependency, drop Python 3.5 2019-04-30 15:26:06 +03:00
test_multiprocessing.py Create requests-async based TestClient, remove aiohttp dependency, drop Python 3.5 2019-04-30 15:26:06 +03: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 Run linter 2018-12-30 13:18:06 +02:00
test_redirect.py GIT-1591 Strict Slashes behavior fix (#1594) 2019-06-06 07:21:58 -05:00
test_request_cancel.py GIT-1591 Strict Slashes behavior fix (#1594) 2019-06-06 07:21:58 -05:00
test_request_data.py Create requests-async based TestClient, remove aiohttp dependency, drop Python 3.5 2019-04-30 15:26:06 +03:00
test_request_stream.py Increase testing coverage for ASGI 2019-06-19 00:38:58 +03:00
test_request_timeout.py GIT-1591 Strict Slashes behavior fix (#1594) 2019-06-06 07:21:58 -05:00
test_requests.py Forwarded headers and otherwise improved proxy handling (#1638) 2019-09-02 08:50:56 -05:00
test_response_timeout.py Create requests-async based TestClient, remove aiohttp dependency, drop Python 3.5 2019-04-30 15:26:06 +03:00
test_response.py GIT-1591 Strict Slashes behavior fix (#1594) 2019-06-06 07:21:58 -05:00
test_routes.py Increase testing coverage for ASGI 2019-06-19 00:38:58 +03:00
test_server_events.py Merge branch 'master' into asgi-refactor-attempt 2019-06-11 11:11:32 +03: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 Create requests-async based TestClient, remove aiohttp dependency, drop Python 3.5 2019-04-30 15:26:06 +03: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 Create requests-async based TestClient, remove aiohttp dependency, drop Python 3.5 2019-04-30 15:26:06 +03:00
test_vhosts.py Run linter 2018-12-30 13:18:06 +02:00
test_views.py Create requests-async based TestClient, remove aiohttp dependency, drop Python 3.5 2019-04-30 15:26:06 +03:00
test_worker.py Create requests-async based TestClient, remove aiohttp dependency, drop Python 3.5 2019-04-30 15:26:06 +03:00