Common Expression Language (CEL) es un
lenguaje de código abierto que no es Turing-complete y que implementa semánticas comunes para la
evaluación de expresiones. Service Extensions usa un subconjunto de condiciones de CEL para tomar decisiones de evaluación en 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 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.
Los atributos no están disponibles para enviarse a un servicio de extensión.
Atributos de solicitud
Los siguientes atributos se pueden extraer 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 en este mapa están en minúsculas. |
request.method |
string | Es el método de solicitud HTTP, como GET o POST. |
request.host |
string | Equivalente de conveniencia a request.headers['host'].
|
request.path |
string | La ruta de URL HTTP solicitada. |
request.query |
string | Es la consulta de URL HTTP en el formato de
No se realiza ninguna decodificación. |
request.scheme |
string | El esquema de URL HTTP, como HTTP o HTTPS. Los valores de este atributo están en minúsculas. |
request.backend_service_name |
string | 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
Los siguientes atributos se pueden extraer de las conexiones:
| Atributo | Tipo de atributo | Descripción |
|---|---|---|
source.ip |
string | Es la dirección IP de origen de la solicitud. |
source.port |
int | Es el puerto de conexión del cliente downstream. |
connection.sni |
string | Es el nombre del servidor solicitado de la conexión TLS downstream. |
connection.tls_version |
string | Es la versión 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 |
string | Es el hash SHA256 con codificación hexadecimal del certificado con 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 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 substrings que defines. Por
ejemplo, request.host.endsWith('.example.com') se evalúa como true si la solicitud HTTP
se realizó a una terminación de 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" |
El resultado es true si x es igual al argumento literal de cadena constante. |
x == R"fo'o" |
El resultado es true si x es igual al literal de cadena sin procesar determinado que no interpreta las 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 |
El resultado es true si x es igual a
y. |
x != y |
El resultado es true si x no es igual a
y. |
x && y |
El resultado es true si x y y
son true. |
x || y |
El resultado es true si x, y o ambos
son true. |
!x |
El resultado es true si el valor booleano x es false. En cambio, el resultado es false si el valor booleano x es true. |
m['k'] |
Si la clave k está presente, muestra el valor de la clave
k en el mapa de cadena a cadena m. Si la clave
k no está presente, muestra un error que
hace que la regla en evaluación no coincida. |
k in m |
El resultado es true si la clave k está presente en el
mapa con clave de cadena m. De lo contrario, muestra
false. |
Operadores de manipulación de cadenas
En la siguiente tabla, se describen los operadores de manipulación de cadenas que admiten las Service Extensions.
| Expresión | Descripción |
|---|---|
x.contains(y) |
El resultado es true si la cadena x contiene la
substring y. |
x.startsWith(y) |
El resultado es true si la cadena x comienza con la
substring y. |
x.endsWith(y) |
El resultado es true si la cadena x termina con la
substring y. |
x.matches(y) |
El resultado es 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 CEL expression. |
x.lower() |
Devuelve el valor de la cadena x en minúsculas. |
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 de 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 bs1 del servicio de backend 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 */inventory con un encabezado HTTP Hello. Ten en cuenta que los nombres de encabezado no distinguen entre mayúsculas y minúsculas para la coincidencia de CEL:
request.path.endsWith("/inventory") && "Hello" in request.headers
Limitaciones
Se aplican las siguientes limitaciones a las expresiones CEL cuando se especifican para las extensiones de servicio:
- Cantidad máxima de expresiones por extensión: 1 para las extensiones de Edge 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