avformat/url: add ff_make_absolulte_url2 to be able to test windows path cases
Signed-off-by: Marton Balint <cus@passwd.hu> (cherry picked from commit fb4da90fecdefa2508618ca835cd0250be940e04)
This commit is contained in:
		
							parent
							
								
									51de6103e9
								
							
						
					
					
						commit
						31d249a418
					
				@ -18,6 +18,7 @@
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "config.h"
 | 
			
		||||
#include "libavformat/url.h"
 | 
			
		||||
#include "libavformat/avformat.h"
 | 
			
		||||
 | 
			
		||||
@ -48,19 +49,30 @@ static void test_decompose(const char *url)
 | 
			
		||||
 | 
			
		||||
static void test(const char *base, const char *rel)
 | 
			
		||||
{
 | 
			
		||||
    char buf[200], buf2[200];
 | 
			
		||||
    char buf[200], buf2[200], buf_dos[200], buf_native[200];
 | 
			
		||||
    int ret;
 | 
			
		||||
 | 
			
		||||
    ret = ff_make_absolute_url(buf, sizeof(buf), base, rel);
 | 
			
		||||
    ret = ff_make_absolute_url2(buf, sizeof(buf), base, rel, 0);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        printf("%50s %-20s => error %s\n", base, rel, av_err2str(ret));
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    printf("%50s %-20s => %s\n", base, rel, buf);
 | 
			
		||||
    ret = ff_make_absolute_url2(buf_dos, sizeof(buf_dos), base, rel, 1);
 | 
			
		||||
    if (ret < 0)
 | 
			
		||||
        snprintf(buf_dos, sizeof(buf_dos), "error %s", av_err2str(ret));
 | 
			
		||||
    ret = ff_make_absolute_url(buf_native, sizeof(buf_native), base, rel);
 | 
			
		||||
    if (ret < 0)
 | 
			
		||||
        snprintf(buf_native, sizeof(buf_native), "error %s", av_err2str(ret));
 | 
			
		||||
    if (strcmp(buf, buf_dos))
 | 
			
		||||
        printf("%50s %-20sDOS %s\n", base, rel, buf_dos);
 | 
			
		||||
    if (HAVE_DOS_PATHS && strcmp(buf_dos, buf_native) ||
 | 
			
		||||
        !HAVE_DOS_PATHS && strcmp(buf, buf_native))
 | 
			
		||||
        printf("Native mismatch\n");
 | 
			
		||||
    if (base) {
 | 
			
		||||
        /* Test in-buffer replacement */
 | 
			
		||||
        snprintf(buf2, sizeof(buf2), "%s", base);
 | 
			
		||||
        ff_make_absolute_url(buf2, sizeof(buf2), buf2, rel);
 | 
			
		||||
        ff_make_absolute_url2(buf2, sizeof(buf2), buf2, rel, 0);
 | 
			
		||||
        if (strcmp(buf, buf2)) {
 | 
			
		||||
            printf("In-place handling of %s + %s failed\n", base, rel);
 | 
			
		||||
            exit(1);
 | 
			
		||||
@ -121,6 +133,21 @@ int main(void)
 | 
			
		||||
    test("http://server/foo/bar", "..doubledotfile");
 | 
			
		||||
    test("http://server/foo/bar", "double..dotfile");
 | 
			
		||||
    test("http://server/foo/bar", "doubledotfile..");
 | 
			
		||||
    test("file1", "file2");
 | 
			
		||||
    test("dir/file1", "file2");
 | 
			
		||||
    test("dir/file1", "../file2");
 | 
			
		||||
    test("dir\\file1", "file2");
 | 
			
		||||
    test("\\\\srv\\shr\\file", "..\\..\\dummy");
 | 
			
		||||
    test("\\\\srv\\shr\\file", "dummy");
 | 
			
		||||
    test("\\\\srv\\shr\\file", "\\\\srv2\\shr2\\file2");
 | 
			
		||||
    test("\\\\srv\\shr\\file", "d:/file");
 | 
			
		||||
    test("C:\\dir\\a", "..\\file");
 | 
			
		||||
    test("C:\\dir\\a", "\\\\srv\\shr\\file");
 | 
			
		||||
    test("C:\\dir\\a", "d:\\file");
 | 
			
		||||
    test("http://a/b", "\\\\srv\\shr\\file");
 | 
			
		||||
    test("http://a/b", "//srv/shr/file");
 | 
			
		||||
    test("http://a/b", "d:\\file");
 | 
			
		||||
    test("http://a/b", "C:/file");
 | 
			
		||||
 | 
			
		||||
    /* From https://tools.ietf.org/html/rfc3986#section-5.4 */
 | 
			
		||||
    test("http://a/b/c/d;p?q", "g:h");           // g:h
 | 
			
		||||
 | 
			
		||||
@ -190,8 +190,8 @@ static int append_path(char *root, char *out_end, char **rout,
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int ff_make_absolute_url(char *buf, int size, const char *base,
 | 
			
		||||
                          const char *rel)
 | 
			
		||||
int ff_make_absolute_url2(char *buf, int size, const char *base,
 | 
			
		||||
                          const char *rel, int handle_dos_paths)
 | 
			
		||||
{
 | 
			
		||||
    URLComponents ub, uc;
 | 
			
		||||
    char *out, *out_end, *path;
 | 
			
		||||
@ -224,7 +224,7 @@ int ff_make_absolute_url(char *buf, int size, const char *base,
 | 
			
		||||
 | 
			
		||||
    if (!base)
 | 
			
		||||
        base = "";
 | 
			
		||||
    if (HAVE_DOS_PATHS) {
 | 
			
		||||
    if (handle_dos_paths) {
 | 
			
		||||
        if ((ret = ff_url_decompose(&ub, base, NULL)) < 0)
 | 
			
		||||
            goto error;
 | 
			
		||||
        if (is_fq_dos_path(base) || av_strstart(base, "file:", NULL) || ub.path == ub.url) {
 | 
			
		||||
@ -316,6 +316,12 @@ error:
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int ff_make_absolute_url(char *buf, int size, const char *base,
 | 
			
		||||
                         const char *rel)
 | 
			
		||||
{
 | 
			
		||||
    return ff_make_absolute_url2(buf, size, base, rel, HAVE_DOS_PATHS);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
AVIODirEntry *ff_alloc_dir_entry(void)
 | 
			
		||||
{
 | 
			
		||||
    AVIODirEntry *entry = av_mallocz(sizeof(AVIODirEntry));
 | 
			
		||||
 | 
			
		||||
@ -311,6 +311,16 @@ int ff_url_join(char *str, int size, const char *proto,
 | 
			
		||||
 * @param size the size of buf
 | 
			
		||||
 * @param base the base url, may be equal to buf.
 | 
			
		||||
 * @param rel the new url, which is interpreted relative to base
 | 
			
		||||
 * @param handle_dos_paths handle DOS paths for file or unspecified protocol
 | 
			
		||||
 */
 | 
			
		||||
int ff_make_absolute_url2(char *buf, int size, const char *base,
 | 
			
		||||
                         const char *rel, int handle_dos_paths);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Convert a relative url into an absolute url, given a base url.
 | 
			
		||||
 *
 | 
			
		||||
 * Same as ff_make_absolute_url2 with handle_dos_paths being equal to
 | 
			
		||||
 * HAVE_DOS_PATHS config variable.
 | 
			
		||||
 */
 | 
			
		||||
int ff_make_absolute_url(char *buf, int size, const char *base,
 | 
			
		||||
                         const char *rel);
 | 
			
		||||
 | 
			
		||||
@ -79,6 +79,26 @@ Testing ff_make_absolute_url:
 | 
			
		||||
                             http://server/foo/bar ..doubledotfile      => http://server/foo/..doubledotfile
 | 
			
		||||
                             http://server/foo/bar double..dotfile      => http://server/foo/double..dotfile
 | 
			
		||||
                             http://server/foo/bar doubledotfile..      => http://server/foo/doubledotfile..
 | 
			
		||||
                                             file1 file2                => file2
 | 
			
		||||
                                         dir/file1 file2                => dir/file2
 | 
			
		||||
                                         dir/file1 ../file2             => dir/../file2
 | 
			
		||||
                                         dir\file1 file2                => file2
 | 
			
		||||
                                         dir\file1 file2               DOS dir\file2
 | 
			
		||||
                                    \\srv\shr\file ..\..\dummy          => ..\..\dummy
 | 
			
		||||
                                    \\srv\shr\file ..\..\dummy         DOS \\srv\shr\..\..\dummy
 | 
			
		||||
                                    \\srv\shr\file dummy                => dummy
 | 
			
		||||
                                    \\srv\shr\file dummy               DOS \\srv\shr\dummy
 | 
			
		||||
                                    \\srv\shr\file \\srv2\shr2\file2    => \\srv2\shr2\file2
 | 
			
		||||
                                    \\srv\shr\file d:/file              => d:/file
 | 
			
		||||
                                          C:\dir\a ..\file              => C:..\file
 | 
			
		||||
                                          C:\dir\a ..\file             DOS C:\dir\..\file
 | 
			
		||||
                                          C:\dir\a \\srv\shr\file       => C:\\srv\shr\file
 | 
			
		||||
                                          C:\dir\a \\srv\shr\file      DOS \\srv\shr\file
 | 
			
		||||
                                          C:\dir\a d:\file              => d:\file
 | 
			
		||||
                                        http://a/b \\srv\shr\file       => http://a/\\srv\shr\file
 | 
			
		||||
                                        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 g                    => http://a/b/c/g
 | 
			
		||||
                                http://a/b/c/d;p?q ./g                  => http://a/b/c/g
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user