* commit 'ec7c51c7868d3ccc66b5cc38bf126258b94f086c': avf: move ff_http_match_no_proxy to network Conflicts: libavformat/internal.h libavformat/utils.c Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n2.0
| @@ -390,6 +390,4 @@ AVRational ff_choose_timebase(AVFormatContext *s, AVStream *st, int min_precissi | |||||
| */ | */ | ||||
| void ff_generate_avci_extradata(AVStream *st); | void ff_generate_avci_extradata(AVStream *st); | ||||
| int ff_http_match_no_proxy(const char *no_proxy, const char *hostname); | |||||
| #endif /* AVFORMAT_INTERNAL_H */ | #endif /* AVFORMAT_INTERNAL_H */ | ||||
| @@ -304,3 +304,57 @@ int ff_listen_connect(int fd, const struct sockaddr *addr, | |||||
| } | } | ||||
| return ret; | return ret; | ||||
| } | } | ||||
| static int match_host_pattern(const char *pattern, const char *hostname) | |||||
| { | |||||
| int len_p, len_h; | |||||
| if (!strcmp(pattern, "*")) | |||||
| return 1; | |||||
| // Skip a possible *. at the start of the pattern | |||||
| if (pattern[0] == '*') | |||||
| pattern++; | |||||
| if (pattern[0] == '.') | |||||
| pattern++; | |||||
| len_p = strlen(pattern); | |||||
| len_h = strlen(hostname); | |||||
| if (len_p > len_h) | |||||
| return 0; | |||||
| // Simply check if the end of hostname is equal to 'pattern' | |||||
| if (!strcmp(pattern, &hostname[len_h - len_p])) { | |||||
| if (len_h == len_p) | |||||
| return 1; // Exact match | |||||
| if (hostname[len_h - len_p - 1] == '.') | |||||
| return 1; // The matched substring is a domain and not just a substring of a domain | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| int ff_http_match_no_proxy(const char *no_proxy, const char *hostname) | |||||
| { | |||||
| char *buf, *start; | |||||
| int ret = 0; | |||||
| if (!no_proxy) | |||||
| return 0; | |||||
| if (!hostname) | |||||
| return 0; | |||||
| buf = av_strdup(no_proxy); | |||||
| if (!buf) | |||||
| return 0; | |||||
| start = buf; | |||||
| while (start) { | |||||
| char *sep, *next = NULL; | |||||
| start += strspn(start, " ,"); | |||||
| sep = start + strcspn(start, " ,"); | |||||
| if (*sep) { | |||||
| next = sep + 1; | |||||
| *sep = '\0'; | |||||
| } | |||||
| if (match_host_pattern(start, hostname)) { | |||||
| ret = 1; | |||||
| break; | |||||
| } | |||||
| start = next; | |||||
| } | |||||
| av_free(buf); | |||||
| return ret; | |||||
| } | |||||
| @@ -257,4 +257,6 @@ int ff_listen_connect(int fd, const struct sockaddr *addr, | |||||
| socklen_t addrlen, int timeout, | socklen_t addrlen, int timeout, | ||||
| URLContext *h); | URLContext *h); | ||||
| int ff_http_match_no_proxy(const char *no_proxy, const char *hostname); | |||||
| #endif /* AVFORMAT_NETWORK_H */ | #endif /* AVFORMAT_NETWORK_H */ | ||||
| @@ -18,7 +18,7 @@ | |||||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
| */ | */ | ||||
| #include "internal.h" | |||||
| #include "network.h" | |||||
| static void test(const char *pattern, const char *host) | static void test(const char *pattern, const char *host) | ||||
| { | { | ||||
| @@ -4331,57 +4331,3 @@ void ff_generate_avci_extradata(AVStream *st) | |||||
| memcpy(st->codec->extradata, data, size); | memcpy(st->codec->extradata, data, size); | ||||
| st->codec->extradata_size = size; | st->codec->extradata_size = size; | ||||
| } | } | ||||
| static int match_host_pattern(const char *pattern, const char *hostname) | |||||
| { | |||||
| int len_p, len_h; | |||||
| if (!strcmp(pattern, "*")) | |||||
| return 1; | |||||
| // Skip a possible *. at the start of the pattern | |||||
| if (pattern[0] == '*') | |||||
| pattern++; | |||||
| if (pattern[0] == '.') | |||||
| pattern++; | |||||
| len_p = strlen(pattern); | |||||
| len_h = strlen(hostname); | |||||
| if (len_p > len_h) | |||||
| return 0; | |||||
| // Simply check if the end of hostname is equal to 'pattern' | |||||
| if (!strcmp(pattern, &hostname[len_h - len_p])) { | |||||
| if (len_h == len_p) | |||||
| return 1; // Exact match | |||||
| if (hostname[len_h - len_p - 1] == '.') | |||||
| return 1; // The matched substring is a domain and not just a substring of a domain | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| int ff_http_match_no_proxy(const char *no_proxy, const char *hostname) | |||||
| { | |||||
| char *buf, *start; | |||||
| int ret = 0; | |||||
| if (!no_proxy) | |||||
| return 0; | |||||
| if (!hostname) | |||||
| return 0; | |||||
| buf = av_strdup(no_proxy); | |||||
| if (!buf) | |||||
| return 0; | |||||
| start = buf; | |||||
| while (start) { | |||||
| char *sep, *next = NULL; | |||||
| start += strspn(start, " ,"); | |||||
| sep = start + strcspn(start, " ,"); | |||||
| if (*sep) { | |||||
| next = sep + 1; | |||||
| *sep = '\0'; | |||||
| } | |||||
| if (match_host_pattern(start, hostname)) { | |||||
| ret = 1; | |||||
| break; | |||||
| } | |||||
| start = next; | |||||
| } | |||||
| av_free(buf); | |||||
| return ret; | |||||
| } | |||||