Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c7beef0e authored by Christopher Lais's avatar Christopher Lais
Browse files

SIP: use expiry time from Contact header

RFC3261 section 10.3 does not mention the "Expires" header,
but does say the Contact headers MUST be present, and that
the expires parameter in those MUST be present.

At least one registrar (sipgate.com) does not provide an
Expires header in the response, but does provide the expires
parameter in the appropriate Contact header.

Change-Id: I2de0c12d8fa04b6e2b3a756c2e89f7a62ede3ae3
parent 992f04fc
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -145,15 +145,22 @@ class SipHelper {
        return viaHeaders;
    }

    private ContactHeader createContactHeader(SipProfile profile)
    public Address createContactAddress(SipProfile profile)
            throws ParseException, SipException {
        ListeningPoint lp = getListeningPoint();

        SipURI contactURI =
                createSipUri(profile.getUserName(), profile.getProtocol(), lp);

        Address contactAddress = mAddressFactory.createAddress(contactURI);
        contactAddress.setDisplayName(profile.getDisplayName());

        return contactAddress;
    }

    private ContactHeader createContactHeader(SipProfile profile)
            throws ParseException, SipException {
        Address contactAddress = createContactAddress(profile);
        return mHeaderFactory.createContactHeader(contactAddress);
    }

+18 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import gov.nist.javax.sip.header.SIPHeaderNames;
import gov.nist.javax.sip.header.ProxyAuthenticate;
import gov.nist.javax.sip.header.WWWAuthenticate;
import gov.nist.javax.sip.message.SIPMessage;
import gov.nist.javax.sip.message.SIPResponse;

import android.net.sip.ISipSession;
import android.net.sip.ISipSessionListener;
@@ -66,6 +67,7 @@ import javax.sip.TransactionUnavailableException;
import javax.sip.address.Address;
import javax.sip.address.SipURI;
import javax.sip.header.CSeqHeader;
import javax.sip.header.ContactHeader;
import javax.sip.header.ExpiresHeader;
import javax.sip.header.FromHeader;
import javax.sip.header.MinExpiresHeader;
@@ -774,6 +776,22 @@ class SipSessionGroup implements SipListener {
            ExpiresHeader expiresHeader = (ExpiresHeader)
                    response.getHeader(ExpiresHeader.NAME);
            if (expiresHeader != null) expires = expiresHeader.getExpires();
            try {
                final Address profileAddress =
                        mSipHelper.createContactAddress(mLocalProfile);

                for (ContactHeader contactHeader
                        : ((SIPResponse) response).getContactHeaders()) {
                    if (contactHeader.getAddress().equals(profileAddress)) {
                        expires = contactHeader.getExpires();
                        break;
                    }
                }
            } catch (ParseException e) {
                // Should not happen, but ignore it if it does.
            } catch (SipException e) {
                // Should not happen, but ignore it if it does.
            }
            expiresHeader = (ExpiresHeader)
                    response.getHeader(MinExpiresHeader.NAME);
            if (expiresHeader != null) {