mirror of
https://github.com/mpv-player/mpv
synced 2024-11-03 03:19:24 +01:00
stream: fix redirection for proxy URLs
Fix redirection for proxy URLs. Should fix bug #2091. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@35207 b3059339-0415-0410-9bf9-f77b7e298cf2 Conflicts: stream/url.c
This commit is contained in:
parent
5a6dde54af
commit
82d47895e4
@ -829,18 +829,16 @@ static int http_streaming_start(stream_t *stream, int* file_format) {
|
||||
if( next_url!=NULL ) {
|
||||
int is_ultravox = strcasecmp(stream->streaming_ctrl->url->protocol, "unsv") == 0;
|
||||
stream->streaming_ctrl->url = url_redirect( &url, next_url );
|
||||
if (!strcasecmp(url->protocol, "mms")) {
|
||||
if (url_is_protocol(url, "mms")) {
|
||||
res = STREAM_REDIRECTED;
|
||||
goto err_out;
|
||||
}
|
||||
if (strcasecmp(url->protocol, "http")) {
|
||||
if (!url_is_protocol(url, "http")) {
|
||||
mp_msg(MSGT_NETWORK,MSGL_ERR,"Unsupported http %d redirect to %s protocol\n", http_hdr->status_code, url->protocol);
|
||||
goto err_out;
|
||||
}
|
||||
if (is_ultravox) {
|
||||
free(url->protocol);
|
||||
url->protocol = strdup("unsv");
|
||||
}
|
||||
if (is_ultravox)
|
||||
url_set_protocol(url, "unsv");
|
||||
redirect = 1;
|
||||
}
|
||||
break;
|
||||
|
58
stream/url.c
58
stream/url.c
@ -60,25 +60,65 @@ end:
|
||||
return p;
|
||||
}
|
||||
|
||||
static int is_proxy(const URL_t *url) {
|
||||
return !strcasecmp(url->protocol, "http_proxy") && url->file && strstr(url->file, "://");
|
||||
}
|
||||
|
||||
int url_is_protocol(const URL_t *url, const char *proto) {
|
||||
int proxy = is_proxy(url);
|
||||
if (proxy) {
|
||||
URL_t *tmp = url_new(url->file + 1);
|
||||
int res = !strcasecmp(tmp->protocol, proto);
|
||||
url_free(tmp);
|
||||
return res;
|
||||
}
|
||||
return !strcasecmp(url->protocol, proto);
|
||||
}
|
||||
|
||||
void url_set_protocol(URL_t *url, const char *proto) {
|
||||
int proxy = is_proxy(url);
|
||||
if (proxy) {
|
||||
char *dst = url->file + 1;
|
||||
int oldlen = strstr(dst, "://") - dst;
|
||||
int newlen = strlen(proto);
|
||||
if (newlen != oldlen) {
|
||||
mp_msg(MSGT_NETWORK, MSGL_ERR, "Setting protocol not implemented!\n");
|
||||
return;
|
||||
}
|
||||
memcpy(dst, proto, newlen);
|
||||
return;
|
||||
}
|
||||
free(url->protocol);
|
||||
url->protocol = strdup(proto);
|
||||
}
|
||||
|
||||
URL_t *url_redirect(URL_t **url, const char *redir) {
|
||||
URL_t *u = *url;
|
||||
int proxy = is_proxy(u);
|
||||
const char *oldurl = proxy ? u->file + 1 : u->url;
|
||||
const char *newurl = redir;
|
||||
char *buffer = NULL;
|
||||
URL_t *res;
|
||||
if (!strchr(redir, '/') || *redir == '/') {
|
||||
char *tmp;
|
||||
char *newurl = malloc(strlen(u->url) + strlen(redir) + 1);
|
||||
strcpy(newurl, u->url);
|
||||
newurl = buffer = malloc(strlen(oldurl) + strlen(redir) + 1);
|
||||
strcpy(buffer, oldurl);
|
||||
if (*redir == '/') {
|
||||
redir++;
|
||||
tmp = strstr(newurl, "://");
|
||||
tmp = strstr(buffer, "://");
|
||||
if (tmp) tmp = strchr(tmp + 3, '/');
|
||||
} else
|
||||
tmp = strrchr(newurl, '/');
|
||||
tmp = strrchr(buffer, '/');
|
||||
if (tmp) tmp[1] = 0;
|
||||
strcat(newurl, redir);
|
||||
res = url_new(newurl);
|
||||
free(newurl);
|
||||
} else
|
||||
res = url_new(redir);
|
||||
strcat(buffer, redir);
|
||||
}
|
||||
if (proxy) {
|
||||
char *tmp = get_http_proxy_url(u, newurl);
|
||||
free(buffer);
|
||||
newurl = buffer = tmp;
|
||||
}
|
||||
res = url_new(newurl);
|
||||
free(buffer);
|
||||
url_free(u);
|
||||
*url = res;
|
||||
return res;
|
||||
|
@ -36,6 +36,8 @@ typedef struct {
|
||||
char *password;
|
||||
} URL_t;
|
||||
|
||||
int url_is_protocol(const URL_t *url, const char *proto);
|
||||
void url_set_protocol(URL_t *url, const char *proto);
|
||||
URL_t *url_redirect(URL_t **url, const char *redir);
|
||||
|
||||
char *get_http_proxy_url(const URL_t *proxy, const char *host_url);
|
||||
|
Loading…
Reference in New Issue
Block a user