Skip to main content

A library to proxy web traffic through Home Assistant integrations.

Project description

hass-web-proxy-lib

A small Home Assistant library to proxy web traffic through Home Assistant. Used by the Home Assistant Web Proxy Integration and any other integration that needs to proxy traffic through Home Assistant.

This library is not itself an integration but rather can be used by integration developers to offer proxying capabilities within their own integration.

Usage

Use this library as part of your custom integration by declaring a new HomeAssistantView that inherits from the ProxyView or WebsocketProxyView class in this library. Callers must implement the _get_proxied_url method to return a ProxiedURL object containing a destination URL for a given proxy request, or raising an exception to indicate an error condition.

Example Usage

Proxies a GET request from https://$HA_INSTANCE/api/my_integration/proxy/ through to whatever URL is specified in the url query string parameter of the request.

@callback
async def async_setup_entry(hass: HomeAssistant) -> None:
    """Set up the HASS web proxy entry."""
    session = async_get_clientsession(hass)
    hass.http.register_view(MyProxyView(hass, session))


class MyProxyView(ProxyView):
    """A proxy view for My Integration."""

    url = "/api/my_integration/proxy/"
    name = "api:my_integration:proxy"

    def _get_proxied_url(self, request: web.Request) -> ProxiedURL:
        """Get the URL to proxy."""
        if "url" not in request.query:
            raise HASSWebProxyLibNotFoundRequestError
        return ProxiedURL(url=urllib.parse.unquote(request.query["url"]))

See the hass-web-proxy-integration for a more complete example of usage of this library.

Key Classes

ProxyView

The main class to inherit from for simple GET request proxying. Inheritors must implement _get_proxied_url(...) to return a ProxiedURL object.

WebsocketProxyView

The class to inherit from for websocket proxying. Inheritors must implement _get_proxied_url(...) to return a ProxiedURL object.

ProxiedURL

A small dataclass returned by overridden _get_proxied_url(...) methods that describes how the library should proxy a given request.

Field name Default Description
url The destination URL a given request should be made to, e.g. https://my-backend.my-domain.io.
ssl_context An optional SSLContext object that should be used for secure onward requests.
query_params An optional dictionary of query parameters to set in the target URL. This is a convenience alternative to the caller simply adding the query string parameters onto the url parameter.
allow_unauthenticated False When False or unset, unauthenticated HA traffic will be rejected with a 401 Unauthorized status. When True, unauthenticated traffic will be allowed.

Errors

HASSWebProxyLibBadRequestError

Can be raised by _get_proxied_url(...) to indicate a bad request (400 Bad Request).

HASSWebProxyLibUnauthorizedRequestError

Can be raised by _get_proxied_url(...) to indicate an unauthorized request (401 Unauthorized).

HASSWebProxyLibForbiddenRequestError

Can be raised by _get_proxied_url(...) to indicate a forbidden request (403 Forbidden).

HASSWebProxyLibNotFoundRequestError

Can be raised by _get_proxied_url(...) to indicate a request is not found request (404 Not Found).

HASSWebProxyLibExpiredError

Can be raised by _get_proxied_url(...) to indicate an expired / permanently removed resource is not available (410 Gone).

Testing

This library also contains a small test utility and fixture file that can be used to test proxying.

The local_server fixture will start a small aiohttp server that can be "proxied to". The server listens to / and /ws for simple GET requests and websockets respectively.

/

The / handler will return a json object containing:

Field name Description
headers A dictionary of the request headers received.
url The full URL/querystring requested.

/ws

The /ws handler will initially return a json object containing headers and url (as in / above), and then will simply echo back text or binary data.

Example Test Usage

import pytest

# Add the HA and local_server fixtures.
pytest_plugins = [
    "pytest_homeassistant_custom_component",
    "hass_web_proxy_lib.tests.utils",
]

async def test_proxy_view_success(
    hass: HomeAssistant,
    local_server: Any,
    hass_client: Any,
) -> None:
    """Test that a valid URL proxies successfully."""
    authenticated_hass_client = await hass_client()
    resp = await authenticated_hass_client.get(
        f"/api/my_integration/proxy/?url={urllib.parse.quote_plus(local_server)}"
    )
    assert resp.status == HTTPStatus.OK

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

hass_web_proxy_lib-0.0.4.tar.gz (11.1 kB view details)

Uploaded Source

Built Distribution

hass_web_proxy_lib-0.0.4-py3-none-any.whl (11.8 kB view details)

Uploaded Python 3

File details

Details for the file hass_web_proxy_lib-0.0.4.tar.gz.

File metadata

  • Download URL: hass_web_proxy_lib-0.0.4.tar.gz
  • Upload date:
  • Size: 11.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.4 CPython/3.12.7 Linux/5.4.0-196-generic

File hashes

Hashes for hass_web_proxy_lib-0.0.4.tar.gz
Algorithm Hash digest
SHA256 34a9024707b9bd297521956284de05c2eccab8101a6f692eec61c262249cc3ec
MD5 2aa98d167f9b755a76c471b2e283c074
BLAKE2b-256 56772298966c6d56d772299d7590bff28967227136f458426e083cd2f9ade5d0

See more details on using hashes here.

File details

Details for the file hass_web_proxy_lib-0.0.4-py3-none-any.whl.

File metadata

  • Download URL: hass_web_proxy_lib-0.0.4-py3-none-any.whl
  • Upload date:
  • Size: 11.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.4 CPython/3.12.7 Linux/5.4.0-196-generic

File hashes

Hashes for hass_web_proxy_lib-0.0.4-py3-none-any.whl
Algorithm Hash digest
SHA256 82c8ed5f1a2402f5b83eb4d32e72bb9e1905d9d2d3f4178885651933b8320534
MD5 01511b9f793fe794a09cff0ce624d9ac
BLAKE2b-256 99c5dc49cfbd0d79aff2b083d47001864825a031375b06ab8a6613af22dfc6af

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page