Hello,
fine for me to do some refactoring for better clarity of purpose and type of parameters. As we are going to use version 6.0.x with next major release, it should be fine if the change is more intrusive (e.g., new field for tel params or user params, maybe new field for indicating the type of uri ...) -- of course all affected components have to be updated (if it is a lot to do, can be eventually done during the devel meeting in Dusseldorf).
In case of starting to code in such direction, a PR can be proposed, so others can review/contribute.
Cheers, Daniel
On 10.10.24 09:40, Xenofon Karamanos via sr-dev wrote:
Hi all, I’d like to bring up some development topics related to the SIP parsing logic, specifically when handling |sip:| with embedded |tel| URIs scheme. The current behaviour, particularly when |user=phone| is present, is leading to some inconsistencies and potential confusion, and I believe it might require some refactoring or documentation updates. *Current Parsing Behavior:* When a |tel:| URI is embedded in a |sip:| scheme (e.g., |user=phone| is present), the parser currently copies the URI parsed parameters to |sip_params|, then splits the user part (like |123;param=value;param2=value2|) into |user| and all the rest |tel| parameters to |params|. This behaviour is only triggered when the global |phone2tel| configuration option is enabled (which is the default). *Issues:* *1. Inconsistent Handling of URI Parameters* There’s no consistency across modules on whether they use |sip_params| or |params| to get the *URI *parameters. While most modules correctly use |sip_params|, others use |params|. Normally, this works fine because |sip_params| and |params| hold the same data when |user=phone| is *not* present or |phone2tel| is disabled. However, when |user=phone| *is* present and |phone2tel| is enabled, |params| may be empty, leading to unexpected behavior in modules relying on it. For example, the following modules are using |params |and many others:
- dmqnode.c (line 204) https://github.com/kamailio/kamailio/blob/ba6ab04e06b0dfd66874749e0cb1225f2ee273ac/src/modules/dmq/dmqnode.c#L204
- notification_peer.c (line 432) https://github.com/kamailio/kamailio/blob/ba6ab04e06b0dfd66874749e0cb1225f2ee273ac/src/modules/dmq/notification_peer.c#L432
While some may handle the differences between |sip_params| and |params|, not all of them do. *2. Unclear Intention of the |phone2tel| Global Parameter* The current parser code is quite old, and it’s unclear what the original intention behind the |phone2tel| global parameter was. As far as I understand, the |sip:| scheme can handle |tel:| URIs, and this is the most widely accepted specification. The role of |phone2tel| seems to blur the lines between the two schemes, leading to unexpected transformations. *Example of Unexpected Behavior:* Consider the following header: |P-Asserted-Identity: Display sip:+1234;pname=pval@domain;user=phone;tag=1234 | If we apply the |{tobody.user}| transformation, the expected output should be the user part of the URI. Based on the RFC, we expected the transformation to return |+1234;pname=pval|. However, due to the |phone2tel| global configuration parameter, the parser treats it as a |tel:| scheme and returns only |+1234|. This behavior seems to be influenced by how the global parameter forces the parser to handle the URI. *Proposal:* To resolve these issues, I suggest the following:
- *Refactor Parameter Handling*: Introduce a more explicit separation of |tel_params| and |sip_params|, and ensure all modules use the correct set of parameters based on the context. This would help enforce consistency across the codebase.
- *Update Documentation*: Provide clear documentation regarding the behavior of |phone2tel| and how it impacts URI parsing. In particular, the transformation documentation should reflect the expected behavior depending on whether the URI is treated as |sip:| or |tel:|.
- *Review and Fix Modules*: We should audit the modules that currently rely on |params| and ensure they are using |sip_params| where appropriate, especially in cases where |user=phone| could be present.
Any guidance or feedback on these points would be greatly appreciated. If you’ve encountered any related bugs or discovered other edge cases, please let me know so we can address them. Best regards, Xenofon
Kamailio (SER) - Development Mailing List To unsubscribe send an email to sr-dev-leave@lists.kamailio.org