O EdgeScript oferece funções integradas para manipular cabeçalhos de requisição e resposta HTTP, reescrever ou redirecionar URIs, gerar corpos de resposta e definir cookies. Esta referência aborda a sintaxe, os parâmetros, os valores de retorno e exemplos de cada função.
Ir para:
Cabeçalhos de requisição:
add_req_header,del_req_headerCabeçalhos de resposta:
add_rsp_header,del_rsp_header,get_rsp_headerReescrita e redirecionamento de URL:
rewriteCorpo da resposta:
say,print,exitCookies:
add_rsp_cookieCodificação:
encode_args,decode_args
Cabeçalhos de requisição
add_req_header
Adiciona um cabeçalho de requisição antes do encaminhamento ao servidor de origem.
Sintaxe
add_req_header(name, value [, append])
Parâmetros
|
Parâmetro |
Tipo |
Obrigatório |
Descrição |
|
|
string |
Sim |
Nome do cabeçalho de requisição a adicionar. |
|
|
string |
Sim |
Valor do cabeçalho de requisição a adicionar. |
|
|
Boolean |
Não |
Indica se o cabeçalho deve ser anexado caso já exista outro com o mesmo nome. Padrão: |
Valor de retorno
Retorna true por padrão. Retorna false se o nome do cabeçalho for inválido.
Exemplo
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')
Resultado: o servidor de origem recebe os seguintes cabeçalhos:
USER-DEFINED-REQ-1: 1
USER-DEFINED-REQ-1: x
O cabeçalho USER-DEFINED-REQ-2 é adicionado e depois excluído; portanto, não é encaminhado ao servidor de origem.
del_req_header
Exclua um cabeçalho de requisição antes do encaminhamento ao servidor de origem.
Sintaxe
del_req_header(name)
Parâmetros
|
Parâmetro |
Tipo |
Obrigatório |
Descrição |
|
|
string |
Sim |
Nome do cabeçalho de requisição a excluir. |
Valor de retorno
Retorna true por padrão. Retorna false se o nome do cabeçalho for inválido.
Exemplo
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')
Resultado: o servidor de origem recebe os seguintes cabeçalhos:
USER-DEFINED-REQ-1: 1
USER-DEFINED-REQ-1: x
O cabeçalho USER-DEFINED-REQ-2 é adicionado e depois excluído; portanto, não é encaminhado ao servidor de origem.
Cabeçalhos de resposta
add_rsp_header
Adiciona um cabeçalho de resposta.
Sintaxe
add_rsp_header(name, value [, append])
Parâmetros
|
Parâmetro |
Tipo |
Obrigatório |
Descrição |
|
|
string |
Sim |
Nome do cabeçalho de resposta a adicionar. |
|
|
string |
Sim |
Valor do cabeçalho de resposta a adicionar. Aceita expressões dinâmicas: |
|
|
Boolean |
Não |
Indica se o cabeçalho deve ser anexado caso já exista outro com o mesmo nome. Padrão: |
Valor de retorno
Retorna true por padrão. Retorna false se o nome do cabeçalho for inválido.
Exemplo
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')
Resultado: a resposta inclui os seguintes cabeçalhos:
USER-DEFINED-RSP-1: 1
USER-DEFINED-RSP-1: x
O cabeçalho USER-DEFINED-RSP-2 é adicionado e depois excluído; portanto, não consta na resposta.
del_rsp_header
Exclua um cabeçalho de resposta.
Sintaxe
del_rsp_header(name)
Parâmetros
|
Parâmetro |
Tipo |
Obrigatório |
Descrição |
|
|
string |
Sim |
Nome do cabeçalho de resposta a excluir. |
Valor de retorno
Retorna true por padrão. Retorna false se o nome do cabeçalho for inválido.
Exemplo
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')
Resultado: a resposta inclui os seguintes cabeçalhos:
USER-DEFINED-RSP-1: 1
USER-DEFINED-RSP-1: x
O cabeçalho USER-DEFINED-RSP-2 é adicionado e depois excluído; portanto, não consta na resposta.
get_rsp_header
Recupera o valor de um cabeçalho de resposta.
Sintaxe
get_rsp_header(str)
Parâmetros
|
Parâmetro |
Tipo |
Obrigatório |
Descrição |
|
|
string |
Sim |
Nome do cabeçalho de resposta a recuperar. |
Valor de retorno
Se o cabeçalho existir: retorna o valor como string, número, dicionário ou Boolean.
Se o cabeçalho não existir: retorna
false.
Exemplo
ct = get_rsp_header('content-type')
if ct {
add_rsp_header('origin-content-type', 'is')
} else {
add_rsp_header('origin-content-type', 'no')
}
Reescrita e redirecionamento de URL
rewrite
Reescreve a URI ou redireciona a requisição.
Sintaxe
rewrite(url, flag, code)
Parâmetros
|
Parâmetro |
Tipo |
Obrigatório |
Descrição |
|
|
string |
Sim |
URI ou URL de destino após a reescrita ou o redirecionamento. |
|
|
string |
Sim |
Modo de reescrita. Consulte a tabela de referência de flags abaixo. |
|
|
numeric |
Não |
Código de status HTTP para o redirecionamento. Aplica-se apenas quando |
Referência de flags
Use esta tabela para escolha a flag adequada ao seu caso de uso:
|
Apenas URI |
URI + parâmetros de consulta |
|
|
Reescrita no servidor (sem redirecionamento, URL no navegador inalterada) |
|
|
|
Redirecionamento no cliente (navegador faz nova requisição, URL alterada) |
|
|
Valor de retorno
Operação de reescrita (
break,enhance_break): retornatrue.Operação de redirecionamento (
redirect,enhance_redirect): sem valor de retorno.
Exemplos
Reescrita no servidor (URI + parâmetros)
if and($arg_mode, eq($arg_mode, 'rewrite:enhance_break')) {
rewrite('/example/examplefile.txt?k=v', 'enhance_break')
}
O servidor de origem recebe a requisição com a URI e os parâmetros de consulta reescritos para /example/examplefile.txt?k=v.
Redirecionamento no cliente (URI + parâmetros)
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)
}
O cliente recebe um redirecionamento 302 ou 301 para /example/examplefile.txt?k=v.
Reescrita no servidor (apenas URI)
if and($arg_mode, eq($arg_mode, 'rewrite:break')) {
rewrite('/example/examplefile.txt', 'break')
}
O servidor de origem recebe a requisição com a URI reescrita para /example/examplefile.txt. Os parâmetros de consulta originais são preservados.
Redirecionamento no cliente (apenas URI)
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)
}
O cliente recebe um redirecionamento 302 ou 301 para /example/examplefile.txt. Os parâmetros de consulta originais são preservados.
Corpo da resposta
say
Imprime conteúdo no corpo da resposta e acrescenta um caractere de nova linha.
Sintaxe
say(arg)
Parâmetros
|
Parâmetro |
Tipo |
Obrigatório |
Descrição |
|
|
any |
Sim |
Conteúdo a gravar no corpo da resposta. |
Valor de retorno
Nenhum.
Exemplo
say('hello')
print('byebye')
print('byebye')
Saída:
hello
byebyebyebye
Imprime conteúdo no corpo da resposta sem acrescentar um caractere de nova linha.
Sintaxe
print(arg)
Parâmetros
|
Parâmetro |
Tipo |
Obrigatório |
Descrição |
|
|
any |
Sim |
Conteúdo a gravar no corpo da resposta. |
Valor de retorno
Nenhum.
Exemplo
say('hello')
print('byebye')
print('byebye')
Saída:
hello
byebyebyebye
exit
Encerra a requisição atual com o código de status HTTP especificado e um corpo de resposta opcional.
Sintaxe
exit(code [, body])
Parâmetros
|
Parâmetro |
Tipo |
Obrigatório |
Descrição |
|
|
numeric |
Sim |
Código de status HTTP a retornar. |
|
|
any |
Não |
Corpo de resposta a incluir na resposta. |
Valor de retorno
Nenhum.
Exemplos
Exemplo 1: bloquear requisições com base em parâmetros de consulta e cookies
if not($arg_key) {
exit(403)
}
Se a requisição não incluir o parâmetro de consulta key, o nó CDN retorna HTTP 403.
if not($cookie_user) {
exit(403, 'not cookie user')
}
Se a requisição não incluir o cookie user, o nó CDN retorna HTTP 403 com o corpo de resposta not cookie user.
if not(0) {
exit(403)
}
not(0) resulta em false; portanto, este bloco não é executado.
if not(false) {
exit(403)
}
not(false) resulta em true; portanto, o nó CDN retorna HTTP 403.
Exemplo 2: autenticação baseada em 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)
}
Este exemplo extrai segmentos da URI da requisição, calcula um resumo MD5 e o valida em relação a uma assinatura incorporada. Se a URI estiver malformada ou o resumo não corresponder, o nó CDN retorna HTTP 403 com um cabeçalho de erro.
Cookies
add_rsp_cookie
Defina um cookie na resposta. Cada chamada gera um novo cabeçalho de resposta Set-Cookie.
Sintaxe
add_rsp_cookie(k, v [, properties])
Parâmetros
|
Parâmetro |
Tipo |
Obrigatório |
Descrição |
|
|
string |
Sim |
Nome do cookie. |
|
|
string |
Sim |
Valor do cookie. |
|
|
dictionary |
Não |
Atributos do cookie, como |
Valor de retorno
Retorna true se o cookie for definido. Retorna false se não for possível definir o cookie.
Exemplo
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'
])
A resposta inclui os seguintes cabeçalhos Set-Cookie:
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
Codificação
encode_args
Converte pares chave-valor de um dicionário em uma string codificada para URI no formato k1=v1&k2=v2.
Sintaxe
encode_args(d)
Parâmetros
|
Parâmetro |
Tipo |
Obrigatório |
Descrição |
|
|
dictionary |
Sim |
Dicionário a codificar. |
Valor de retorno
Retorna uma string codificada para URI.
Exemplo
As funções encode_args e decode_args são geralmente usadas em conjunto. O exemplo a seguir codifica um dicionário, define-o como cabeçalho de resposta e, em seguida, decodifica-o e lê valores individuais:
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'))
}
A resposta inclui os seguintes cabeçalhos:
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
Converte uma string codificada para URI no formato k1=v1&k2=v2 em um dicionário.
Sintaxe
decode_args(s)
Parâmetros
|
Parâmetro |
Tipo |
Obrigatório |
Descrição |
|
|
string |
Sim |
String codificada para URI a decodificar. |
Valor de retorno
Retorna um dicionário convertido a partir da string.
Exemplo
Consulte o exemplo de encode_args acima. A função decode_args realiza a operação inversa e é usada em conjunto com encode_args.