changeset 20784:720206eef78b

Support URL redirections that do not specify full URL. Fixes crash with mplayer -playlist http://www.radioseven.se/radioseven.pls.
author reimar
date Wed, 08 Nov 2006 22:42:31 +0000
parents dc1a1ff6c7d9
children 19228d182bc4
files stream/http.c stream/url.c stream/url.h
diffstat 3 files changed, 21 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/stream/http.c	Wed Nov 08 22:21:50 2006 +0000
+++ b/stream/http.c	Wed Nov 08 22:42:31 2006 +0000
@@ -835,8 +835,7 @@
 				next_url = http_get_field( http_hdr, "Location" );
 				if( next_url!=NULL ) {
 					closesocket( fd );
-					url_free( url );
-					stream->streaming_ctrl->url = url = url_new( next_url );
+					stream->streaming_ctrl->url = url_redirect( &url, next_url );
 					http_free( http_hdr );
 					redirect = 1;	
 				}
--- a/stream/url.c	Wed Nov 08 22:21:50 2006 +0000
+++ b/stream/url.c	Wed Nov 08 22:42:31 2006 +0000
@@ -19,6 +19,25 @@
 #define SIZE_MAX ((size_t)-1)
 #endif
 
+URL_t *url_redirect(URL_t **url, const char *redir) {
+  URL_t *u = *url;
+  URL_t *res;
+  if (!strchr(redir, '/')) {
+    char *tmp;
+    char *newurl = malloc(strlen(u->url) + strlen(redir) + 1);
+    strcpy(newurl, u->url);
+    tmp = strrchr(newurl, '/');
+    if (tmp) tmp[1] = 0;
+    strcat(newurl, redir);
+    res = url_new(newurl);
+    free(newurl);
+  } else
+    res = url_new(redir);
+  url_free(u);
+  *url = res;
+  return res;
+}
+
 URL_t*
 url_new(const char* url) {
 	int pos1, pos2,v6addr = 0;
--- a/stream/url.h	Wed Nov 08 22:21:50 2006 +0000
+++ b/stream/url.h	Wed Nov 08 22:42:31 2006 +0000
@@ -19,6 +19,7 @@
 	char *password;
 } URL_t;
 
+URL_t *url_redirect(URL_t **url, const char *redir);
 URL_t* url_new(const char* url);
 void   url_free(URL_t* url);