Documentation de référence sur le langage du comparateur CEL

Le langage CEL (Common Expression Language) est un langage Open Source non Turing-complet qui implémente une sémantique commune pour l'évaluation des expressions. Les extensions de service utilisent un sous-ensemble de conditions CEL pour prendre des décisions d'évaluation de chaîne en fonction des données d'attribut. En général, une expression de condition contient une ou plusieurs instructions qui sont combinées par des opérateurs logiques (&&, || ou !).

Attributs

Pour toute demande de connexion, le proxy extrait des attributs, qui sont un ensemble d'informations contextuelles. Les attributs ont un type fixe (tel que string ou int) et peuvent être absents ou présents, selon le contexte. Les attributs sont exposés à l'environnement d'exécution CEL lors du traitement de la condition de correspondance. Pour transférer des attributs spécifiques à votre service d'extension ou à votre plug-in, utilisez le champ forwardAttributes. Pour en savoir plus, consultez Attributs compatibles.

Attributs de requête

Vous pouvez extraire les attributs suivants des requêtes :

Attribut Type LbEdge LbRoute LbTraffic Authz CdnEdge Description
request.headers carte ✓ ✓ ✓ ✓ ✓ Mappage chaîne à chaîne des en-têtes de requête HTTP, où toutes les clés sont en minuscules.
request.method string ✓ ✓ ✓ ✓ ✓ Méthode de requête HTTP (par exemple, GET, POST).
request.host string ✓ ✓ ✓ ✓ ✓ Équivalent de commodité à request.headers['host'].
request.path string ✓ ✓ ✓ ✓ ✓ Chemin d'URL HTTP demandé.
request.query string ✓ ✓ ✓ ✓ ✓ La chaîne de requête d'URL (name1=value&name2=value2).
request.scheme string ✓ ✓ ✓ ✓ ✓ Le schéma d'URL (http ou https).
request.backend_service_name string — ✓ ✓ — — Nom du service de backend.
request.backend_service_project_number int — ✓ ✓ — — Numéro du projet du service de backend.

Attributs de connexion

Vous pouvez extraire les attributs suivants des connexions :

Attribut Type LbEdge LbRoute LbTraffic Authz CdnEdge Description
source.ip string ✓ ✓ ✓ ✓ — Adresse IP du client.
source.port int ✓ ✓ ✓ ✓ ✓ Numéro de port de connexion du client.
source.client_region string ✓ — ✓ — ✓ Code pays ou régional du client à deux lettres.
connection.sni string ✓ — ✓ ✓ ✓ Indication du nom du serveur TLS en aval.
connection.tls_version string ✓ — ✓ ✓ ✓ Version TLS en aval (par exemple, TLSv1.2, TLSv1.3).
connection.sha256_peer_certificate_digest string ✓ — ✓ ✓ — Condensé SHA-256 du certificat pair.

Opérateurs

Les extensions de service sont compatibles avec plusieurs opérateurs que vous pouvez utiliser pour créer des conditions de correspondance complexes à partir d'instructions d'expression simples. Les extensions de service sont compatibles avec les opérateurs logiques, tels que &&, || et !, ainsi qu'avec les opérateurs de manipulation de chaînes, tels que x.contains('y').

Les opérateurs de manipulation de chaînes mettent en correspondance les chaînes ou sous-chaînes que vous définissez. Par exemple, request.host.endsWith('.example.com') renvoie true si la requête HTTP a été envoyée à un domaine se terminant par example.com.

Les opérateurs logiques vous permettent de vérifier plusieurs variables dans une expression conditionnelle. Par exemple, request.method == 'GET' && request.host.matches('.example.com') combine deux instructions et requiert que les deux instructions soient true pour produire un résultat global de true.

Opérateurs logiques

Le tableau suivant décrit les opérateurs logiques compatibles avec les extensions de service.

Exemple d'expression Description
x == "foo" Renvoie true si x est égal à l'argument littéral de chaîne constante.
x == R"fo'o" Renvoie true si x est égal au littéral de chaîne brute donné qui n'interprète pas les séquences d'échappement. Les littéraux de chaîne brute sont pratiques pour exprimer des chaînes que le code doit utiliser pour échapper des caractères de séquence.
x == y Renvoie true si la valeur de x est égale à y.
x != y Renvoie true si la valeur de x n'est pas égale à y.
x && y Renvoie true si x et y sont tous deux true.
x || y Renvoie true si x, y ou les deux sont true.
!x Renvoie true si la valeur booléenne x est false, ou renvoie false si la valeur booléenne x est true.
m['k'] Si la clé k est présente, renvoie la valeur à la clé k dans le mappage chaîne à chaîne m. Si la clé k n'est pas présente, renvoie une erreur qui empêche la règle en cours d'évaluation de correspondre.
k in m Renvoie true si la clé k est présente dans le mappage de clés de chaîne m. Sinon, renvoie false.

Opérateurs de manipulation de chaînes

Le tableau suivant décrit les opérateurs de manipulation de chaînes compatibles avec les extensions de service.

Expression Description
x.contains(y) Renvoie true si la chaîne x contient la sous-chaîne y.
x.startsWith(y) Renvoie true si la chaîne x commence par la sous-chaîne y.
x.endsWith(y) Renvoie true si la chaîne x se termine par la sous-chaîne y.
x.matches(y)

Renvoie true si la chaîne x correspond au modèle RE2 y spécifié.

Les extensions de service utilisent l'option RE2::Latin1 lorsqu'elles compilent le modèle RE2, ce qui désactive les fonctionnalités Unicode.

Les extensions Edge ne vous permettent d'utiliser qu'une seule expression régulière par expression CEL.

x.lower() Renvoie la valeur en minuscules de la chaîne x.
x.upper() Renvoie la valeur en majuscules de la chaîne x.
int(x) Convertit le résultat de chaîne de x en type int. Vous pouvez utiliser la chaîne convertie pour établir une comparaison d'entiers à l'aide d'opérateurs arithmétiques standards, tels que "supérieur à" (>) et "inférieur ou égal à" (≤). Cela ne fonctionne que pour les valeurs qui peuvent être des entiers.

Exemples d'expressions

Faire correspondre toutes les requêtes adressées à l'hôte example.com avec le service de backend bs1 de la région 123, lequel fait office de destination finale :

request.host == "example.com" && request.backend_service_name == "bs1" &&
  request.backend_service_project_number == 123

Faire correspondre toutes les requêtes liées au chemin d'accès */inventory avec un en-tête HTTP Hello. Notez que les noms d'en-têtes ne sont pas sensibles à la casse pour la correspondance CEL :

request.path.endsWith("/inventory") && "Hello" in request.headers

Limites

Les limites suivantes s'appliquent aux expressions CEL lorsqu'elles sont spécifiées pour les extensions de service :

  • Nombre maximal d'expressions par extension : 1 pour les extensions de périphérie et 5 pour les autres extensions
  • Nombre maximal de caractères par expression régulière : 100
  • Nombre maximal de caractères par expression CEL : 500