use more approriate reason when failing because of parse errors
This commit is contained in:
parent
ec6bcec849
commit
b95d406e61
|
@ -266,7 +266,7 @@ public class JingleRtpConnection extends AbstractJingleConnection implements Web
|
||||||
contentMap.requireDTLSFingerprint();
|
contentMap.requireDTLSFingerprint();
|
||||||
} catch (final IllegalArgumentException | IllegalStateException | NullPointerException e) {
|
} catch (final IllegalArgumentException | IllegalStateException | NullPointerException e) {
|
||||||
respondOk(jinglePacket);
|
respondOk(jinglePacket);
|
||||||
sendSessionTerminate(Reason.FAILED_APPLICATION, e.getMessage());
|
sendSessionTerminate(Reason.of(e), e.getMessage());
|
||||||
Log.d(Config.LOGTAG, id.account.getJid().asBareJid() + ": improperly formatted contents", e);
|
Log.d(Config.LOGTAG, id.account.getJid().asBareJid() + ": improperly formatted contents", e);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -315,14 +315,22 @@ public class JingleRtpConnection extends AbstractJingleConnection implements Web
|
||||||
contentMap = RtpContentMap.of(jinglePacket);
|
contentMap = RtpContentMap.of(jinglePacket);
|
||||||
contentMap.requireContentDescriptions();
|
contentMap.requireContentDescriptions();
|
||||||
contentMap.requireDTLSFingerprint();
|
contentMap.requireDTLSFingerprint();
|
||||||
} catch (IllegalArgumentException | IllegalStateException | NullPointerException e) {
|
} catch (final IllegalArgumentException | IllegalStateException | NullPointerException e) {
|
||||||
respondOk(jinglePacket);
|
respondOk(jinglePacket);
|
||||||
Log.d(Config.LOGTAG, id.account.getJid().asBareJid() + ": improperly formatted contents in session-accept", e);
|
Log.d(Config.LOGTAG, id.account.getJid().asBareJid() + ": improperly formatted contents in session-accept", e);
|
||||||
webRTCWrapper.close();
|
webRTCWrapper.close();
|
||||||
sendSessionTerminate(Reason.FAILED_APPLICATION, e.getMessage());
|
sendSessionTerminate(Reason.of(e), e.getMessage());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final Set<Media> initiatorMedia = this.initiatorRtpContentMap.getMedia();
|
||||||
|
if (!initiatorMedia.equals(contentMap.getMedia())) {
|
||||||
|
sendSessionTerminate(Reason.SECURITY_ERROR, String.format(
|
||||||
|
"Your session-included included media %s but our session-initiate was %s",
|
||||||
|
this.proposedMedia,
|
||||||
|
contentMap.getMedia()
|
||||||
|
));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//TODO check that session accept content media matched ours
|
|
||||||
Log.d(Config.LOGTAG, "processing session-accept with " + contentMap.contents.size() + " contents");
|
Log.d(Config.LOGTAG, "processing session-accept with " + contentMap.contents.size() + " contents");
|
||||||
if (transition(State.SESSION_ACCEPTED)) {
|
if (transition(State.SESSION_ACCEPTED)) {
|
||||||
respondOk(jinglePacket);
|
respondOk(jinglePacket);
|
||||||
|
@ -913,6 +921,9 @@ public class JingleRtpConnection extends AbstractJingleConnection implements Web
|
||||||
if (newState == PeerConnection.PeerConnectionState.CONNECTED && this.rtpConnectionStarted == 0) {
|
if (newState == PeerConnection.PeerConnectionState.CONNECTED && this.rtpConnectionStarted == 0) {
|
||||||
this.rtpConnectionStarted = SystemClock.elapsedRealtime();
|
this.rtpConnectionStarted = SystemClock.elapsedRealtime();
|
||||||
}
|
}
|
||||||
|
//TODO 'DISCONNECTED' might be an opportunity to renew the offer and send a transport-replace
|
||||||
|
//TODO exact syntax is yet to be determined but transport-replace sounds like the most reasonable
|
||||||
|
//as there is no content-replace
|
||||||
if (Arrays.asList(PeerConnection.PeerConnectionState.FAILED, PeerConnection.PeerConnectionState.DISCONNECTED).contains(newState)) {
|
if (Arrays.asList(PeerConnection.PeerConnectionState.FAILED, PeerConnection.PeerConnectionState.DISCONNECTED).contains(newState)) {
|
||||||
if (TERMINATED.contains(this.state)) {
|
if (TERMINATED.contains(this.state)) {
|
||||||
Log.d(Config.LOGTAG, id.account.getJid().asBareJid() + ": not sending session-terminate after connectivity error because session is already in state " + this.state);
|
Log.d(Config.LOGTAG, id.account.getJid().asBareJid() + ": not sending session-terminate after connectivity error because session is already in state " + this.state);
|
||||||
|
|
|
@ -23,6 +23,7 @@ import eu.siacs.conversations.xmpp.jingle.stanzas.GenericTransportInfo;
|
||||||
import eu.siacs.conversations.xmpp.jingle.stanzas.Group;
|
import eu.siacs.conversations.xmpp.jingle.stanzas.Group;
|
||||||
import eu.siacs.conversations.xmpp.jingle.stanzas.IceUdpTransportInfo;
|
import eu.siacs.conversations.xmpp.jingle.stanzas.IceUdpTransportInfo;
|
||||||
import eu.siacs.conversations.xmpp.jingle.stanzas.JinglePacket;
|
import eu.siacs.conversations.xmpp.jingle.stanzas.JinglePacket;
|
||||||
|
import eu.siacs.conversations.xmpp.jingle.stanzas.Reason;
|
||||||
import eu.siacs.conversations.xmpp.jingle.stanzas.RtpDescription;
|
import eu.siacs.conversations.xmpp.jingle.stanzas.RtpDescription;
|
||||||
|
|
||||||
public class RtpContentMap {
|
public class RtpContentMap {
|
||||||
|
@ -130,14 +131,12 @@ public class RtpContentMap {
|
||||||
rtpDescription = (RtpDescription) description;
|
rtpDescription = (RtpDescription) description;
|
||||||
} else {
|
} else {
|
||||||
Log.d(Config.LOGTAG, "description was " + description);
|
Log.d(Config.LOGTAG, "description was " + description);
|
||||||
//todo throw unsupported application
|
throw new UnsupportedApplicationException("Content does not contain rtp description");
|
||||||
throw new IllegalArgumentException("Content does not contain RtpDescription");
|
|
||||||
}
|
}
|
||||||
if (transportInfo instanceof IceUdpTransportInfo) {
|
if (transportInfo instanceof IceUdpTransportInfo) {
|
||||||
iceUdpTransportInfo = (IceUdpTransportInfo) transportInfo;
|
iceUdpTransportInfo = (IceUdpTransportInfo) transportInfo;
|
||||||
} else {
|
} else {
|
||||||
//TODO throw UNSUPPORTED_TRANSPORT exception
|
throw new UnsupportedTransportException("Content does not contain ICE-UDP transport");
|
||||||
throw new IllegalArgumentException("Content does not contain ICE-UDP transport");
|
|
||||||
}
|
}
|
||||||
return new DescriptionTransport(rtpDescription, iceUdpTransportInfo);
|
return new DescriptionTransport(rtpDescription, iceUdpTransportInfo);
|
||||||
}
|
}
|
||||||
|
@ -158,4 +157,16 @@ public class RtpContentMap {
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class UnsupportedApplicationException extends IllegalArgumentException {
|
||||||
|
UnsupportedApplicationException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class UnsupportedTransportException extends IllegalArgumentException {
|
||||||
|
UnsupportedTransportException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,8 @@ import android.support.annotation.NonNull;
|
||||||
|
|
||||||
import com.google.common.base.CaseFormat;
|
import com.google.common.base.CaseFormat;
|
||||||
|
|
||||||
|
import eu.siacs.conversations.xmpp.jingle.RtpContentMap;
|
||||||
|
|
||||||
public enum Reason {
|
public enum Reason {
|
||||||
ALTERNATIVE_SESSION,
|
ALTERNATIVE_SESSION,
|
||||||
BUSY,
|
BUSY,
|
||||||
|
@ -37,4 +39,16 @@ public enum Reason {
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_HYPHEN, super.toString());
|
return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_HYPHEN, super.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Reason of(final RuntimeException e) {
|
||||||
|
if (e instanceof SecurityException) {
|
||||||
|
return SECURITY_ERROR;
|
||||||
|
} else if (e instanceof RtpContentMap.UnsupportedTransportException) {
|
||||||
|
return UNSUPPORTED_TRANSPORTS;
|
||||||
|
} else if (e instanceof RtpContentMap.UnsupportedApplicationException) {
|
||||||
|
return UNSUPPORTED_APPLICATIONS;
|
||||||
|
} else {
|
||||||
|
return FAILED_APPLICATION;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in a new issue