# HG changeset patch # User reimar # Date 1163025751 0 # Node ID 720206eef78b8df31c016c1864e563921564252c # Parent dc1a1ff6c7d9f5be58d04fac5e1dd46125bb8713 Support URL redirections that do not specify full URL. Fixes crash with mplayer -playlist http://www.radioseven.se/radioseven.pls. diff -r dc1a1ff6c7d9 -r 720206eef78b stream/http.c --- 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; } diff -r dc1a1ff6c7d9 -r 720206eef78b stream/url.c --- 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; diff -r dc1a1ff6c7d9 -r 720206eef78b stream/url.h --- 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);