Hello,
thanks for sharing, might help others facing same issue!
Cheers,
Daniel
Hi! Thank you very much for hints. I was able to fix those invalid XML bodies produced by Linphone by following kamailio.cfg code: # Fix invalid XML produced by Linphone if(has_body("application/pidf+xml") && search_hf("User-Agent", "Linphone", "a")) { subst_body('/(<presence.*entity=".*)<(sip:.*)>(".*>)/\1<\2>\3/g'); subst_body('/(<contact[^>]*>.*)<(sip:.*)>(.*<\/contact>)/\1<\2>\3/g'); msg_apply_changes(); } I put it into "route[PRESENCE]" section inside "if(is_method("PUBLISH")) {". It is a hack, but it is working fine. Linphone now can show online status correctly. On Tuesday 26 June 2018 10:45:07 Daniel-Constantin Mierla wrote:Hello, if you want to try to fix it inside kamailio.cfg, look at the subst/replace functions from textops module and once those operations are done, do msg_apply_changes() from textopsx module. Cheers, Daniel On 25.06.18 16:03, Pali Rohár wrote:Ah, seems you are right. It is invalid XML. I have not spotted that when doing packet dumps. So I would report bug to linphone project. I (as a user) have no control on what linphone SIP client send to server... It looks like that linphone forgot to encode entity="..." and content of <contact>. Is there any way to "fix" these two problems in kamailio server? Probably as doing some replace filter in kamailio config file for incoming packets? Because current version of linphone is widely used and it would take time if linphone fixes this issue and users updates current broken version. On Monday 25 June 2018 15:47:19 Daniel-Constantin Mierla wrote:Hello, the error is printed because the parsing of the XML body in PUBLISH fails -- an invalid XML document. Quickly looking at it: <?xml version="1.0" encoding="UTF-8"?> <presence xmlns="urn:ietf:params:xml:ns:pidf" xmlns:dm="urn:ietf:params:xml:ns:pidf:data-model" xmlns:rpid="urn:ietf:params:xml:ns:pidf:rpid" entity="User <sip:USER@HOST>"> <tuple id="sg89ae"> <status><basic>closed</basic></status> <contact priority="0.8">User <sip:USER@HOST></contact> </tuple> </presence> the issue likely is the content of the <contact>...</contact>, it has <sip:...> which is an opening tag from XML point of view. Either encode < and > there, or put the sip address without them. Cheers, Daniel On 23.06.18 22:21, Pali Rohár wrote:Hi! I'm using linphone 3.6.1 as SIP client and Kamailio 4.4.4 as proxy server and registrar. And every time I try to change online status (presence) in linphone client, I see following error messages in kamailio server log: ERROR: presence_xml [add_events.c:167]: xml_publ_handl(): bad body format ERROR: presence [publish.c:443]: handle_publish(): in event specific publish handling ERROR: tm [t_reply.c:533]: _reply_light(): ERROR: _reply_light: can't generate 500 reply when a final 415 was sent out ERROR: sl [sl.c:269]: send_reply(): failed to reply stateful (tm) ERROR: presence [utils_func.c:146]: send_error_reply(): sending 500 Server Internal Error reply ERROR: presence [publish.c:492]: handle_publish(): failed to send error reply So it looks like kamailio is not able to parse presence change which is linphone doing. I captured traffic via tcpdump what linphone sends: 21:58:58.704792 IP (tos 0x68, ttl 64, id 64109, offset 0, flags [DF], proto UDP (17), length 32) LINPHONE_IP_ADDRESS.5060 > KAMAILIO_IP_ADDRESS.5060: SIP 21:58:58.704919 IP (tos 0x68, ttl 64, id 64110, offset 0, flags [DF], proto UDP (17), length 752) LINPHONE_IP_ADDRESS.5060 > KAMAILIO_IP_ADDRESS.5060: SIP, length: 724 PUBLISH sip:USER@HOST SIP/2.0 Via: SIP/2.0/UDP LINPHONE_IP_ADDRESS:5060;rport;branch=z9hG4bK2049418743 From: User <sip:USER@HOST>;tag=184282924 To: User <sip:USER@HOST> Call-ID: 1435474953 CSeq: 26 PUBLISH Content-Type: application/pidf+xml Max-Forwards: 70 User-Agent: Linphone/3.6.1 (eXosip2/4.1.0) Expires: 600 Event: presence Content-Length: 353 <?xml version="1.0" encoding="UTF-8"?> <presence xmlns="urn:ietf:params:xml:ns:pidf" xmlns:dm="urn:ietf:params:xml:ns:pidf:data-model" xmlns:rpid="urn:ietf:params:xml:ns:pidf:rpid" entity="User <sip:USER@HOST>"> <tuple id="sg89ae"> <status><basic>closed</basic></status> <contact priority="0.8">User <sip:USER@HOST></contact> </tuple> </presence> 21:58:58.710097 IP (tos 0x10, ttl 53, id 10255, offset 0, flags [none], proto UDP (17), length 473) KAMAILIO_IP_ADDRESS.5060 > LINPHONE_IP_ADDRESS.5060: SIP, length: 445 SIP/2.0 407 Proxy Authentication Required Via: SIP/2.0/UDP LINPHONE_IP_ADDRESS:5060;rport=5060;branch=z9hG4bK2049418743;received=EXTERNAL_IP_ADDRESS From: User <sip:USER@HOST>;tag=184282924 To: User <sip:USER@HOST>;tag=515cb47c4c34ffa85b598d6b25676122.744d Call-ID: 1435474953 CSeq: 26 PUBLISH Proxy-Authenticate: Digest realm="HOST", nonce="NONCE" Server: kamailio (4.4.4 (x86_64/linux)) Content-Length: 0 21:58:58.718147 IP (tos 0x68, ttl 64, id 64111, offset 0, flags [DF], proto UDP (17), length 940) LINPHONE_IP_ADDRESS.5060 > KAMAILIO_IP_ADDRESS.5060: SIP, length: 912 PUBLISH sip:USER@HOST SIP/2.0 Via: SIP/2.0/UDP LINPHONE_IP_ADDRESS:5060;rport;branch=z9hG4bK1165141043 From: User <sip:USER@HOST>;tag=184282924 To: User <sip:USER@HOST> Call-ID: 1435474953 CSeq: 27 PUBLISH Proxy-Authorization: Digest username="USER", realm="HOST", nonce="NONCE", uri="sip:USER@HOST", response="RESP", algorithm=MD5 Content-Type: application/pidf+xml Max-Forwards: 70 User-Agent: Linphone/3.6.1 (eXosip2/4.1.0) Expires: 600 Event: presence Content-Length: 353 <?xml version="1.0" encoding="UTF-8"?> <presence xmlns="urn:ietf:params:xml:ns:pidf" xmlns:dm="urn:ietf:params:xml:ns:pidf:data-model" xmlns:rpid="urn:ietf:params:xml:ns:pidf:rpid" entity="User <sip:USER@HOST>"> <tuple id="sg89ae"> <status><basic>closed</basic></status> <contact priority="0.8">User <sip:USER@HOST></contact> </tuple> </presence> 21:58:58.781668 IP (tos 0x10, ttl 53, id 10259, offset 0, flags [none], proto UDP (17), length 380) KAMAILIO_IP_ADDRESS.5060 > LINPHONE_IP_ADDRESS.5060: SIP, length: 352 SIP/2.0 415 Unsupported media type Via: SIP/2.0/UDP LINPHONE_IP_ADDRESS:5060;rport=5060;branch=z9hG4bK1165141043;received=EXTERNAL_IP_ADDRESS From: User <sip:USER@HOST>;tag=184282924 To: User <sip:USER@HOST>;tag=97d8e785fdf42bf9622a64c13c504961-3901 Call-ID: 1435474953 CSeq: 27 PUBLISH Server: kamailio (4.4.4 (x86_64/linux)) Content-Length: 0 I replaced ip addresses in packets by KAMAILIO_IP_ADDRESS, LINPHONE_IP_ADDRESS and EXTERNAL_IP_ADDRESS strings and also SIP account by USER@HOST. Maybe it helps you. Any idea why kamailio refuse presence update and reports those error into error log? Or is there any special setting which is needed for linphone or other SIP clients for online status / presence support? _______________________________________________ Kamailio (SER) - Users Mailing List sr-users@lists.kamailio.org https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-users
_______________________________________________ Kamailio (SER) - Users Mailing List sr-users@lists.kamailio.org https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-users
-- Daniel-Constantin Mierla -- www.asipto.com www.twitter.com/miconda -- www.linkedin.com/in/miconda Kamailio World Conference -- www.kamailioworld.com