kamailio/openser всех версий (на текщую дату) не умеют корректно разбирать содержимое заголовка Diversion с несколькими значениями, вполне допустимый с точки зрения RFC 3261 (... Multiple header field values on a given header field row are separated by commas. ...)
Например вот такой заголовок
Diversion: ;reason=unconditional, ;reason=busy
порождает примерно вот такие ошибки
ERROR: [parser/parse_addr_spec.c:488]: parse_to_param(): ERROR parse_to_param : invalid character ',' in status 27: <<;reason=unconditional>>
ERROR: [parser/parse_addr_spec.c:517]: parse_to_param(): ERROR: parse_to_param: spitting out [<] in status 29
ERROR: [parser/parse_diversion.c:69]: parse_diversion_header(): ERROR:parse_diversion_header: bad diversion header
Это не сказывается на обычной работе до тех пор пока не возникнет желание "заглянуть" в содержимое этого заголовка. Поверхностная причина - последний параметр вызова parse_addr_spec, запрещающий ',' в качестве допустимого символа.
Попробуем решить это конфигурацией, не всегда есть возможность обновить ПО, да и надо прямо сейчас.
После необходимых проверок, но до каких-либо возможных корректировок и удаления заголовков:
if (is_method("INVITE") && is_present_hf("Diversion")) {
route(fixDIVERSION);
}
route[fixDIVERSION] {
$var(i) = 0;
$var(j) = 0;
# Разберём вручную все значения из заголовка(-ов)
while ( $(hdr(Diversion)[$(var(i))]{s.len}) > 0) {
$var(k) = 0;
while ( $(hdr(Diversion)[$(var(i))]{s.select,$var(k),,}{s.len}) > 0) {
$(avp(diverions)[$var(j)]) = $(hdr(Diversion)[$(var(i))]{s.select,$var(k),,}{s.trim});
$var(j) = $var(j) + 1;
$var(k) = $var(k) + 1;
}
$var(i) = $var(i) + 1;
}
Удалим существующие заголовки и добавим новые
if(remove_hf("Diversion")) {
$var(j) = $var(j) - 1;
while ( $var(j) >= 0) {
append_hf("Diversion: $(avp(diverions)[$var(j)])\r\n","Max-Forwards");
$var(j) = $var(j) - 1;
}
# применим изменения
msg_apply_changes();
}
}
Получаем на выходе
Diversion: ;reason=unconditional
Diversion: ;reason=busy