Common Expression Language (CEL) è un linguaggio open source non Turing completo che implementa una 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 della condizione di corrispondenza.
Gli attributi non sono disponibili per l'invio a un servizio di estensione.
Attributi della richiesta
Dalle richieste possono essere estratti i seguenti attributi:
| 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 pratico di request.headers['host'].
|
request.path |
string | Il percorso URL HTTP richiesto. |
request.query |
string | La query URL HTTP nel formato
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 al quale viene inoltrata la richiesta. Non applicabile alle estensioni perimetrali. |
request.backend_service_project_number |
int | Quando utilizzi un VPC condiviso, indica il numero di progetto del servizio di backend a cui viene inoltrata la richiesta. Non applicabile alle estensioni perimetrali. |
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 | Hash SHA256 con codifica esadecimale del certificato peer nella connessione TLS downstream, se presente. |
Operatori
Service Extensions supporta diversi operatori che puoi utilizzare per creare condizioni di corrispondenza complesse da semplici istruzioni di espressione.
Le estensioni di servizio 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 inviata 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 seguente tabella descrive gli operatori logici supportati dalle estensioni di servizio.
| 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 non è uguale a
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 valutazione non corrisponda. |
Operatori di manipolazione delle stringhe
La tabella seguente descrive gli operatori di manipolazione delle stringhe supportati dalle estensioni di servizio.
| 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 Service Extensions utilizza l'opzione RE2::Latin1 quando compila il pattern RE2, che disabilita le funzionalità Unicode. Le estensioni perimetrali 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, ad esempio 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:
request.path.endsWith("/inventory") && request.headers["Hello"] != ""
Limitazioni
Le seguenti limitazioni si applicano alle espressioni CEL quando vengono specificate per le estensioni di 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