From d351298b44d267cd0aeb2709bd6c77ad080370eb Mon Sep 17 00:00:00 2001 From: SavinduDimal Date: Mon, 13 Jul 2026 14:10:52 +0530 Subject: [PATCH 1/5] Add SDK changes to clone header context --- sdk/core/policy/v1alpha2/context.go | 59 +++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/sdk/core/policy/v1alpha2/context.go b/sdk/core/policy/v1alpha2/context.go index 8cd784e94..434d0f7b4 100644 --- a/sdk/core/policy/v1alpha2/context.go +++ b/sdk/core/policy/v1alpha2/context.go @@ -17,6 +17,29 @@ type Body struct { Present bool } +// DownstreamContext holds an immutable snapshot of data as received from the +// downstream client, captured before any policy mutation is applied. +// +// Downstream is nil on older gateways that predate this field. Policies MUST +// nil-check before use and fall back to legacy validation. +// +type DownstreamContext struct { + // Headers is the original request headers exactly as received from the + // downstream client, before any policy mutation. + Headers *Headers +} + +// UpstreamContext holds an immutable snapshot of data as received from the +// upstream backend, captured before any policy mutation is applied. +// +// Upstream is nil on older gateways that predate this field. Policies MUST +// nil-check before use and fall back to legacy validation. +type UpstreamContext struct { + // Headers is the original response headers exactly as received from the + // upstream backend, before any policy mutation. Read-only. + Headers *Headers +} + // SharedContext contains data shared across request and response phases type SharedContext struct { // ProjectID is the project ID which the API is associated with @@ -75,6 +98,10 @@ type RequestHeaderContext struct { Authority string Scheme string Vhost string + + // Downstream holds the immutable snapshot of the original client request + // headers, captured before any policy mutation. Nil on older gateways. + Downstream *DownstreamContext } // RequestContext is passed to RequestPolicy.OnRequestBody. @@ -99,6 +126,10 @@ type RequestContext struct { // used to address the actual upstream (e.g. for request signing) — use // UpstreamInfo.URL instead. UpstreamInfo *policyenginev1.UpstreamInfo + + // Downstream holds the immutable snapshot of the original client request + // headers, captured before any policy mutation. Nil on older gateways. + Downstream *DownstreamContext } // ─── Response-phase contexts ───────────────────────────────────────────────── @@ -119,6 +150,14 @@ type ResponseHeaderContext struct { // Current response status code ResponseStatus int + + // Downstream holds the immutable snapshot of the original client request + // headers, captured before any policy mutation. Nil on older gateways. + Downstream *DownstreamContext + + // Upstream holds the immutable snapshot of the original upstream response + // headers, captured before any policy mutation. Nil on older gateways. + Upstream *UpstreamContext } // ResponseContext is passed to ResponsePolicy.OnResponseBody. @@ -143,6 +182,14 @@ type ResponseContext struct { // Current response status code ResponseStatus int + + // Downstream holds the immutable snapshot of the original client request + // headers, captured before any policy mutation. Nil on older gateways. + Downstream *DownstreamContext + + // Upstream holds the immutable snapshot of the original upstream response + // headers, captured before any policy mutation. Nil on older gateways. + Upstream *UpstreamContext } // ─── Streaming contexts ────────────────────────────────────────────────────── @@ -180,6 +227,10 @@ type RequestStreamContext struct { Authority string Scheme string Vhost string + + // Downstream holds the immutable snapshot of the original client request + // headers, captured before any policy mutation. Nil on older gateways. + Downstream *DownstreamContext } // ResponseStreamContext is the per-chunk context passed to StreamingResponseBodyPolicy. @@ -199,4 +250,12 @@ type ResponseStreamContext struct { // Current response status code ResponseStatus int + + // Downstream holds the immutable snapshot of the original client request + // headers, captured before any policy mutation. Nil on older gateways. + Downstream *DownstreamContext + + // Upstream holds the immutable snapshot of the original upstream response + // headers, captured before any policy mutation. Nil on older gateways. + Upstream *UpstreamContext } From a247230dab09ab1c856320367d330c3db51e4bbe Mon Sep 17 00:00:00 2001 From: SavinduDimal Date: Mon, 13 Jul 2026 14:18:27 +0530 Subject: [PATCH 2/5] Add python SDK changes to clone header context --- .../apip_sdk_core/policy/v1alpha2/__init__.py | 4 ++ .../apip_sdk_core/policy/v1alpha2/types.py | 40 +++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/sdk-python/src/apip_sdk_core/policy/v1alpha2/__init__.py b/sdk-python/src/apip_sdk_core/policy/v1alpha2/__init__.py index 0f2050af4..7128d3df7 100644 --- a/sdk-python/src/apip_sdk_core/policy/v1alpha2/__init__.py +++ b/sdk-python/src/apip_sdk_core/policy/v1alpha2/__init__.py @@ -44,6 +44,7 @@ AuthContext, Body, BodyProcessingMode, + DownstreamContext, ExecutionContext, ExecutionPhase, HeaderProcessingMode, @@ -58,12 +59,14 @@ ResponseStreamContext, SharedContext, StreamBody, + UpstreamContext, ) __all__ = [ "AuthContext", "Body", "BodyProcessingMode", + "DownstreamContext", "DownstreamResponseHeaderModifications", "DownstreamResponseModifications", "DropHeaderAction", @@ -98,6 +101,7 @@ "StreamingResponseAction", "StreamingResponsePolicy", "TerminateResponseChunk", + "UpstreamContext", "UpstreamRequestHeaderModifications", "UpstreamRequestModifications", ] diff --git a/sdk-python/src/apip_sdk_core/policy/v1alpha2/types.py b/sdk-python/src/apip_sdk_core/policy/v1alpha2/types.py index a6f89a3b2..536361390 100644 --- a/sdk-python/src/apip_sdk_core/policy/v1alpha2/types.py +++ b/sdk-python/src/apip_sdk_core/policy/v1alpha2/types.py @@ -129,6 +129,37 @@ class StreamBody: index: int = 0 +@dataclass(slots=True) +class DownstreamContext: + """Immutable snapshot of the original client request headers, captured + before any policy mutation. + + ``None`` on older gateways that predate this field. Policies MUST treat a + ``None`` ``downstream`` (or a ``None`` ``headers``) as "not available" and + fall back to legacy validation against the mutable headers. + + ``headers`` is ``Headers | None`` (defaulting to ``None``) to mirror the Go + SDK's nilable ``Headers *Headers``: the kernel leaves it ``None`` when no + snapshot is available, rather than substituting an empty ``Headers()`` that + a policy could not distinguish from "the client sent no headers". + """ + + headers: Headers | None = None + + +@dataclass(slots=True) +class UpstreamContext: + """Immutable snapshot of the original upstream response headers, captured + before any policy mutation. ``None`` on older gateways; see + :class:`DownstreamContext` for the backward-compat contract. + + ``headers`` is ``Headers | None`` (defaulting to ``None``), mirroring the Go + SDK's nilable ``Headers *Headers`` — see :class:`DownstreamContext`. + """ + + headers: Headers | None = None + + @dataclass(slots=True) class RequestHeaderContext: shared: SharedContext @@ -138,6 +169,7 @@ class RequestHeaderContext: authority: str = "" scheme: str = "" vhost: str = "" + downstream: DownstreamContext | None = None @dataclass(slots=True) @@ -150,6 +182,7 @@ class RequestContext: authority: str = "" scheme: str = "" vhost: str = "" + downstream: DownstreamContext | None = None @dataclass(slots=True) @@ -161,6 +194,8 @@ class ResponseHeaderContext: request_method: str = "" response_headers: Headers = field(default_factory=Headers) response_status: int = 200 + downstream: DownstreamContext | None = None + upstream: UpstreamContext | None = None @dataclass(slots=True) @@ -173,6 +208,8 @@ class ResponseContext: response_headers: Headers = field(default_factory=Headers) response_body: Body | None = None response_status: int = 200 + downstream: DownstreamContext | None = None + upstream: UpstreamContext | None = None @dataclass(slots=True) @@ -184,6 +221,7 @@ class RequestStreamContext: authority: str = "" scheme: str = "" vhost: str = "" + downstream: DownstreamContext | None = None @dataclass(slots=True) @@ -195,6 +233,8 @@ class ResponseStreamContext: request_method: str = "" response_headers: Headers = field(default_factory=Headers) response_status: int = 200 + downstream: DownstreamContext | None = None + upstream: UpstreamContext | None = None @dataclass(slots=True) From 3a1d0ee924e9291d4a855f1e1a0327d81d7d6d22 Mon Sep 17 00:00:00 2001 From: SavinduDimal Date: Sat, 18 Jul 2026 16:36:43 +0530 Subject: [PATCH 3/5] Refactor context types to improve clarity Refactor context types to improve clarity and consistency in upstream/downstream handling --- sdk/core/policy/v1alpha2/context.go | 102 +++++++++++++++++----------- 1 file changed, 61 insertions(+), 41 deletions(-) diff --git a/sdk/core/policy/v1alpha2/context.go b/sdk/core/policy/v1alpha2/context.go index 434d0f7b4..439316aa7 100644 --- a/sdk/core/policy/v1alpha2/context.go +++ b/sdk/core/policy/v1alpha2/context.go @@ -17,26 +17,32 @@ type Body struct { Present bool } -// DownstreamContext holds an immutable snapshot of data as received from the -// downstream client, captured before any policy mutation is applied. -// -// Downstream is nil on older gateways that predate this field. Policies MUST -// nil-check before use and fall back to legacy validation. -// +// DownstreamContext holds a snapshot of data as received from the downstream +// client, captured before any policy mutation is applied. type DownstreamContext struct { - // Headers is the original request headers exactly as received from the - // downstream client, before any policy mutation. Headers *Headers } -// UpstreamContext holds an immutable snapshot of data as received from the +// RequestUpstream identifies the route's resolved upstream target during the +// request phase. +type RequestUpstream struct { + UpstreamName string + URL string + BasePath string +} + +// ResponseUpstream identifies the route's resolved upstream target during the +// response phase and carries a snapshot of the upstream response. +type ResponseUpstream struct { + UpstreamName string + URL string + BasePath string + Response *UpstreamResponse +} + +// UpstreamResponse holds a snapshot of the response as received from the // upstream backend, captured before any policy mutation is applied. -// -// Upstream is nil on older gateways that predate this field. Policies MUST -// nil-check before use and fall back to legacy validation. -type UpstreamContext struct { - // Headers is the original response headers exactly as received from the - // upstream backend, before any policy mutation. Read-only. +type UpstreamResponse struct { Headers *Headers } @@ -99,9 +105,13 @@ type RequestHeaderContext struct { Scheme string Vhost string - // Downstream holds the immutable snapshot of the original client request - // headers, captured before any policy mutation. Nil on older gateways. + // Downstream holds the snapshot of the client request headers, captured + // before any policy mutation. Downstream *DownstreamContext + + // Upstream identifies the route's resolved upstream target for this + // request. + Upstream *RequestUpstream } // RequestContext is passed to RequestPolicy.OnRequestBody. @@ -120,16 +130,19 @@ type RequestContext struct { Scheme string Vhost string - // UpstreamInfo identifies the route's resolved upstream target (cluster name, URL, - // base path) for this request. Nil if no upstream has been resolved for the route. - // Authority/Scheme above reflect the inbound client-facing request and must not be - // used to address the actual upstream (e.g. for request signing) — use - // UpstreamInfo.URL instead. + // Deprecated: UpstreamInfo exposes the internal Envoy cluster name and its + // resolved-upstream shape was incorrect. Use Upstream (*RequestUpstream) + // instead, which exposes UpstreamName rather than the internal cluster name. + // Retained for backward compatibility; will be removed in a future release. UpstreamInfo *policyenginev1.UpstreamInfo - // Downstream holds the immutable snapshot of the original client request - // headers, captured before any policy mutation. Nil on older gateways. + // Downstream holds the snapshot of the client request headers, captured + // before any policy mutation. Downstream *DownstreamContext + + // Upstream identifies the route's resolved upstream target for this + // request. + Upstream *RequestUpstream } // ─── Response-phase contexts ───────────────────────────────────────────────── @@ -151,13 +164,14 @@ type ResponseHeaderContext struct { // Current response status code ResponseStatus int - // Downstream holds the immutable snapshot of the original client request - // headers, captured before any policy mutation. Nil on older gateways. + // Downstream holds the snapshot of the client request headers, captured + // before any policy mutation. Downstream *DownstreamContext - // Upstream holds the immutable snapshot of the original upstream response - // headers, captured before any policy mutation. Nil on older gateways. - Upstream *UpstreamContext + // Upstream identifies the route's resolved upstream target and carries the + // snapshot of the upstream response headers, captured before any policy + // mutation. + Upstream *ResponseUpstream } // ResponseContext is passed to ResponsePolicy.OnResponseBody. @@ -183,13 +197,14 @@ type ResponseContext struct { // Current response status code ResponseStatus int - // Downstream holds the immutable snapshot of the original client request - // headers, captured before any policy mutation. Nil on older gateways. + // Downstream holds the snapshot of the client request headers, captured + // before any policy mutation. Downstream *DownstreamContext - // Upstream holds the immutable snapshot of the original upstream response - // headers, captured before any policy mutation. Nil on older gateways. - Upstream *UpstreamContext + // Upstream identifies the route's resolved upstream target and carries the + // snapshot of the upstream response headers, captured before any policy + // mutation. + Upstream *ResponseUpstream } // ─── Streaming contexts ────────────────────────────────────────────────────── @@ -228,9 +243,13 @@ type RequestStreamContext struct { Scheme string Vhost string - // Downstream holds the immutable snapshot of the original client request - // headers, captured before any policy mutation. Nil on older gateways. + // Downstream holds the snapshot of the client request headers, captured + // before any policy mutation. Downstream *DownstreamContext + + // Upstream identifies the route's resolved upstream target for this + // request. + Upstream *RequestUpstream } // ResponseStreamContext is the per-chunk context passed to StreamingResponseBodyPolicy. @@ -251,11 +270,12 @@ type ResponseStreamContext struct { // Current response status code ResponseStatus int - // Downstream holds the immutable snapshot of the original client request - // headers, captured before any policy mutation. Nil on older gateways. + // Downstream holds the snapshot of the client request headers, captured + // before any policy mutation. Downstream *DownstreamContext - // Upstream holds the immutable snapshot of the original upstream response - // headers, captured before any policy mutation. Nil on older gateways. - Upstream *UpstreamContext + // Upstream identifies the route's resolved upstream target and carries the + // snapshot of the upstream response headers, captured before any policy + // mutation. + Upstream *ResponseUpstream } From 6f3fac2b7e9eb86c9cea73c549e5827a9c07f59e Mon Sep 17 00:00:00 2001 From: SavinduDimal Date: Sat, 18 Jul 2026 16:54:49 +0530 Subject: [PATCH 4/5] Refactor SDK for python --- .../apip_sdk_core/policy/v1alpha2/__init__.py | 8 ++- .../apip_sdk_core/policy/v1alpha2/types.py | 52 ++++++++++++++----- 2 files changed, 44 insertions(+), 16 deletions(-) diff --git a/sdk-python/src/apip_sdk_core/policy/v1alpha2/__init__.py b/sdk-python/src/apip_sdk_core/policy/v1alpha2/__init__.py index 7128d3df7..0ef363782 100644 --- a/sdk-python/src/apip_sdk_core/policy/v1alpha2/__init__.py +++ b/sdk-python/src/apip_sdk_core/policy/v1alpha2/__init__.py @@ -54,12 +54,14 @@ RequestContext, RequestHeaderContext, RequestStreamContext, + RequestUpstream, ResponseContext, ResponseHeaderContext, ResponseStreamContext, + ResponseUpstream, SharedContext, StreamBody, - UpstreamContext, + UpstreamResponse, ) __all__ = [ @@ -87,6 +89,7 @@ "RequestHeaderPolicy", "RequestPolicy", "RequestStreamContext", + "RequestUpstream", "ResponseAction", "ResponseContext", "ResponseHeaderAction", @@ -94,6 +97,7 @@ "ResponseHeaderPolicy", "ResponsePolicy", "ResponseStreamContext", + "ResponseUpstream", "SharedContext", "StreamBody", "StreamingRequestAction", @@ -101,7 +105,7 @@ "StreamingResponseAction", "StreamingResponsePolicy", "TerminateResponseChunk", - "UpstreamContext", "UpstreamRequestHeaderModifications", "UpstreamRequestModifications", + "UpstreamResponse", ] diff --git a/sdk-python/src/apip_sdk_core/policy/v1alpha2/types.py b/sdk-python/src/apip_sdk_core/policy/v1alpha2/types.py index 536361390..c039c83d7 100644 --- a/sdk-python/src/apip_sdk_core/policy/v1alpha2/types.py +++ b/sdk-python/src/apip_sdk_core/policy/v1alpha2/types.py @@ -131,12 +131,8 @@ class StreamBody: @dataclass(slots=True) class DownstreamContext: - """Immutable snapshot of the original client request headers, captured - before any policy mutation. - - ``None`` on older gateways that predate this field. Policies MUST treat a - ``None`` ``downstream`` (or a ``None`` ``headers``) as "not available" and - fall back to legacy validation against the mutable headers. + """Snapshot of the client request headers, captured before any policy + mutation. ``headers`` is ``Headers | None`` (defaulting to ``None``) to mirror the Go SDK's nilable ``Headers *Headers``: the kernel leaves it ``None`` when no @@ -148,18 +144,43 @@ class DownstreamContext: @dataclass(slots=True) -class UpstreamContext: - """Immutable snapshot of the original upstream response headers, captured - before any policy mutation. ``None`` on older gateways; see - :class:`DownstreamContext` for the backward-compat contract. +class RequestUpstream: + """Route's resolved upstream target during the request phase. + + ``upstream_name`` replaces the internal Envoy cluster name. Use ``url`` to + address the actual upstream (e.g. for request signing); the client-facing + authority/scheme on the context must not be used for that. + """ + + upstream_name: str = "" + url: str = "" + base_path: str = "" + + +@dataclass(slots=True) +class UpstreamResponse: + """Snapshot of the response as received from the upstream backend, captured + before any policy mutation. ``headers`` is ``Headers | None`` (defaulting to ``None``), mirroring the Go - SDK's nilable ``Headers *Headers`` — see :class:`DownstreamContext`. + SDK's nilable ``Headers *Headers``. """ headers: Headers | None = None +@dataclass(slots=True) +class ResponseUpstream: + """Route's resolved upstream target during the response phase, carrying a + snapshot of the upstream response. + """ + + upstream_name: str = "" + url: str = "" + base_path: str = "" + response: UpstreamResponse | None = None + + @dataclass(slots=True) class RequestHeaderContext: shared: SharedContext @@ -170,6 +191,7 @@ class RequestHeaderContext: scheme: str = "" vhost: str = "" downstream: DownstreamContext | None = None + upstream: RequestUpstream | None = None @dataclass(slots=True) @@ -183,6 +205,7 @@ class RequestContext: scheme: str = "" vhost: str = "" downstream: DownstreamContext | None = None + upstream: RequestUpstream | None = None @dataclass(slots=True) @@ -195,7 +218,7 @@ class ResponseHeaderContext: response_headers: Headers = field(default_factory=Headers) response_status: int = 200 downstream: DownstreamContext | None = None - upstream: UpstreamContext | None = None + upstream: ResponseUpstream | None = None @dataclass(slots=True) @@ -209,7 +232,7 @@ class ResponseContext: response_body: Body | None = None response_status: int = 200 downstream: DownstreamContext | None = None - upstream: UpstreamContext | None = None + upstream: ResponseUpstream | None = None @dataclass(slots=True) @@ -222,6 +245,7 @@ class RequestStreamContext: scheme: str = "" vhost: str = "" downstream: DownstreamContext | None = None + upstream: RequestUpstream | None = None @dataclass(slots=True) @@ -234,7 +258,7 @@ class ResponseStreamContext: response_headers: Headers = field(default_factory=Headers) response_status: int = 200 downstream: DownstreamContext | None = None - upstream: UpstreamContext | None = None + upstream: ResponseUpstream | None = None @dataclass(slots=True) From acc2061addcde51ef47f20283dd7b4205ae0563f Mon Sep 17 00:00:00 2001 From: SavinduDimal Date: Tue, 21 Jul 2026 12:24:18 +0530 Subject: [PATCH 5/5] Refactor context types Refactor context types to enhance clarity and consistency in downstream and upstream request handling --- .../apip_sdk_core/policy/v1alpha2/__init__.py | 10 +++-- .../apip_sdk_core/policy/v1alpha2/types.py | 41 +++++++++++------- sdk/core/policy/v1alpha2/context.go | 42 +++++++++++-------- 3 files changed, 57 insertions(+), 36 deletions(-) diff --git a/sdk-python/src/apip_sdk_core/policy/v1alpha2/__init__.py b/sdk-python/src/apip_sdk_core/policy/v1alpha2/__init__.py index 0ef363782..4cee9c72b 100644 --- a/sdk-python/src/apip_sdk_core/policy/v1alpha2/__init__.py +++ b/sdk-python/src/apip_sdk_core/policy/v1alpha2/__init__.py @@ -45,6 +45,7 @@ Body, BodyProcessingMode, DownstreamContext, + DownstreamRequest, ExecutionContext, ExecutionPhase, HeaderProcessingMode, @@ -54,14 +55,14 @@ RequestContext, RequestHeaderContext, RequestStreamContext, - RequestUpstream, ResponseContext, ResponseHeaderContext, ResponseStreamContext, - ResponseUpstream, SharedContext, StreamBody, + UpstreamRequestContext, UpstreamResponse, + UpstreamResponseContext, ) __all__ = [ @@ -69,6 +70,7 @@ "Body", "BodyProcessingMode", "DownstreamContext", + "DownstreamRequest", "DownstreamResponseHeaderModifications", "DownstreamResponseModifications", "DropHeaderAction", @@ -89,7 +91,6 @@ "RequestHeaderPolicy", "RequestPolicy", "RequestStreamContext", - "RequestUpstream", "ResponseAction", "ResponseContext", "ResponseHeaderAction", @@ -97,7 +98,6 @@ "ResponseHeaderPolicy", "ResponsePolicy", "ResponseStreamContext", - "ResponseUpstream", "SharedContext", "StreamBody", "StreamingRequestAction", @@ -105,7 +105,9 @@ "StreamingResponseAction", "StreamingResponsePolicy", "TerminateResponseChunk", + "UpstreamRequestContext", "UpstreamRequestHeaderModifications", "UpstreamRequestModifications", "UpstreamResponse", + "UpstreamResponseContext", ] diff --git a/sdk-python/src/apip_sdk_core/policy/v1alpha2/types.py b/sdk-python/src/apip_sdk_core/policy/v1alpha2/types.py index c039c83d7..0fe00037b 100644 --- a/sdk-python/src/apip_sdk_core/policy/v1alpha2/types.py +++ b/sdk-python/src/apip_sdk_core/policy/v1alpha2/types.py @@ -130,9 +130,9 @@ class StreamBody: @dataclass(slots=True) -class DownstreamContext: - """Snapshot of the client request headers, captured before any policy - mutation. +class DownstreamRequest: + """Snapshot of the request as received from the downstream client, captured + before any policy mutation. ``headers`` is ``Headers | None`` (defaulting to ``None``) to mirror the Go SDK's nilable ``Headers *Headers``: the kernel leaves it ``None`` when no @@ -144,15 +144,28 @@ class DownstreamContext: @dataclass(slots=True) -class RequestUpstream: +class DownstreamContext: + """Downstream client, carrying a snapshot of the client request. + + Access the snapshot via ``downstream.request.headers``, mirroring the + upstream side's ``upstream.response.headers``. ``request`` is + ``DownstreamRequest | None`` (defaulting to ``None``), left ``None`` by the + kernel when no snapshot is available. + """ + + request: DownstreamRequest | None = None + + +@dataclass(slots=True) +class UpstreamRequestContext: """Route's resolved upstream target during the request phase. - ``upstream_name`` replaces the internal Envoy cluster name. Use ``url`` to + ``name`` replaces the internal Envoy cluster name. Use ``url`` to address the actual upstream (e.g. for request signing); the client-facing authority/scheme on the context must not be used for that. """ - upstream_name: str = "" + name: str = "" url: str = "" base_path: str = "" @@ -170,12 +183,12 @@ class UpstreamResponse: @dataclass(slots=True) -class ResponseUpstream: +class UpstreamResponseContext: """Route's resolved upstream target during the response phase, carrying a snapshot of the upstream response. """ - upstream_name: str = "" + name: str = "" url: str = "" base_path: str = "" response: UpstreamResponse | None = None @@ -191,7 +204,7 @@ class RequestHeaderContext: scheme: str = "" vhost: str = "" downstream: DownstreamContext | None = None - upstream: RequestUpstream | None = None + upstream: UpstreamRequestContext | None = None @dataclass(slots=True) @@ -205,7 +218,7 @@ class RequestContext: scheme: str = "" vhost: str = "" downstream: DownstreamContext | None = None - upstream: RequestUpstream | None = None + upstream: UpstreamRequestContext | None = None @dataclass(slots=True) @@ -218,7 +231,7 @@ class ResponseHeaderContext: response_headers: Headers = field(default_factory=Headers) response_status: int = 200 downstream: DownstreamContext | None = None - upstream: ResponseUpstream | None = None + upstream: UpstreamResponseContext | None = None @dataclass(slots=True) @@ -232,7 +245,7 @@ class ResponseContext: response_body: Body | None = None response_status: int = 200 downstream: DownstreamContext | None = None - upstream: ResponseUpstream | None = None + upstream: UpstreamResponseContext | None = None @dataclass(slots=True) @@ -245,7 +258,7 @@ class RequestStreamContext: scheme: str = "" vhost: str = "" downstream: DownstreamContext | None = None - upstream: RequestUpstream | None = None + upstream: UpstreamRequestContext | None = None @dataclass(slots=True) @@ -258,7 +271,7 @@ class ResponseStreamContext: response_headers: Headers = field(default_factory=Headers) response_status: int = 200 downstream: DownstreamContext | None = None - upstream: ResponseUpstream | None = None + upstream: UpstreamResponseContext | None = None @dataclass(slots=True) diff --git a/sdk/core/policy/v1alpha2/context.go b/sdk/core/policy/v1alpha2/context.go index 439316aa7..3f3973da1 100644 --- a/sdk/core/policy/v1alpha2/context.go +++ b/sdk/core/policy/v1alpha2/context.go @@ -17,24 +17,30 @@ type Body struct { Present bool } -// DownstreamContext holds a snapshot of data as received from the downstream -// client, captured before any policy mutation is applied. +// DownstreamContext identifies the downstream client and carries a snapshot of +// the client request. type DownstreamContext struct { + Request *DownstreamRequest +} + +// DownstreamRequest holds a snapshot of the request as received from the +// downstream client, captured before any policy mutation is applied. +type DownstreamRequest struct { Headers *Headers } -// RequestUpstream identifies the route's resolved upstream target during the -// request phase. -type RequestUpstream struct { - UpstreamName string +// UpstreamRequestContext identifies the route's resolved upstream target during +// the request phase. +type UpstreamRequestContext struct { + Name string URL string BasePath string } -// ResponseUpstream identifies the route's resolved upstream target during the -// response phase and carries a snapshot of the upstream response. -type ResponseUpstream struct { - UpstreamName string +// UpstreamResponseContext identifies the route's resolved upstream target during +// the response phase and carries a snapshot of the upstream response. +type UpstreamResponseContext struct { + Name string URL string BasePath string Response *UpstreamResponse @@ -111,7 +117,7 @@ type RequestHeaderContext struct { // Upstream identifies the route's resolved upstream target for this // request. - Upstream *RequestUpstream + Upstream *UpstreamRequestContext } // RequestContext is passed to RequestPolicy.OnRequestBody. @@ -131,8 +137,8 @@ type RequestContext struct { Vhost string // Deprecated: UpstreamInfo exposes the internal Envoy cluster name and its - // resolved-upstream shape was incorrect. Use Upstream (*RequestUpstream) - // instead, which exposes UpstreamName rather than the internal cluster name. + // resolved-upstream shape was incorrect. Use Upstream (*UpstreamRequestContext) + // instead, which exposes Name rather than the internal cluster name. // Retained for backward compatibility; will be removed in a future release. UpstreamInfo *policyenginev1.UpstreamInfo @@ -142,7 +148,7 @@ type RequestContext struct { // Upstream identifies the route's resolved upstream target for this // request. - Upstream *RequestUpstream + Upstream *UpstreamRequestContext } // ─── Response-phase contexts ───────────────────────────────────────────────── @@ -171,7 +177,7 @@ type ResponseHeaderContext struct { // Upstream identifies the route's resolved upstream target and carries the // snapshot of the upstream response headers, captured before any policy // mutation. - Upstream *ResponseUpstream + Upstream *UpstreamResponseContext } // ResponseContext is passed to ResponsePolicy.OnResponseBody. @@ -204,7 +210,7 @@ type ResponseContext struct { // Upstream identifies the route's resolved upstream target and carries the // snapshot of the upstream response headers, captured before any policy // mutation. - Upstream *ResponseUpstream + Upstream *UpstreamResponseContext } // ─── Streaming contexts ────────────────────────────────────────────────────── @@ -249,7 +255,7 @@ type RequestStreamContext struct { // Upstream identifies the route's resolved upstream target for this // request. - Upstream *RequestUpstream + Upstream *UpstreamRequestContext } // ResponseStreamContext is the per-chunk context passed to StreamingResponseBodyPolicy. @@ -277,5 +283,5 @@ type ResponseStreamContext struct { // Upstream identifies the route's resolved upstream target and carries the // snapshot of the upstream response headers, captured before any policy // mutation. - Upstream *ResponseUpstream + Upstream *UpstreamResponseContext }