RFC 3986 states that the generic syntax uses the slash ("/"), question mark
("?"), and number sign ("#") characters to delimit components that are
significant to the generic parser's hierarchical interpretation of an
identifier.
Signed-off-by: Marton Balint <cus@passwd.hu>
tags/n4.3
| @@ -75,6 +75,7 @@ int main(void) | |||||
| test2("https://1l-lh.a.net/i/1LIVE_HDS@179577/master.m3u8"); | test2("https://1l-lh.a.net/i/1LIVE_HDS@179577/master.m3u8"); | ||||
| test2("ftp://u:p%2B%2F2@ftp.pbt.com/ExportHD.mpg"); | test2("ftp://u:p%2B%2F2@ftp.pbt.com/ExportHD.mpg"); | ||||
| test2("https://key.dns.com?key_id=2&model_id=12345&&access_key="); | test2("https://key.dns.com?key_id=2&model_id=12345&&access_key="); | ||||
| test2("http://example.com#tag"); | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -4786,7 +4786,7 @@ void av_url_split(char *proto, int proto_size, | |||||
| char *hostname, int hostname_size, | char *hostname, int hostname_size, | ||||
| int *port_ptr, char *path, int path_size, const char *url) | int *port_ptr, char *path, int path_size, const char *url) | ||||
| { | { | ||||
| const char *p, *ls, *ls2, *at, *at2, *col, *brk; | |||||
| const char *p, *ls, *at, *at2, *col, *brk; | |||||
| if (port_ptr) | if (port_ptr) | ||||
| *port_ptr = -1; | *port_ptr = -1; | ||||
| @@ -4814,16 +4814,8 @@ void av_url_split(char *proto, int proto_size, | |||||
| } | } | ||||
| /* separate path from hostname */ | /* separate path from hostname */ | ||||
| ls = strchr(p, '/'); | |||||
| ls2 = strchr(p, '?'); | |||||
| if (!ls) | |||||
| ls = ls2; | |||||
| else if (ls && ls2) | |||||
| ls = FFMIN(ls, ls2); | |||||
| if (ls) | |||||
| av_strlcpy(path, ls, path_size); | |||||
| else | |||||
| ls = &p[strlen(p)]; // XXX | |||||
| ls = p + strcspn(p, "/?#"); | |||||
| av_strlcpy(path, ls, path_size); | |||||
| /* the rest is hostname, use that to parse auth/port */ | /* the rest is hostname, use that to parse auth/port */ | ||||
| if (ls != p) { | if (ls != p) { | ||||
| @@ -22,3 +22,4 @@ http://server/foo/bar?param=value/with/slashes => http | |||||
| https://1l-lh.a.net/i/1LIVE_HDS@179577/master.m3u8 => https 1l-lh.a.net -1 /i/1LIVE_HDS@179577/master.m3u8 | https://1l-lh.a.net/i/1LIVE_HDS@179577/master.m3u8 => https 1l-lh.a.net -1 /i/1LIVE_HDS@179577/master.m3u8 | ||||
| ftp://u:p%2B%2F2@ftp.pbt.com/ExportHD.mpg => ftp u:p%2B%2F2 ftp.pbt.com -1 /ExportHD.mpg | ftp://u:p%2B%2F2@ftp.pbt.com/ExportHD.mpg => ftp u:p%2B%2F2 ftp.pbt.com -1 /ExportHD.mpg | ||||
| https://key.dns.com?key_id=2&model_id=12345&&access_key= => https key.dns.com -1 ?key_id=2&model_id=12345&&access_key= | https://key.dns.com?key_id=2&model_id=12345&&access_key= => https key.dns.com -1 ?key_id=2&model_id=12345&&access_key= | ||||
| http://example.com#tag => http example.com -1 #tag | |||||