не мытьём так катаньем

Sep 21, 2016 23:26

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

sip, diversion, kamailio

Previous post Next post
Up