Riferimento al linguaggio del matcher CEL

Common Expression Language (CEL) è un linguaggio open source non Turing completo che implementa la semantica comune per la valutazione delle espressioni. Service Extensions utilizza un sottoinsieme di condizioni CEL per prendere decisioni di valutazione della catena in base ai dati degli attributi. In generale, un'espressione di condizione è costituita da una o più istruzioni unite da operatori logici (&&, ||, o !).

Attributi

Per ogni richiesta di connessione, il proxy estrae gli attributi, che sono un insieme di informazioni contestuali. Gli attributi hanno un tipo fisso (ad esempio string o int) e possono essere assenti o presenti, a seconda del contesto. Gli attributi vengono esposti al runtime CEL durante l'elaborazione delle condizioni di corrispondenza. Gli attributi non sono disponibili per essere inviati a un servizio di estensione.

Attributi della richiesta

I seguenti attributi possono essere estratti dalle richieste:

Attributo Tipo di attributo Descrizione
request.headers map{string,string} Una mappa stringa-stringa delle intestazioni delle richieste HTTP. Se un'intestazione contiene più valori, il valore in questa mappa è una stringa separata da virgole di tutti i valori dell'intestazione. Le chiavi in questa mappa sono in minuscolo.
request.method string Il metodo di richiesta HTTP, ad esempio GET o POST.
request.host string Equivalente a request.headers['host'].
request.path string Il percorso URL HTTP richiesto.
request.query string

La query URL HTTP nel formato di name1=value&name2=value2, come appare nella prima riga della richiesta HTTP.

Non viene eseguita alcuna decodifica.

request.scheme string Lo schema URL HTTP, ad esempio HTTP o HTTPS. I valori di questo attributo sono in minuscolo.
request.backend_service_name string

Il servizio di backend a cui viene inoltrata la richiesta.

Non applicabile alle estensioni edge.

request.backend_service_project_number int

Quando si utilizza un VPC condiviso, indica il numero di progetto del servizio backend a cui viene inoltrata la richiesta.

Non applicabile alle estensioni edge.

Attributi connessione

I seguenti attributi possono essere estratti dalle connessioni:

Attributo Tipo di attributo Descrizione
source.ip string L'indirizzo IP di origine della richiesta.
source.port int La porta di connessione del client downstream.
connection.sni string Il nome server richiesto della connessione TLS downstream.
connection.tls_version string La versione TLS della connessione TLS downstream. Valori validi: TLSv1, TLSv1.1, TLSv1.2 e TLSv1.3.
connection.sha256_peer_certificate_digest string L'hash SHA256 codificato in esadecimale del certificato peer nella connessione TLS downstream, se presente.

Operatori

Service Extensions supportano diversi operatori che puoi utilizzare per creare condizioni di corrispondenza complesse da semplici istruzioni di espressione. Service Extensions supportano operatori logici, come &&, ||, e !, e operatori di manipolazione delle stringhe, come x.contains('y').

Gli operatori di manipolazione delle stringhe corrispondono alle stringhe o alle sottostringhe che definisci. Ad esempio, request.host.endsWith('.example.com') restituisce true se la richiesta HTTP è stata effettuata a un suffisso di dominio con example.com.

Gli operatori logici consentono di verificare più variabili in un'espressione condizionale. Ad esempio, request.method == 'GET' && request.host.matches('.example.com') unisce due istruzioni e richiede che entrambe le istruzioni siano true per produrre un risultato complessivo di true.

Operatori logici

La tabella seguente descrive gli operatori logici supportati da Service Extensions.

Espressione di esempio Descrizione
x == "foo" Restituisce true se x è uguale all'argomento letterale stringa costante.
x == R"fo'o" Restituisce true se x è uguale al valore letterale della stringa non elaborata specificata che non interpreta le sequenze di escape. I valori letterali stringa non elaborata sono utili per esprimere stringhe che il codice deve utilizzare per i caratteri di sequenza di escape.
x == y Restituisce true se x è uguale a y.
x != y Restituisce true se x è diverso da y.
x && y Restituisce true se sia x che y sono true.
x || y Restituisce true se x, y o entrambi sono true.
!x Restituisce true se il valore booleano x è false, oppure restituisce false se il valore booleano x è true.
m['k'] Se la chiave k è presente, restituisce il valore della chiave k nella mappa stringa-stringa m. Se la chiave k non è presente, restituisce un errore che fa sì che la regola in fase di valutazione non corrisponda.
k in m Restituisce true se la chiave k è presente nella mappa m con chiavi stringa. In caso contrario, restituisce false.

Operatori di manipolazione delle stringhe

La tabella seguente descrive gli operatori di manipolazione delle stringhe supportati da Service Extensions.

Espressione Descrizione
x.contains(y) Restituisce true se la stringa x contiene la sottostringa y.
x.startsWith(y) Restituisce true se la stringa x inizia con la sottostringa y.
x.endsWith(y) Restituisce true se la stringa x termina con la sottostringa y.
x.matches(y)

Restituisce true se la stringa x corrisponde al pattern RE2 specificato y.

Service Extensions utilizza l'opzione RE2::Latin1 quando compila il pattern RE2, che disabilita le funzionalità Unicode.

Le estensioni edge consentono di utilizzare una sola espressione regolare per espressione CEL.

x.lower() Restituisce il valore in minuscolo della stringa x.
x.upper() Restituisce il valore in maiuscolo della stringa x.
int(x) Converte il risultato della stringa di x in un tipo int. Puoi utilizzare la stringa convertita per il confronto tra numeri interi utilizzando operatori aritmetici standard, come maggiore di (>) e minore o uguale a (). Questa operazione funziona solo per i valori che possono essere numeri interi.

Espressioni di esempio

Abbina tutte le richieste all'host example.com con il servizio di backend bs1 in 123 come destinazione finale:

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

Abbina tutte le richieste per il percorso */inventory con un'intestazione HTTP Hello. Tieni presente che i nomi delle intestazioni non fanno distinzione tra maiuscole e minuscole per la corrispondenza CEL:

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

Limitazioni

Le seguenti limitazioni si applicano alle espressioni CEL quando vengono specificate per le estensioni del servizio:

  • Numero massimo di espressioni per estensione: 1 per le estensioni edge e 5 per le altre estensioni
  • Numero massimo di caratteri per espressione regolare: 100
  • Numero massimo di caratteri per espressione CEL: 500