Common Expression Language (CEL) היא שפה לא שלמה של טיורינג בקוד פתוח, שמיישמת סמנטיקה משותפת להערכת ביטויים. Service Extensions משתמשים בקבוצת משנה של תנאי CEL כדי לקבל החלטות לגבי הערכת שרשרת על סמך נתוני מאפיינים. באופן כללי, ביטוי של תנאי מורכב מהצהרה או הצהרות שמחוברות על ידי אופרטורים לוגיים (&&, || או !).
מאפיינים
לכל בקשת חיבור, ה-proxy מחלץ מאפיינים, שהם קבוצה של מידע הקשרי. למאפיינים יש סוג קבוע (למשל, string או int), והם יכולים להיות חסרים או קיימים, בהתאם להקשר.
המאפיינים נחשפים לזמן הריצה של CEL במהלך העיבוד של תנאי ההתאמה.
אי אפשר לשלוח מאפיינים לשירות של תוסף.
מאפייני הבקשות
אפשר לחלץ את המאפיינים הבאים מהבקשות:
| מאפיין | סוג מאפיין | תיאור |
|---|---|---|
request.headers |
map{string,string} | מיפוי של כותרות בקשת HTTP ממחרוזת למחרוזת. אם כותרת מכילה כמה ערכים, הערך במפה הזו הוא מחרוזת מופרדת בפסיקים של כל הערכים של הכותרת. המקשים במפה הזו הם באותיות קטנות. |
request.method |
מחרוזת | ה-method של בקשת ה-HTTP, כמו GET או POST. |
request.host |
מחרוזת | נוחות ששווה ל-request.headers['host'].
|
request.path |
מחרוזת | נתיב כתובת ה-URL של ה-HTTP שהתבקש. |
request.query |
מחרוזת | שאילתת כתובת ה-URL מסוג HTTP בפורמט
לא מתבצע פענוח. |
request.scheme |
מחרוזת | סכמת כתובת ה-URL של HTTP, כמו HTTP או HTTPS. הערכים של המאפיין הזה הם באותיות קטנות. |
request.backend_service_name |
מחרוזת | שירות הקצה העורפי שאליו מועברת הבקשה. לא רלוונטי לתוספי Edge. |
request.backend_service_project_number |
int | כשמשתמשים ב-VPC משותף, מספר הפרויקט של שירות ה-Backend שאליו מועברת הבקשה. לא רלוונטי לתוספי Edge. |
מאפייני החיבור
אפשר לחלץ את המאפיינים הבאים מחיבורים:
| מאפיין | סוג מאפיין | תיאור |
|---|---|---|
source.ip |
מחרוזת | כתובת ה-IP של המקור של הבקשה. |
source.port |
int | יציאת החיבור של הלקוח ב-downstream. |
connection.sni |
מחרוזת | שם השרת המבוקש של חיבור ה-TLS במורד הזרם. |
connection.tls_version |
מחרוזת | גרסת ה-TLS של חיבור ה-TLS במורד הזרם. ערכים תקינים:
TLSv1, TLSv1.1, TLSv1.2 ו-
TLSv1.3.
|
connection.sha256_peer_certificate_digest |
מחרוזת | גיבוב SHA256 עם קידוד הקסדצימלי של אישור העמית בחיבור TLS במורד הזרם, אם קיים. |
אופרטורים
Service Extensions תומכים בכמה אופרטורים שאפשר להשתמש בהם כדי ליצור תנאי התאמה מורכבים מתוך הצהרות ביטוי פשוטות.
התכונה 'תוספי שירות' תומכת באופרטורים לוגיים, כמו &&, || ו-!, ובאופרטורים לשינוי מחרוזות, כמו x.contains('y').
אופרטורים של מניפולציה של מחרוזות מתאימים למחרוזות או למחרוזות משנה שאתם מגדירים. לדוגמה, request.host.endsWith('.example.com') מחזירה את הערך true אם בקשת ה-HTTP בוצעה לדומיין שמסתיים ב-example.com.
אופרטורים לוגיים מאפשרים לכם לבדוק כמה משתנים בביטוי מותנה. לדוגמה, הביטוי request.method == 'GET' && request.host.matches('.example.com') מצרף שתי הצהרות, והוא יהיה שווה true אם שתי ההצהרות מתקיימות.true
אופרטורים לוגיים
בטבלה הבאה מפורטים האופרטורים הלוגיים שנתמכים ב-Service Extensions.
| ביטוי לדוגמה | תיאור |
|---|---|
x == "foo" |
הפונקציה מחזירה את הערך true אם x שווה לארגומנט הקבוע
מסוג מחרוזת מילולית. |
x == R"fo'o" |
הפונקציה מחזירה את הערך true אם x שווה למחרוזת המילולית הגולמית שצוינה, שלא מפרשת רצפי escape. מחרוזות גולמיות
נוחות לביטוי מחרוזות שהקוד צריך
להשתמש בהן כדי לבצע בריחה מתווים של רצף. |
x == y |
הפונקציה מחזירה את הערך true אם x שווה ל-y. |
x != y |
הפונקציה מחזירה את הערך true אם x לא שווה ל-y. |
x && y |
הפונקציה מחזירה את הערך true אם גם x וגם y
הם true. |
x || y |
הפונקציה מחזירה true אם x, y או שניהם הם true. |
!x |
הפונקציה מחזירה true אם הערך הבוליאני x הוא false, או מחזירה false אם הערך הבוליאני x הוא true. |
m['k'] |
אם המפתח k קיים, הפונקציה מחזירה את הערך במפתח k במפה של מחרוזת למחרוזת m. אם המפתח k לא קיים, הפונקציה מחזירה שגיאה שגורמת לכך שהכלל שנבדק לא תואם. |
k in m |
הפונקציה מחזירה את הערך true אם המפתח k קיים במפה m עם מפתחות מסוג מחרוזת. אחרת, הפונקציה מחזירה את הערך
false. |
אופרטורים של מניפולציה של מחרוזות
בטבלה הבאה מפורטים האופרטורים לטיפול במחרוזות שנתמכים ב-Service Extensions.
| ביטוי | תיאור |
|---|---|
x.contains(y) |
הפונקציה מחזירה את הערך true אם המחרוזת x מכילה את מחרוזת המשנה y. |
x.startsWith(y) |
הפונקציה מחזירה את הערך true אם המחרוזת x מתחילה במחרוזת המשנה y. |
x.endsWith(y) |
הפונקציה מחזירה את הערך true אם המחרוזת x מסתיימת במחרוזת המשנה y. |
x.matches(y) |
הפונקציה מחזירה את הערך התוסף Service Extensions משתמש באפשרות RE2::Latin1 כשהוא קומפל את תבנית RE2, מה שמשבית את תכונות ה-Unicode. תוספים ל-Edge מאפשרים להשתמש רק בביטוי רגולרי אחד לכל ביטוי CEL. |
x.lower() |
הפונקציה מחזירה את הערך באותיות קטנות של המחרוזת x. |
x.upper() |
הפונקציה מחזירה את הערך באותיות רישיות של המחרוזת x. |
int(x) |
הפונקציה ממירה את תוצאת המחרוזת של x לסוג int. אפשר להשתמש במחרוזת שהומרה להשוואה בין מספרים שלמים באמצעות אופרטורים אריתמטיים רגילים, כמו גדול מ- (>) וקטן מ- או שווה ל- (≤). הפעולה הזו אפשרית רק עבור ערכים שיכולים להיות מספרים שלמים. |
ביטויים לדוגמה
התאמה של כל הבקשות לאירוח example.com עם שירות קצה עורפי bs1 ב-123
כיעד הסופי:
request.host == "example.com" && request.backend_service_name == "bs1" && request.backend_service_project_number == 123
התאמה של כל הבקשות לנתיב */inventory עם כותרת HTTP Hello. הערה
שמות הכותרות לא תלויי-רישיות בהתאמה ל-CEL:
request.path.endsWith("/inventory") && "Hello" in request.headers
מגבלות
ההגבלות הבאות חלות על ביטויי CEL כשמציינים אותם עבור Service Extensions:
- מספר הביטויים המקסימלי לכל תוסף: 1 לתוספי Edge ו-5 לתוספים אחרים
- מספר התווים המקסימלי לכל ביטוי רגולרי: 100
- מספר התווים המקסימלי לכל ביטוי CEL: 500