### Description

if multiple sip websocket clients are subscribed to some UA and one of the 
watchers suddenly disappears (e.g. the web page is reloaded), then no NOTIFY is 
ever sent after issuing a `pres_refresh_watchers()`.

The following error is logged:

```
WARNING: <core> [core/msg_translator.c:3007]: via_builder(): TCP/TLS connection 
(id: 0) for WebSocket could not be found
ERROR: tm [t_msgbuilder.c:1423]: assemble_via(): via building failed
ERROR: tm [t_msgbuilder.c:1614]: build_uac_req(): error while assembling Via
ERROR: tm [uac.c:552]: t_uac_prepare(): Error while building message
ERROR: presence [notify.c:1734]: send_notify_request(): in function tm 
t_request_within()
ERROR: presence [notify.c:1829]: notify(): sending Notify not successful
ERROR: presence [notify.c:1585]: query_db_notify(): Could not send notify for 
[event]=dialog
ERROR: presence [presence.c:739]: pres_refresh_watchers(): sending Notify 
requests
```

### Troubleshooting

when the client disconnects, the old watcher is not removed from the 
active_watchers table, instead it coexists with the new one, but the stale 
connection causes the error above when sending the notify, and then all of the 
following watchers (even the valid ones) are skipped too.

Looking at the logs, the valid watchers are not notified because the while loop 
[here](https://github.com/kamailio/kamailio/blob/b96bc11a54f11ec688429c057bf5a90c40c147b3/src/modules/presence/notify.c#L1585-L1590)
 is skipped because of the `goto done` line in case of errors, which happens 
because it fails to build the via header for the message relevant to the stale 
websocket connection.

By breaking out of the while loop, the remaining subs in the `subs_array` are 
skipped.

#### Reproduction

Just subscribe to a sip client using a websocket-based phone, then abruptly 
disconnect it (e.g. by reloading the web page) and then issue a 
`pres_refresh_watchers()` to make it generate a notify.

#### Debugging Data

#### Log Messages

#### SIP Traffic

### Possible Solutions

I tried to use the "websocket:closed" route to purge stale connections, but to 
my knowledge there are no APIs to clean invalid watchers.

A possible solution could be to automatically remove the watchers on 
disconnection and maybe skip the invalid ones without exiting from the refresh 
loop

### Additional Information

  kamailio 5.8.2

* **Operating System**:

Rocky Linux 9


-- 
Reply to this email directly or view it on GitHub:
https://github.com/kamailio/kamailio/issues/4118
You are receiving this because you are subscribed to this thread.

Message ID: <kamailio/kamailio/issues/4...@github.com>
_______________________________________________
Kamailio - Development Mailing List -- sr-dev@lists.kamailio.org
To unsubscribe send an email to sr-dev-le...@lists.kamailio.org
Important: keep the mailing list in the recipients, do not reply only to the 
sender!

Reply via email to