EdgeScript fournit des fonctions intégrées pour manipuler les en-têtes HTTP des requêtes et des réponses, réécrire ou rediriger les URI, générer le corps des réponses et définir des cookies. Cette rubrique décrit la syntaxe, les paramètres, les valeurs de retour et des exemples pour chaque fonction.
Accès rapide :
En-têtes de requête :
add_req_header,del_req_headerEn-têtes de réponse :
add_rsp_header,del_rsp_header,get_rsp_headerRéécriture d'URL et redirection :
rewriteCorps de la réponse :
say,print,exitCookies :
add_rsp_cookieEncodage :
encode_args,decode_args
En-têtes de requête
add_req_header
Ajoute un en-tête à la requête avant sa transmission au serveur d'origine.
Syntaxe
add_req_header(name, value [, append])
Paramètres
|
Paramètre |
Type |
Obligatoire |
Description |
|
|
string |
Oui |
Nom de l'en-tête de requête à ajouter. |
|
|
string |
Oui |
Valeur de l'en-tête de requête à ajouter. |
|
|
Boolean |
Non |
Indique s'il faut ajouter l'en-tête si un en-tête portant le même nom existe déjà. Valeur par défaut : |
Valeur de retour
Renvoie true par défaut. Renvoie false si le nom de l'en-tête n'est pas valide.
Exemple
add_req_header('USER-DEFINED-REQ-1', '1')
add_req_header('USER-DEFINED-REQ-1', 'x', true)
add_req_header('USER-DEFINED-REQ-2', '2')
del_req_header('USER-DEFINED-REQ-2')
Résultat : le serveur d'origine reçoit les en-têtes suivants :
USER-DEFINED-REQ-1: 1
USER-DEFINED-REQ-1: x
L'en-tête USER-DEFINED-REQ-2 est ajouté puis supprimé ; il n'est donc pas transmis au serveur d'origine.
del_req_header
Supprime un en-tête de requête avant sa transmission au serveur d'origine.
Syntaxe
del_req_header(name)
Paramètres
|
Paramètre |
Type |
Obligatoire |
Description |
|
|
string |
Oui |
Nom de l'en-tête de requête à supprimer. |
Valeur de retour
Renvoie true par défaut. Renvoie false si le nom de l'en-tête n'est pas valide.
Exemple
add_req_header('USER-DEFINED-REQ-1', '1')
add_req_header('USER-DEFINED-REQ-1', 'x', true)
add_req_header('USER-DEFINED-REQ-2', '2')
del_req_header('USER-DEFINED-REQ-2')
Résultat : le serveur d'origine reçoit les en-têtes suivants :
USER-DEFINED-REQ-1: 1
USER-DEFINED-REQ-1: x
L'en-tête USER-DEFINED-REQ-2 est ajouté puis supprimé ; il n'est donc pas transmis au serveur d'origine.
En-têtes de réponse
add_rsp_header
Ajoute un en-tête à la réponse.
Syntaxe
add_rsp_header(name, value [, append])
Paramètres
|
Paramètre |
Type |
Obligatoire |
Description |
|
|
string |
Oui |
Nom de l'en-tête de réponse à ajouter. |
|
|
string |
Oui |
Valeur de l'en-tête de réponse à ajouter. Prend en charge les expressions dynamiques : |
|
|
Boolean |
Non |
Indique s'il faut ajouter l'en-tête si un en-tête portant le même nom existe déjà. Valeur par défaut : |
Valeur de retour
Renvoie true par défaut. Renvoie false si le nom de l'en-tête n'est pas valide.
Exemple
add_rsp_header('USER-DEFINED-RSP-1', '1')
add_rsp_header('USER-DEFINED-RSP-1', 'x', true)
add_rsp_header('USER-DEFINED-RSP-2', '2')
del_rsp_header('USER-DEFINED-RSP-2')
Résultat : la réponse inclut les en-têtes suivants :
USER-DEFINED-RSP-1: 1
USER-DEFINED-RSP-1: x
L'en-tête USER-DEFINED-RSP-2 est ajouté puis supprimé ; il n'est donc pas inclus dans la réponse.
del_rsp_header
Supprime un en-tête de réponse.
Syntaxe
del_rsp_header(name)
Paramètres
|
Paramètre |
Type |
Obligatoire |
Description |
|
|
string |
Oui |
Nom de l'en-tête de réponse à supprimer. |
Valeur de retour
Renvoie true par défaut. Renvoie false si le nom de l'en-tête n'est pas valide.
Exemple
add_rsp_header('USER-DEFINED-RSP-1', '1')
add_rsp_header('USER-DEFINED-RSP-1', 'x', true)
add_rsp_header('USER-DEFINED-RSP-2', '2')
del_rsp_header('USER-DEFINED-RSP-2')
Résultat : la réponse inclut les en-têtes suivants :
USER-DEFINED-RSP-1: 1
USER-DEFINED-RSP-1: x
L'en-tête USER-DEFINED-RSP-2 est ajouté puis supprimé ; il n'est donc pas inclus dans la réponse.
get_rsp_header
Récupère la valeur d'un en-tête de réponse.
Syntaxe
get_rsp_header(str)
Paramètres
|
Paramètre |
Type |
Obligatoire |
Description |
|
|
string |
Oui |
Nom de l'en-tête de réponse à récupérer. |
Valeur de retour
Si l'en-tête existe : renvoie la valeur de l'en-tête sous forme de chaîne, de nombre, de dictionnaire ou de booléen.
Si l'en-tête n'existe pas : renvoie
false.
Exemple
ct = get_rsp_header('content-type')
if ct {
add_rsp_header('origin-content-type', 'is')
} else {
add_rsp_header('origin-content-type', 'no')
}
Réécriture d'URL et redirection
rewrite
Réécrit l'URI ou redirige la requête.
Syntaxe
rewrite(url, flag, code)
Paramètres
|
Paramètre |
Type |
Obligatoire |
Description |
|
|
string |
Oui |
URI ou URL cible après la réécriture ou la redirection. |
|
|
string |
Oui |
Mode de réécriture. Consultez le tableau de référence des indicateurs ci-dessous. |
|
|
numeric |
Non |
Code d'état HTTP pour la redirection. S'applique uniquement lorsque |
Référence des indicateurs (flag)
Utilisez ce tableau pour choisir l'indicateur adapté à votre cas d'utilisation :
|
URI uniquement |
URI + paramètres de requête |
|
|
Réécriture côté serveur (pas de redirection, l'URL dans le navigateur reste inchangée) |
|
|
|
Redirection côté client (le navigateur effectue une nouvelle requête, l'URL change) |
|
|
Valeur de retour
Opération de réécriture (
break,enhance_break) : renvoietrue.Opération de redirection (
redirect,enhance_redirect) : aucune valeur de retour.
Exemples
Réécriture côté serveur (URI + paramètres)
if and($arg_mode, eq($arg_mode, 'rewrite:enhance_break')) {
rewrite('/example/examplefile.txt?k=v', 'enhance_break')
}
Le serveur d'origine reçoit la requête avec l'URI et les paramètres de requête réécrits vers /example/examplefile.txt?k=v.
Redirection côté client (URI + paramètres)
if and($arg_mode, eq($arg_mode, 'rewrite:enhance_redirect')) {
rewrite('/example/examplefile.txt?k=v', 'enhance_redirect')
}
if and($arg_mode, eq($arg_mode, 'rewrite:enhance_redirect_301')) {
rewrite('/example/examplefile.txt?k=v', 'enhance_redirect', 301)
}
Le client reçoit une redirection 302 ou 301 vers /example/examplefile.txt?k=v.
Réécriture côté serveur (URI uniquement)
if and($arg_mode, eq($arg_mode, 'rewrite:break')) {
rewrite('/example/examplefile.txt', 'break')
}
Le serveur d'origine reçoit la requête avec l'URI réécrit vers /example/examplefile.txt. Les paramètres de requête d'origine sont conservés.
Redirection côté client (URI uniquement)
if and($arg_mode, eq($arg_mode, 'rewrite:redirect')) {
rewrite('/example/examplefile.txt', 'redirect')
}
if and($arg_mode, eq($arg_mode, 'rewrite:redirect_301')) {
rewrite('/example/examplefile.txt', 'redirect', 301)
}
Le client reçoit une redirection 302 ou 301 vers /example/examplefile.txt. Les paramètres de requête d'origine sont conservés.
Corps de la réponse
say
Affiche du contenu dans le corps de la réponse et ajoute un caractère de saut de ligne.
Syntaxe
say(arg)
Paramètres
|
Paramètre |
Type |
Obligatoire |
Description |
|
|
any |
Oui |
Contenu à écrire dans le corps de la réponse. |
Valeur de retour
Aucune.
Exemple
say('hello')
print('byebye')
print('byebye')
Sortie :
hello
byebyebyebye
Affiche du contenu dans le corps de la réponse sans ajouter de caractère de saut de ligne.
Syntaxe
print(arg)
Paramètres
|
Paramètre |
Type |
Obligatoire |
Description |
|
|
any |
Oui |
Contenu à écrire dans le corps de la réponse. |
Valeur de retour
Aucune.
Exemple
say('hello')
print('byebye')
print('byebye')
Sortie :
hello
byebyebyebye
exit
Met fin à la requête actuelle avec le code d'état HTTP spécifié et un corps de réponse facultatif.
Syntaxe
exit(code [, body])
Paramètres
|
Paramètre |
Type |
Obligatoire |
Description |
|
|
numeric |
Oui |
Code d'état HTTP à renvoyer. |
|
|
any |
Non |
Corps de réponse à inclure dans la réponse. |
Valeur de retour
Aucune.
Exemples
Exemple 1 : bloquer les requêtes en fonction des paramètres de requête et des cookies
if not($arg_key) {
exit(403)
}
Si la requête n'inclut pas le paramètre de requête key, le nœud CDN renvoie le code HTTP 403.
if not($cookie_user) {
exit(403, 'not cookie user')
}
Si la requête n'inclut pas le cookie user, le nœud CDN renvoie le code HTTP 403 avec le corps de réponse not cookie user.
if not(0) {
exit(403)
}
L'expression not(0) est évaluée à false, ce bloc ne s'exécute donc pas.
if not(false) {
exit(403)
}
L'expression not(false) est évaluée à true, le nœud CDN renvoie donc le code HTTP 403.
Exemple 2 : authentification basée sur l'URI
pcs = capture_re($request_uri,'^/([^/]+)/([^/]+)([^?]+)\?(.*)')
sec1 = get(pcs, 1)
sec2 = get(pcs, 2)
sec3 = get(pcs, 3)
if or(not(sec1), not(sec2), not(sec3)) {
add_rsp_header('X-TENGINE-ERROR', 'auth failed - missing necessary uri set')
exit(403)
}
digest = md5(concat(sec1, sec3))
if ne(digest, sec2) {
add_rsp_header('X-TENGINE-ERROR', 'auth failed - invalid digest')
exit(403)
}
Cet exemple extrait des segments de l'URI de la requête, calcule un condensé MD5 et le valide par rapport à une signature intégrée. Si l'URI est mal formé ou si le condensé ne correspond pas, le nœud CDN renvoie le code HTTP 403 avec un en-tête d'erreur.
Cookies
add_rsp_cookie
Définit un cookie dans la réponse. Chaque appel génère un nouvel en-tête de réponse Set-Cookie.
Syntaxe
add_rsp_cookie(k, v [, properties])
Paramètres
|
Paramètre |
Type |
Obligatoire |
Description |
|
|
string |
Oui |
Nom du cookie. |
|
|
string |
Oui |
Valeur du cookie. |
|
|
dictionary |
Non |
Attributs du cookie tels que |
Valeur de retour
Renvoie true si le cookie est défini. Renvoie false si le cookie n'a pas pu être défini.
Exemple
add_rsp_cookie('user', 'edgescript')
add_rsp_cookie('login_time', tostring(now()), [
'path' = '/'
])
expires = cookie_time(time())
add_rsp_cookie('psid', 'SDF93745HFSDF2934JKHG', [
'path' = '/play',
'domain' = 'foo.com',
'secure' = true,
'httponly' = true,
'expires' = expires,
'max_age' = 100,
'samesite' = 'Strict',
'extension' = 'xxt3s'
])
La réponse inclut les en-têtes Set-Cookie suivants :
Set-Cookie: user=edgescript
Set-Cookie: login_time=1582538968.912; Path=/
Set-Cookie: psid=SDF93745HFSDF2934JKHG; Expires=Mon, 24-Feb-20 10:09:28 GMT; Max-Age=100; Domain=foo.com; Path=/play; Secure; HttpOnly; SameSite=Strict; xxt3s
Encodage
encode_args
Convertit les paires clé-valeur d'un dictionnaire en une chaîne encodée pour URI au format k1=v1&k2=v2.
Syntaxe
encode_args(d)
Paramètres
|
Paramètre |
Type |
Obligatoire |
Description |
|
|
dictionary |
Oui |
Dictionnaire à encoder. |
Valeur de retour
Renvoie une chaîne encodée pour URI.
Exemple
Les fonctions encode_args et decode_args sont généralement utilisées conjointement. L'exemple suivant encode un dictionnaire, le définit comme en-tête de réponse, puis le décode et lit les valeurs individuelles :
my_args = []
set(my_args, 'signature', 'da9dc4b7-87ae-4330-aaaf-e5454e2c2af1')
set(my_args, 'algo', 'private sign1')
my_args_str = encode_args(my_args)
add_rsp_header('X-DSL-ENCODE-ARGS', my_args_str)
to_args = decode_args(my_args_str)
if get(to_args, 'algo') {
add_rsp_header('X-DSL-DECODE-ARGS-ALGO', get(to_args, 'algo'))
}
if get(to_args, 'signature') {
add_rsp_header('X-DSL-DECODE-ARGS-SIGN', get(to_args, 'signature'))
}
La réponse inclut les en-têtes suivants :
X-DSL-ENCODE-ARGS: signature=da9dc4b7-87ae-4330-aaaf-e5454e2c2af1&algo=private%20sign1
X-DSL-DECODE-ARGS-ALGO: private sign1
X-DSL-DECODE-ARGS-SIGN: da9dc4b7-87ae-4330-aaaf-e5454e2c2af1
decode_args
Convertit une chaîne encodée pour URI au format k1=v1&k2=v2 en un dictionnaire.
Syntaxe
decode_args(s)
Paramètres
|
Paramètre |
Type |
Obligatoire |
Description |
|
|
string |
Oui |
Chaîne encodée pour URI à décoder. |
Valeur de retour
Renvoie un dictionnaire converti à partir de la chaîne.
Exemple
Consultez l'exemple de encode_args ci-dessus. La fonction decode_args est l'opération inverse et est utilisée conjointement avec encode_args.