# HG changeset patch # User reimar # Date 1348253820 0 # Node ID 06847bdbe4bc0c24b93873959f02a6913ea256c6 # Parent af90ec7b692bf0d5e03bf78fb02d4ffe0242ca04 Fix redirection for proxy URLs. Should fix bug #2091. diff -r af90ec7b692b -r 06847bdbe4bc stream/http.c --- a/stream/http.c Fri Sep 21 07:55:55 2012 +0000 +++ b/stream/http.c Fri Sep 21 18:57:00 2012 +0000 @@ -826,18 +826,16 @@ 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; diff -r af90ec7b692b -r 06847bdbe4bc stream/url.c --- a/stream/url.c Fri Sep 21 07:55:55 2012 +0000 +++ b/stream/url.c Fri Sep 21 18:57:00 2012 +0000 @@ -35,25 +35,65 @@ #define SIZE_MAX ((size_t)-1) #endif +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; diff -r af90ec7b692b -r 06847bdbe4bc stream/url.h --- a/stream/url.h Fri Sep 21 07:55:55 2012 +0000 +++ b/stream/url.h Fri Sep 21 18:57:00 2012 +0000 @@ -36,6 +36,8 @@ 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);