Common Expression Language (CEL) es un
lenguaje de código abierto que no es Turing-complete y que implementa una semántica común para
la evaluación de expresiones. Las extensiones de servicio usan un subconjunto de condiciones de CEL
para tomar decisiones de evaluación de cadenas según los datos de los atributos. En
general, una expresión de condición consiste en una o más declaraciones que se
unen a través de operadores lógicos (&&, || o !).
Atributos
Para cualquier solicitud de conexión determinada, el proxy extrae atributos,
que son un conjunto de información contextual. Los atributos tienen un tipo fijo (como
string o int) y pueden estar ausentes o presentes, según el contexto.
Los atributos se exponen al entorno de ejecución de CEL durante el procesamiento de la condición de coincidencia. Para
reenviar atributos específicos a tu servicio o complemento de extensión, usa el
campo forwardAttributes. Para obtener más información, consulta Atributos
compatibles.
Atributos de solicitud
Puedes extraer los siguientes atributos de las solicitudes:
| Atributo | Tipo | LbEdge |
LbRoute |
LbTraffic |
Authz |
CdnEdge |
Descripción |
|---|---|---|---|---|---|---|---|
request.headers |
mapa | ✓ | ✓ | ✓ | ✓ | ✓ | Es un mapa de cadena a cadena de los encabezados de la solicitud HTTP, en el que todas las claves están en minúsculas. |
request.method |
cadena | ✓ | ✓ | ✓ | ✓ | ✓ | Es el método de solicitud HTTP (por ejemplo, GET, POST). |
request.host |
cadena | ✓ | ✓ | ✓ | ✓ | ✓ | Equivalente de conveniencia a request.headers['host']. |
request.path |
cadena | ✓ | ✓ | ✓ | ✓ | ✓ | La ruta de URL HTTP solicitada. |
request.query |
cadena | ✓ | ✓ | ✓ | ✓ | ✓ | La cadena de consulta de la URL (name1=value&name2=value2) |
request.scheme |
cadena | ✓ | ✓ | ✓ | ✓ | ✓ | El esquema de URL (http o https) |
request.backend_service_name |
cadena | — | ✓ | ✓ | — | — | Es el nombre del servicio de backend. |
request.backend_service_project_number |
int | — | ✓ | ✓ | — | — | Número del proyecto del servicio de backend. |
Atributos de conexión
Puedes extraer los siguientes atributos de las conexiones:
| Atributo | Tipo | LbEdge |
LbRoute |
LbTraffic |
Authz |
CdnEdge |
Descripción |
|---|---|---|---|---|---|---|---|
source.ip |
cadena | ✓ | ✓ | ✓ | ✓ | — | Dirección IP del cliente. |
source.port |
int | ✓ | ✓ | ✓ | ✓ | ✓ | Es el número de puerto de conexión del cliente. |
source.client_region |
cadena | ✓ | — | ✓ | — | ✓ | Es el código de país o región del cliente de dos letras. |
connection.sni |
cadena | ✓ | — | ✓ | ✓ | ✓ | Indicación del nombre del servidor TLS downstream. |
connection.tls_version |
cadena | ✓ | — | ✓ | ✓ | ✓ | Es la versión de TLS downstream (por ejemplo, TLSv1.2, TLSv1.3). |
connection.sha256_peer_certificate_digest |
cadena | ✓ | — | ✓ | ✓ | — | Resumen de SHA-256 del certificado de par. |
Operadores
Las extensiones de servicio admiten varios operadores que puedes usar
para compilar condiciones de coincidencia complejas a partir de declaraciones de expresiones simples.
Las extensiones de servicio admiten
operadores lógicos, como &&, || y !, y operadores de manipulación de cadenas,
como x.contains('y').
Los operadores de manipulación de cadenas coinciden con las cadenas o subcadenas que definas. Por
ejemplo, request.host.endsWith('.example.com') se evalúa como true si la solicitud HTTP
se realizó a un dominio que termina con example.com.
Los operadores lógicos te permiten verificar varias variables en una expresión
condicional. Por ejemplo,
request.method == 'GET' && request.host.matches('.example.com') une dos
declaraciones y requiere que ambas sean true para producir un
resultado general de true.
Operadores lógicos
En la siguiente tabla, se describen los operadores lógicos que admiten las extensiones de servicio.
| Expresión de ejemplo | Descripción |
|---|---|
x == "foo" |
Devuelve true si x es igual al argumento literal de cadena constante. |
x == R"fo'o" |
Devuelve true si x es igual al literal de cadena sin procesar
proporcionado que no interpreta secuencias de escape. Los literales de cadena sin procesar son convenientes para expresar cadenas que el código debe usar para caracteres de secuencia de escape. |
x == y |
Devuelve true si x es igual a
y. |
x != y |
Devuelve true si x no es igual a
y. |
x && y |
Devuelve true si x y y
son true. |
x || y |
Devuelve true si x, y o ambos
son true. |
!x |
Muestra true si el valor booleano x es
false, o muestra false si el valor booleano
x es true. |
m['k'] |
Si la clave k está presente, devuelve el valor de la clave
k en el mapa de cadena a cadena m. Si la clave
k no está presente, se muestra un error que
hace que la regla que se está evaluando no coincida. |
k in m |
Devuelve true si la clave k está presente en el
mapa con clave de cadena m. De lo contrario, devuelve
false. |
Operadores de manipulación de cadenas
En la siguiente tabla, se describen los operadores de manipulación de cadenas que admite Service Extensions.
| Expresión | Descripción |
|---|---|
x.contains(y) |
Devuelve true si la cadena x contiene la
subcadena y. |
x.startsWith(y) |
Devuelve true si la cadena x comienza con la
subcadena y. |
x.endsWith(y) |
Devuelve true si la cadena x termina con la
subcadena y. |
x.matches(y) |
Devuelve Las extensiones de servicio usan la opción RE2::Latin1 cuando compilan el patrón RE2, que inhabilita las funciones de Unicode. Las extensiones de Edge te permiten usar solo una expresión regular por expresión de CEL. |
int(x) |
Convierte el resultado de la cadena de x en un tipo
int. Puedes usar la cadena convertida para la comparación de números enteros con
operadores aritméticos estándar, como mayor que (>)
y menor o igual que (≤).
Esto funciona solo para valores que pueden ser números enteros. |
Expresiones de muestra
Haz coincidir todas las solicitudes para alojar example.com con el servicio de backend bs1 en 123
como destino final:
request.host == "example.com" && request.backend_service_name == "bs1" && request.backend_service_project_number == 123
Haz coincidir todas las solicitudes para la ruta de acceso */inventory con un encabezado HTTP Hello. Ten en cuenta
que los nombres de encabezado no distinguen mayúsculas de minúsculas para la coincidencia de CEL:
request.path.endsWith("/inventory") && "Hello" in request.headers
Limitaciones
Las siguientes limitaciones se aplican a las expresiones de CEL cuando se especifican para las extensiones de servicio:
- Cantidad máxima de expresiones por extensión: 1 para las extensiones perimetrales y 5 para otras extensiones
- Cantidad máxima de caracteres por expresión regular: 100
- Cantidad máxima de caracteres por expresión de CEL: 500