changeset 35113:06847bdbe4bc

Fix redirection for proxy URLs. Should fix bug #2091.
author reimar
date Fri, 21 Sep 2012 18:57:00 +0000
parents af90ec7b692b
children bec9e755fb9b
files stream/http.c stream/url.c stream/url.h
diffstat 3 files changed, 55 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- 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;
--- 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;
--- 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);