Aturan pengalihan ALB mendukung struktur data dictionary untuk menyimpan dan memanipulasi pasangan kunci-nilai pada waktu pemrosesan request. Fungsi dictionary dapat digunakan untuk membangun logika perutean dinamis, meneruskan state antar operasi, atau memproses data terstruktur seperti playlist M3U8 yang telah diurai—tanpa perlu merangkai perbandingan if/else.
set
| Item | Description |
|---|---|
| Syntax | set(d, k, v) |
| Description | Menetapkan pasangan kunci-nilai dalam dictionary d. |
| Parameters | d: dictionary tersebut. k: kunci (tipe apa pun). v: nilai (tipe apa pun). |
| Return value | true |
Example 1: Inisialisasi dua dictionary—satu dengan indeks numerik dan satu dengan kunci string—lalu iterasi melalui dictionary berbasis kunci string menggunakan foreach.
outer_keys=['e66fd4aa-f281-472f-b919-fc7e7474de25', '66fee78d-1887-42ec-9119-a9b50b7fbca2']
say(concat('keys[1]=', get(outer_keys, 1)))
say(concat('keys[2]=', get(outer_keys, 2)))
inner_keys=[]
set(inner_keys, 'dev', '243390eb-00b7-4551-a6b8-021bb34d1674')
set(inner_keys, 'zeus', '4747d33b-12b0-45e6-ac10-a8e191d6adaa')
def echo_each(k, v, u) {
s = concat('keys[', k, ']=', v)
say(s)
}
foreach(inner_keys, echo_each, [])Output:
keys[1]=e66fd4aa-f281-472f-b919-fc7e7474de25
keys[2]=66fee78d-1887-42ec-9119-a9b50b7fbca2
keys[dev]=243390eb-00b7-4551-a6b8-021bb34d1674
keys[zeus]=4747d33b-12b0-45e6-ac10-a8e191d6adaaExample 2: Simpan dictionary bersarang (d_inner di dalam d_outer) dan baca kembali nilai dari dictionary dalam.
d_inner = []
set(d_inner, 'name', 'inner ascript')
d_outer = []
set(d_outer, 'dictA', d_inner)
v = get(d_outer, 'dictA')
if v {
v = get(v, 'name')
if v {
add_rsp_header('X-DSL-NESTED-DICT', v)
}
}Output:
X-DSL-NESTED-DICT: inner dslget
| Item | Description |
|---|---|
| Syntax | get(d, k) |
| Description | Mengambil nilai suatu kunci dari dictionary d. |
| Parameters | d: dictionary tersebut. k: kunci (tipe apa pun). |
| Return value | Nilai kunci jika ada; false jika kunci tidak ditemukan. |
Example 1: Akses nilai dari dictionary berbasis indeks numerik maupun berbasis kunci string.
outer_keys=['e66fd4aa-f281-472f-b919-fc7e7474de25', '66fee78d-1887-42ec-9119-a9b50b7fbca2']
say(concat('keys[1]=', get(outer_keys, 1)))
say(concat('keys[2]=', get(outer_keys, 2)))
inner_keys=[]
set(inner_keys, 'dev', '243390eb-00b7-4551-a6b8-021bb34d1674')
set(inner_keys, 'zeus', '4747d33b-12b0-45e6-ac10-a8e191d6adaa')
def echo_each(k, v, u) {
s = concat('keys[', k, ']=', v)
say(s)
}
foreach(inner_keys, echo_each, [])Output:
keys[1]=e66fd4aa-f281-472f-b919-fc7e7474de25
keys[2]=66fee78d-1887-42ec-9119-a9b50b7fbca2
keys[dev]=243390eb-00b7-4551-a6b8-021bb34d1674
keys[zeus]=4747d33b-12b0-45e6-ac10-a8e191d6adaaExample 2: Baca nilai dari dictionary bersarang, menggunakan if v untuk menghindari kunci yang tidak ada.
d_inner = []
set(d_inner, 'name', 'inner ascript')
d_outer = []
set(d_outer, 'dictA', d_inner)
v = get(d_outer, 'dictA')
if v {
v = get(v, 'name')
if v {
add_rsp_header('X-DSL-NESTED-DICT', v)
}
}Output:
X-DSL-NESTED-DICT: inner dslforeach
| Item | Description |
|---|---|
| Syntax | foreach(d, f, user_data) |
| Description | Melintasi setiap elemen dalam dictionary d dan memanggil callback f untuk setiap elemen. Perulangan berhenti lebih awal jika f mengembalikan false. |
| Parameters | d: dictionary tersebut. f: fungsi callback, dengan signature f(key, value, user_data). user_data: dictionary yang diteruskan ke setiap pemanggilan callback. |
| Return value | true |
Example 1: Iterasi melalui dictionary berbasis kunci string dan cetak setiap pasangan kunci-nilai.
outer_keys=['e66fd4aa-f281-472f-b919-fc7e7474de25', '66fee78d-1887-42ec-9119-a9b50b7fbca2']
say(concat('keys[1]=', get(outer_keys, 1)))
say(concat('keys[2]=', get(outer_keys, 2)))
inner_keys=[]
set(inner_keys, 'dev', '243390eb-00b7-4551-a6b8-021bb34d1674')
set(inner_keys, 'zeus', '4747d33b-12b0-45e6-ac10-a8e191d6adaa')
def echo_each(k, v, u) {
s = concat('keys[', k, ']=', v)
say(s)
}
foreach(inner_keys, echo_each, [])Output:
keys[1]=e66fd4aa-f281-472f-b919-fc7e7474de25
keys[2]=66fee78d-1887-42ec-9119-a9b50b7fbca2
keys[dev]=243390eb-00b7-4551-a6b8-021bb34d1674
keys[zeus]=4747d33b-12b0-45e6-ac10-a8e191d6adaaExample 2: Cetak dua segmen .ts pertama dari playlist M3U8 dan hentikan perulangan lebih awal. Callback melacak penghitung dalam user_data dan mengembalikan false setelah dua entri .ts dicetak.
def echo_each(k, v, u) {
say(v)
if match(v, '.*ts') {
ts_cnt = get(u, 'ts_cnt')
ts_cnt = add(ts_cnt, 1)
set(u, 'ts_cnt', ts_cnt)
if ge(ts_cnt, 2) {
return false
}
}
}
m3u8 = ''
m3u8 = concat(m3u8, '#EXTM3U8', '\n')
m3u8 = concat(m3u8, '#EXT-X-MEDIA-SEQUENCE:140651513\n')
m3u8 = concat(m3u8, '#EXT-X-TARGETDURATION:10\n')
m3u8 = concat(m3u8, '#EXTINF:8,\n')
m3u8 = concat(m3u8, 'http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651514_140651513.ts\n')
m3u8 = concat(m3u8, '#EXTINF:9,\n')
m3u8 = concat(m3u8, 'http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651514_140651514.ts\n')
m3u8 = concat(m3u8, '#EXTINF:10,\n')
m3u8 = concat(m3u8, 'http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651514_140651515.ts\n')
lines = split(m3u8, '\n')
u = []
set(u, 'ts_cnt', 0)
foreach(lines, echo_each, u)Output:
#EXTM3U8
#EXT-X-MEDIA-SEQUENCE:140651513
#EXT-X-TARGETDURATION:10
#EXTINF:8,
http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651514_140651513.ts
#EXTINF:9,
http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651514_140651514.tsdel
| Item | Description |
|---|---|
| Syntax | del(d, k) |
| Description | Menghapus pasangan kunci-nilai dari dictionary d. |
| Parameters | d: dictionary tersebut. k: kunci (tipe apa pun). |
| Return value | true |
Example: Tetapkan kunci, konfirmasi keberadaannya, hapus, lalu konfirmasi bahwa kunci tersebut sudah tidak ada. Header respons mencerminkan kedua kondisi tersebut.
var_a = []
set(var_a, 'note_a', 'note a info')
if get(var_a, 'note_a') {
add_rsp_header('X-RESPOND-OUTPUT', 'found var_a key', true)
} else {
add_rsp_header('X-RESPOND-OUTPUT', 'del var_a key', true)
}
del(var_a, 'note_a')
if get(var_a, 'note_a') {
add_rsp_header('X-RESPOND-OUTPUT', 'found var_a key', true)
} else {
add_rsp_header('X-RESPOND-OUTPUT', 'del var_a key', true)
}Output:
X-RESPOND-OUTPUT: found var_a key
X-RESPOND-OUTPUT: del var_a key