diff options
author | Duncan Salerno <duncan.salerno@gmail.com> | 2012-09-25 19:19:32 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-09-26 03:43:06 +0200 |
commit | 4b80a619b7db37157d98f6e5a57ddf53c9132551 (patch) | |
tree | 7fdab749cb5648deeb7e4888f66d2e569c3ab20d | |
parent | f75c5f07a975d1809bf28b330ffd1d3dd430c96a (diff) | |
download | ffmpeg-streaming-4b80a619b7db37157d98f6e5a57ddf53c9132551.zip ffmpeg-streaming-4b80a619b7db37157d98f6e5a57ddf53c9132551.tar.gz |
Handle the following type of relative URL correctly:
http://a/b + //c/d = http://c/d
http://a/b?c + ?d = http://a/b?d
http://a/b?c/d + /e = http://a/e
Updated with feedback from Clément Bœsch
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavformat/utils.c | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/libavformat/utils.c b/libavformat/utils.c index e5826c1..d2d57f1 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -4467,17 +4467,23 @@ int ff_find_stream_index(AVFormatContext *s, int id) void ff_make_absolute_url(char *buf, int size, const char *base, const char *rel) { - char *sep; + char *sep, *path_query; /* Absolute path, relative to the current server */ if (base && strstr(base, "://") && rel[0] == '/') { if (base != buf) av_strlcpy(buf, base, size); sep = strstr(buf, "://"); if (sep) { - sep += 3; - sep = strchr(sep, '/'); - if (sep) - *sep = '\0'; + /* Take scheme from base url */ + if (rel[1] == '/') + sep[1] = '\0'; + else { + /* Take scheme and host from base url */ + sep += 3; + sep = strchr(sep, '/'); + if (sep) + *sep = '\0'; + } } av_strlcat(buf, rel, size); return; @@ -4489,6 +4495,18 @@ void ff_make_absolute_url(char *buf, int size, const char *base, } if (base != buf) av_strlcpy(buf, base, size); + + /* Strip off any query string from base */ + path_query = strchr(buf, '?'); + if (path_query != NULL) + *path_query = '\0'; + + /* Is relative path just a new query part? */ + if (rel[0] == '?') { + av_strlcat(buf, rel, size); + return; + } + /* Remove the file name from the base url */ sep = strrchr(buf, '/'); if (sep) |