diff --git a/RELEASENOTES.md b/RELEASENOTES.md index f679980992b..0a2ba360245 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -92,6 +92,8 @@ ([#9379](https://github.com/google/ExoPlayer/issues/9379)). * Handle partial URIs in RTP-Info headers ([#9346](https://github.com/google/ExoPlayer/issues/9346)). + * Fix RTSP Session header handling + ([#9416](https://github.com/google/ExoPlayer/issues/9416)). * Extractors: * ID3: Fix issue decoding ID3 tags containing UTF-16 encoded strings ([#9087](https://github.com/google/ExoPlayer/issues/9087)). diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java index a1a9b69afd9..ece8b77653b 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java @@ -94,7 +94,7 @@ public RtspAuthUserInfo(String username, String password) { // Session header pattern, see RFC2326 Sections 3.4 and 12.37. private static final Pattern SESSION_HEADER_PATTERN = - Pattern.compile("([\\w$-_.+]+)(?:;\\s?timeout=(\\d+))?"); + Pattern.compile("([\\w$\\-_.+]+)(?:;\\s?timeout=(\\d+))?"); // WWW-Authenticate header pattern, see RFC2068 Sections 14.46 and RFC2069. private static final Pattern WWW_AUTHENTICATION_HEADER_DIGEST_PATTERN = diff --git a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtilTest.java b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtilTest.java index b11e82f9c9d..d6a37965c08 100644 --- a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtilTest.java +++ b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtilTest.java @@ -406,6 +406,16 @@ public void parseSessionHeader_withSessionIdContainingSpecialCharacters_succeeds assertThat(sessionHeader.sessionId).isEqualTo("610a63df-9b57.4856_97ac$665f+56e9c04"); } + @Test + public void parseSessionHeader_withSessionIdContainingSpecialCharactersAndTimeout_succeeds() + throws Exception { + String sessionHeaderString = "610a63df-9b57.4856_97ac$665f+56e9c04;timeout=60"; + RtspMessageUtil.RtspSessionHeader sessionHeader = + RtspMessageUtil.parseSessionHeader(sessionHeaderString); + assertThat(sessionHeader.sessionId).isEqualTo("610a63df-9b57.4856_97ac$665f+56e9c04"); + assertThat(sessionHeader.timeoutMs).isEqualTo(60_000); + } + @Test public void removeUserInfo_withUserInfo() { Uri uri = Uri.parse("rtsp://user:pass@foo.bar/foo.mkv");