summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pjsip/src/pjsip-simple/evsub.c18
-rw-r--r--tests/pjsua/scripts-sipp/uas-subscribe-late-notify.xml152
2 files changed, 167 insertions, 3 deletions
diff --git a/pjsip/src/pjsip-simple/evsub.c b/pjsip/src/pjsip-simple/evsub.c
index d4dc8b4b..7acd0bad 100644
--- a/pjsip/src/pjsip-simple/evsub.c
+++ b/pjsip/src/pjsip-simple/evsub.c
@@ -1378,10 +1378,21 @@ static pjsip_evsub *on_new_transaction( pjsip_transaction *tsx,
dlgsub = dlgsub->next;
}
- if (dlgsub == dlgsub_head) {
+ /* Note:
+ * the second condition is for http://trac.pjsip.org/repos/ticket/911
+ */
+ if (dlgsub == dlgsub_head ||
+ (dlgsub->sub &&
+ pjsip_evsub_get_state(dlgsub->sub)==PJSIP_EVSUB_STATE_TERMINATED))
+ {
+ const char *reason_msg =
+ (dlgsub == dlgsub_head ? "Subscription Does Not Exist" :
+ "Subscription already terminated");
+
/* This could be incoming request to create new subscription */
PJ_LOG(4,(THIS_FILE,
- "Subscription not found for %.*s, event=%.*s;id=%.*s",
+ "%s for %.*s, event=%.*s;id=%.*s",
+ reason_msg,
(int)tsx->method.name.slen,
tsx->method.name.ptr,
(int)event_hdr->event_type.slen,
@@ -1393,10 +1404,11 @@ static pjsip_evsub *on_new_transaction( pjsip_transaction *tsx,
if (tsx->state == PJSIP_TSX_STATE_TRYING &&
pjsip_method_cmp(&tsx->method, &pjsip_notify_method)==0)
{
- pj_str_t reason = pj_str("Subscription Does Not Exist");
+ pj_str_t reason;
pjsip_tx_data *tdata;
pj_status_t status;
+ pj_cstr(&reason, reason_msg);
status = pjsip_dlg_create_response(dlg,
event->body.tsx_state.src.rdata,
481, &reason,
diff --git a/tests/pjsua/scripts-sipp/uas-subscribe-late-notify.xml b/tests/pjsua/scripts-sipp/uas-subscribe-late-notify.xml
new file mode 100644
index 00000000..918a382d
--- /dev/null
+++ b/tests/pjsua/scripts-sipp/uas-subscribe-late-notify.xml
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE scenario SYSTEM "sipp.dtd">
+
+<!-- This program is free software; you can redistribute it and/or -->
+<!-- modify it under the terms of the GNU General Public License as -->
+<!-- published by the Free Software Foundation; either version 2 of the -->
+<!-- License, or (at your option) any later version. -->
+<!-- -->
+<!-- This program is distributed in the hope that it will be useful, -->
+<!-- but WITHOUT ANY WARRANTY; without even the implied warranty of -->
+<!-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -->
+<!-- GNU General Public License for more details. -->
+<!-- -->
+<!-- You should have received a copy of the GNU General Public License -->
+<!-- along with this program; if not, write to the -->
+<!-- Free Software Foundation, Inc., -->
+<!-- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -->
+<!-- -->
+<!-- Late NOTIFY scenario: -->
+<!-- - UAC sends SUBSCRIBE, we reply with 200 -->
+<!-- - we send NOTIFY, expect 200 -->
+<!-- - UAC sends SUBSCRIBE, we ignore -->
+<!-- - we send NOTIFY -->
+<!-- See http://trac.pjsip.org/repos/ticket/911 -->
+<!-- -->
+
+<scenario name="Late NOTIFY">
+ <!-- By adding rrs="true" (Record Route Sets), the route sets -->
+ <!-- are saved and used for following messages sent. Useful to test -->
+ <!-- against stateful SIP proxies/B2BUAs. -->
+ <recv request="SUBSCRIBE" crlf="true">
+ <action>
+ <ereg regexp=".*" search_in="hdr" header="From" assign_to="3"/>
+ <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
+ <assign assign_to="4" variable="5" />
+ </action>
+ </recv>
+
+
+ <!-- The '[last_*]' keyword is replaced automatically by the -->
+ <!-- specified header if it was present in the last message received -->
+ <!-- (except if it was a retransmission). If the header was not -->
+ <!-- present or if no message has been received, the '[last_*]' -->
+ <!-- keyword is discarded, and all bytes until the end of the line -->
+ <!-- are also discarded. -->
+ <!-- -->
+ <!-- If the specified header was present several times in the -->
+ <!-- message, all occurences are concatenated (CRLF seperated) -->
+ <!-- to be used in place of the '[last_*]' keyword. -->
+
+ <send>
+ <![CDATA[
+
+ SIP/2.0 200 OK
+ [last_Via:]
+ [last_From:]
+ [last_To:];tag=[call_number]
+ [last_Call-ID:]
+ [last_CSeq:]
+ Contact: <sip:sipp@[local_ip]:[local_port]>
+ Content-Length: 0
+ Expires: 60
+ ]]>
+ </send>
+
+ <send retrans="500">
+ <![CDATA[
+ NOTIFY sip:[$5] SIP/2.0
+ Via: SIP/2.0/[transport] [local_ip]:[local_port];rport;branch=z9hG4bKPj01
+ From: sipp <sip:sipp@[local_ip]>;tag=[call_number]
+ To[$3]
+ Call-ID: [call_id]
+ Cseq: 1 NOTIFY
+ Contact: sip:sipp@[local_ip]:[local_port]
+ Max-Forwards: 70
+ Event: presence
+ Subscription-State: active;expires=50
+ Content-Type: application/pidf+xml
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <presence xmlns="urn:ietf:params:xml:ns:pidf" xmlns:op="urn:oma:xml:prs:pidf:oma-pres" entity="sip:moto_red@ptt.intra.genaker.net">
+ <tuple id="17415d5738f332a64a2f1d8cfb4ab0a5">
+ <status>
+ <basic>open</basic>
+ </status>
+ <op:willingness>
+ <op:basic>closed</op:basic>
+ </op:willingness>
+ <op:barring-state>active</op:barring-state>
+ <op:service-description>
+ <op:service-id>org.openmobilealliance:PoC-session</op:service-id>
+ <op:version>1.0</op:version>
+ </op:service-description>
+ </tuple>
+ </presence>
+ ]]>
+ </send>
+
+ <recv response="200">
+ </recv>
+
+ <recv request="SUBSCRIBE" crlf="true">
+ </recv>
+
+ <!-- UAC sends SUBSCRIBE, we do nothing -->
+ <send>
+ <![CDATA[
+
+ SIP/2.0 408 Timeout Bo
+ [last_Via:]
+ [last_From:]
+ [last_To:];tag=[call_number]
+ [last_Call-ID:]
+ [last_CSeq:]
+ Contact: <sip:sipp@[local_ip]:[local_port]>
+ Content-Length: 0
+ Expires: 60
+ ]]>
+ </send>
+
+
+ <!-- <pause milliseconds="32070"/> -->
+
+ <!-- Now send late NOTIFY -->
+ <send retrans="500">
+ <![CDATA[
+ NOTIFY sip:[$5] SIP/2.0
+ Via: SIP/2.0/[transport] [local_ip]:[local_port];rport;branch=z9hG4bKPj02
+ From: sipp <sip:sipp@[local_ip]>;tag=[call_number]
+ To[$3]
+ Call-ID: [call_id]
+ Cseq: 2 NOTIFY
+ Contact: sip:sipp@[local_ip]:[local_port]
+ Max-Forwards: 70
+ Event: presence
+ Subscription-State: terminated;reason=timeout
+ Content-Length: 0
+ ]]>
+ </send>
+
+ <recv response="481">
+ </recv>
+
+
+ <!-- definition of the response time repartition table (unit is ms) -->
+ <ResponseTimeRepartition value="10, 20, 30, 40, 50, 100, 150, 200"/>
+
+ <!-- definition of the call length repartition table (unit is ms) -->
+ <CallLengthRepartition value="10, 50, 100, 500, 1000, 5000, 10000"/>
+
+</scenario>
+