Common Expression Language (CEL) es un lenguaje de código abierto que no es Turing-complete y que implementa semántica común para la evaluación de expresiones. Las Extensiones del servicio usan un subconjunto de condiciones de CEL para tomar decisiones de evaluación de la cadena basadas en datos de 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 cada solicitud de conexión, 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 presentes o ausentes, según el contexto.
Los atributos se exponen al tiempo de ejecución de CEL durante el procesamiento de la condición de coincidencia.
Los atributos no están disponibles para enviarse a un servicio de extensión.
Atributos de solicitud
Se pueden extraer los siguientes atributos de las solicitudes:
| Atributo | Tipo de atributo | Descripción |
|---|---|---|
request.headers |
map{string,string} | Es un mapa de cadena a cadena de los encabezados de solicitud HTTP. Si un encabezado contiene varios valores, el valor de este mapa es una cadena separada por comas de todos los valores del encabezado. Las claves de este mapa están en minúsculas. |
request.method |
cadena | Es el método de solicitud HTTP, como GET o POST. |
request.host |
cadena | Es un equivalente de conveniencia de request.headers['host'].
|
request.path |
cadena | La ruta de URL HTTP solicitada. |
request.query |
cadena | Es la consulta de URL HTTP en el formato No se realiza ninguna decodificación. |
request.scheme |
cadena | Es el esquema de la URL HTTP, como HTTP o HTTPS. Los valores de este atributo están en minúsculas. |
request.backend_service_name |
cadena | Es el servicio de backend al que se reenvía la solicitud. No se aplica a las extensiones de Edge. |
request.backend_service_project_number |
int | Cuando se usa la VPC compartida, el número de proyecto del servicio de backend al que se reenvía la solicitud. No se aplica a las extensiones de Edge. |
Atributos de conexión
Se pueden extraer los siguientes atributos de las conexiones:
| Atributo | Tipo de atributo | Descripción |
|---|---|---|
source.ip |
cadena | Es la dirección IP de origen de la solicitud. |
source.port |
int | Es el puerto de conexión del cliente downstream. |
connection.sni |
cadena | Es el nombre del servidor solicitado de la conexión TLS downstream. |
connection.tls_version |
cadena | Es la versión de TLS de la conexión TLS downstream. Los valores válidos son TLSv1, TLSv1.1, TLSv1.2 y TLSv1.3.
|
connection.sha256_peer_certificate_digest |
cadena | Es el hash SHA256 con codificación hexadecimal del certificado de intercambio de tráfico en la conexión TLS downstream, si está presente. |
Operadores
Las extensiones de servicio admiten varios operadores que puedes usar para crear condiciones de coincidencia complejas a partir de instrucciones de expresión 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 defines. 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 múltiples 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 de literal de cadena constante. |
x == R"fo'o" |
Devuelve true si x es igual al literal de cadena sin procesar determinado que no interpreta secuencias de escape. Los literales de cadena sin procesar son convenientes para expresar cadenas que el código debe usar para escapar de los caracteres de secuencia. |
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 |
Devuelve true si el valor booleano x es false o devuelve 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, devuelve un error que hace que no coincida la regla en evaluación. |
Operadores de manipulación de cadenas
En la siguiente tabla, se describen los operadores de manipulación de cadenas que admiten las extensiones de servicio.
| 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, lo que inhabilita las funciones de Unicode. Las extensiones de borde te permiten usar solo una expresión regular por expresión de CEL. |
x.lower() |
Devuelve el valor en minúsculas de la cadena x. |
x.upper() |
Devuelve el valor de la cadena x en mayúsculas. |
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 que o igual a (≤). 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:
request.path.endsWith("/inventory") && request.headers["Hello"] != ""
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 de borde y 5 para otras extensiones
- Cantidad máxima de caracteres por expresión regular: 100
- Cantidad máxima de caracteres por expresión CEL: 500