Я боролся с этим сам. По-видимому, PJSIP оценивает только первый WWW-Authenticate заголовок, даже если сервер предоставляет более одного.
Чтобы решить эту проблему, я изменил следующее в исходном коде:
В файле /pjsip/src/pjsip/sip_auth_client.c
найти блок кода, который генерирует ответ для заголовка WWW-Authenticate. Оно должно быть в строке 1220.
/* Create authorization header for this challenge, and update
* authorization session.
*/
status = process_auth(tdata->pool, hchal, tdata->msg->line.req.uri,
tdata, sess, cached_auth, &hauth);
if (status != PJ_SUCCESS)
return status;
if (pj_pool_get_used_size(cached_auth->pool) >
PJSIP_AUTH_CACHED_POOL_MAX_SIZE)
{
recreate_cached_auth_pool(sess->endpt, cached_auth);
}
/* Add to the message. */
pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr*)hauth);
/* Process next header. */
hdr = hdr->next;
и заменить его на
/* Create authorization header for this challenge, and update
* authorization session.
*/
status = process_auth(tdata->pool, hchal, tdata->msg->line.req.uri,
tdata, sess, cached_auth, &hauth);
if (status != PJ_SUCCESS){
// Previously, pjsip analysed one www-auth header, and if it failed (due to unsupported sha-256 digest for example), it returned and did not consider the next www-auth header.
PJ_LOG(4,(THIS_FILE, "Invalid response, moving to next"));
//return status;
hdr = hdr->next;
}else{
if (pj_pool_get_used_size(cached_auth->pool) >
PJSIP_AUTH_CACHED_POOL_MAX_SIZE)
{
recreate_cached_auth_pool(sess->endpt, cached_auth);
}
/* Add to the message. */
pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr*)hauth);
/* Process next header. */
hdr = hdr->next;
}
Затем перекомпилировать исходный код (согласно этим инструкциям Как установить пакеты pjsua2 для python ? )
Обратите внимание, что, хотя это решает проблему для linphone, я не проверял это для других ситуаций (например, когда сервер отправляет несколько действительных алгоритмов или ни одного вообще).