summaryrefslogtreecommitdiff
path: root/libavformat/utils.c
diff options
context:
space:
mode:
authorDuncan Salerno <duncan.salerno@gmail.com>2012-09-25 19:19:32 +0100
committerMichael Niedermayer <michaelni@gmx.at>2012-09-26 03:43:06 +0200
commit4b80a619b7db37157d98f6e5a57ddf53c9132551 (patch)
tree7fdab749cb5648deeb7e4888f66d2e569c3ab20d /libavformat/utils.c
parentf75c5f07a975d1809bf28b330ffd1d3dd430c96a (diff)
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>
Diffstat (limited to 'libavformat/utils.c')
-rw-r--r--libavformat/utils.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/libavformat/utils.c b/libavformat/utils.c
index e5826c1181..d2d57f1bfa 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)