Referencia del lenguaje del comparador de CEL

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 true si la cadena x coincide con el patrón y de RE2 especificado.

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