Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* Re: [FFmpeg-devel] [PATCH] Accept a colon in the path of a URI, instead of stripping preceding characters.
@ 2025-05-20 15:27 Timothy Allen via ffmpeg-devel
  2025-05-20 19:49 ` Marton Balint
  2025-05-20 20:03 ` softworkz .
  0 siblings, 2 replies; 10+ messages in thread
From: Timothy Allen via ffmpeg-devel @ 2025-05-20 15:27 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Timothy Allen

Good day

I wanted to offer a discussion of the referenced patch.

I have found that, when a link in an extended M3U file (as used by HLS)
includes a colon, FFmpeg will fail to load the file.

The bug has already been reported: https://trac.ffmpeg.org/ticket/10679

The error reads:
[hls @ 0x78dea4000c80] Failed to open segment 0 of playlist 0 [hls @
0x78dea4000c80] Segment 0 of playlist 0 failed too many times, skipping

The referenced patch fixes the issue. However, it is worth noting that
the patch changes the behavior of one of the unit tests:

- http://a/b/c/d;p?q g:h                  => g:h
+ http://a:b/c/d;p?q e                    => http://a:b/c/e

The original unit test derives from the following two trac tickets:
https://trac.ffmpeg.org/ticket/8813
https://trac.ffmpeg.org/ticket/8814

This is a breaking change, and, in particular, violates one specific
example given in the rfc at
https://tools.ietf.org/html/rfc3986#section-5.4 (the first example). In
particular, it will affect cases where a URL consists only of
host:port, with no scheme or path, and the base URL links to an
unrelated host. Where before, the new link would take the form of
"host:port", the new link will now use "host:port" as the last element
of the path.

I believe that this behaviour is more intuitive given modern use of
URIs (and is replicated in many browsers), but I recognise this is a
matter of taste.

Thank you,

Tim
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 10+ messages in thread
* [FFmpeg-devel] [PATCH] Accept a colon in the path of a URI, instead of stripping preceding characters.
@ 2025-05-20 15:27 Timothy Allen via ffmpeg-devel
  0 siblings, 0 replies; 10+ messages in thread
From: Timothy Allen via ffmpeg-devel @ 2025-05-20 15:27 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Timothy Allen

This commit closes trac ticket 10679.

Signed-off-by: Timothy Allen <tim@treehouse.org.za>
---
 libavformat/tests/url.c | 8 +++++++-
 libavformat/url.c       | 8 +++++++-
 tests/ref/fate/url      | 7 ++++++-
 3 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/libavformat/tests/url.c b/libavformat/tests/url.c
index 8644a3e826..8bc3aab6be 100644
--- a/libavformat/tests/url.c
+++ b/libavformat/tests/url.c
@@ -148,9 +148,15 @@ int main(void)
     test("http://a/b", "//srv/shr/file");
     test("http://a/b", "d:\\file");
     test("http://a/b", "C:/file");
+    test("http://a:b/c/d;p?q", "e");             // http://a:b/c/e
+    test("http://a:b/c/d;p?q", "e:f/g");         // http://a:d/c/e:f/g
+    test("http://u:w@a:p/b/c/d", "e");           // http://u:w@a/b/c/e
+    test("http://u:w@a:p/b/c/d", "/e");          // http://u:w@a/e
+    test("", "g:h");                             // g:h
+    test("http://a/b/c/d;p?q", "g:h");           // http://a/b/c/g:h
 
     /* From https://tools.ietf.org/html/rfc3986#section-5.4 */
-    test("http://a/b/c/d;p?q", "g:h");           // g:h
+    //test("http://a/b/c/d;p?q", "g:h");           // g:h
     test("http://a/b/c/d;p?q", "g");             // http://a/b/c/g
     test("http://a/b/c/d;p?q", "./g");           // http://a/b/c/g
     test("http://a/b/c/d;p?q", "g/");            // http://a/b/c/g/
diff --git a/libavformat/url.c b/libavformat/url.c
index d5dd6a4666..abcd3d2366 100644
--- a/libavformat/url.c
+++ b/libavformat/url.c
@@ -100,7 +100,13 @@ int ff_url_decompose(URLComponents *uc, const char *url, const char *end)
     /* scheme */
     uc->scheme = cur;
     p = find_delim(":/?#", cur, end); /* lavf "schemes" can contain options but not some RFC 3986 delimiters */
-    if (*p == ':')
+    /* A colon can indicate a separator for the scheme
+       (https://host/), or the userinfo (user:pass@host/), or
+       the host/port (host:port). It can also be valid within the
+       path. To distinguish the scheme, require it to be followed
+       by a slash to indicate the scheme.
+     */
+    if (*p == ':' && (p[1] == '/' || p[1] == '\\' || p[1] == '.'))
         cur = p + 1;
 
     /* authority */
diff --git a/tests/ref/fate/url b/tests/ref/fate/url
index 8489d10968..229f9815f5 100644
--- a/tests/ref/fate/url
+++ b/tests/ref/fate/url
@@ -99,7 +99,12 @@ Testing ff_make_absolute_url:
                                         http://a/b //srv/shr/file       => http://srv/shr/file
                                         http://a/b d:\file              => d:\file
                                         http://a/b C:/file              => C:/file
-                                http://a/b/c/d;p?q g:h                  => g:h
+                                http://a:b/c/d;p?q e                    => http://a:b/c/e
+                                http://a:b/c/d;p?q e:f/g                => http://a:b/c/e:f/g
+                              http://u:w@a:p/b/c/d e                    => http://u:w@a:p/b/c/e
+                              http://u:w@a:p/b/c/d /e                   => http://u:w@a:p/e
+                                                   g:h                  => g:h
+                                http://a/b/c/d;p?q g:h                  => http://a/b/c/g:h
                                 http://a/b/c/d;p?q g                    => http://a/b/c/g
                                 http://a/b/c/d;p?q ./g                  => http://a/b/c/g
                                 http://a/b/c/d;p?q g/                   => http://a/b/c/g/
-- 
2.43.0
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2025-05-21 20:04 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-05-20 15:27 [FFmpeg-devel] [PATCH] Accept a colon in the path of a URI, instead of stripping preceding characters Timothy Allen via ffmpeg-devel
2025-05-20 19:49 ` Marton Balint
2025-05-20 20:03 ` softworkz .
2025-05-21  7:28   ` Timothy Allen via ffmpeg-devel
2025-05-21 18:56     ` softworkz .
2025-05-21 19:09       ` Timothy Allen via ffmpeg-devel
2025-05-21 19:25         ` softworkz .
2025-05-21 20:04           ` Timothy Allen via ffmpeg-devel
2025-05-21 19:14       ` [FFmpeg-devel] Posting correctly (was: Accept a colon in the path of a URI, instead of stripping preceding characters.) Nicolas George
  -- strict thread matches above, loose matches on Subject: below --
2025-05-20 15:27 [FFmpeg-devel] [PATCH] Accept a colon in the path of a URI, instead of stripping preceding characters Timothy Allen via ffmpeg-devel

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git