X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faccess%2Fhttp.c;h=32defac17d74f7581a483e8f8cc5214020e227bd;hb=d8fc0a94ed76c7f4d9e441b28010d997ab9890eb;hp=27f9b764e2c2aba8ce9f8f27c6888fcefb3cb80b;hpb=88d7f4a3998ea615c4864cebb633f458f9968dff;p=vlc diff --git a/modules/access/http.c b/modules/access/http.c index 27f9b764e2..32defac17d 100644 --- a/modules/access/http.c +++ b/modules/access/http.c @@ -26,11 +26,8 @@ /***************************************************************************** * Preamble *****************************************************************************/ -#define _GNU_SOURCE #include -#include -#include #include @@ -91,11 +88,12 @@ vlc_module_begin(); RECONNECT_LONGTEXT, VLC_TRUE ); add_bool( "http-continuous", 0, NULL, CONTINUOUS_TEXT, CONTINUOUS_LONGTEXT, VLC_TRUE ); - add_suppressed_string("http-user"); - add_suppressed_string("http-pwd"); + add_obsolete_string("http-user"); + add_obsolete_string("http-pwd"); add_shortcut( "http" ); add_shortcut( "https" ); add_shortcut( "unsv" ); + add_shortcut( "itpc" ); /* iTunes Podcast */ set_callbacks( Open, Close ); vlc_module_end(); @@ -338,12 +336,9 @@ connect: PL_LOCK; p_input_item = p_playlist->status.p_item->p_input; - vlc_mutex_lock( &p_input_item->lock ); - free( p_input_item->psz_uri ); + input_item_SetURI( p_input_item, p_sys->psz_location ); free( p_access->psz_path ); - p_input_item->psz_uri = strdup( p_sys->psz_location ); p_access->psz_path = strdup( p_sys->psz_location ); - vlc_mutex_unlock( &p_input_item->lock ); PL_UNLOCK; pl_Release( p_access ); @@ -351,10 +346,10 @@ connect: /* Clean up current Open() run */ vlc_UrlClean( &p_sys->url ); vlc_UrlClean( &p_sys->proxy ); - if( p_sys->psz_mime ) free( p_sys->psz_mime ); - if( p_sys->psz_pragma ) free( p_sys->psz_pragma ); - if( p_sys->psz_location ) free( p_sys->psz_location ); - if( p_sys->psz_user_agent ) free( p_sys->psz_user_agent ); + free( p_sys->psz_mime ); + free( p_sys->psz_pragma ); + free( p_sys->psz_location ); + free( p_sys->psz_user_agent ); Disconnect( p_access ); free( p_sys ); @@ -405,6 +400,10 @@ connect: /* Grrrr! detect ultravox server and force NSV demuxer */ p_access->psz_demux = strdup( "nsv" ); } + else if( !strcmp( p_access->psz_access, "itpc" ) ) + { + p_access->psz_demux = strdup( "podcast" ); + } else if( p_sys->psz_mime && !strncasecmp( p_sys->psz_mime, "application/xspf+xml", 20 ) && ( memchr( " ;\t", p_sys->psz_mime[20], 4 ) != NULL ) ) @@ -420,10 +419,10 @@ connect: error: vlc_UrlClean( &p_sys->url ); vlc_UrlClean( &p_sys->proxy ); - if( p_sys->psz_mime ) free( p_sys->psz_mime ); - if( p_sys->psz_pragma ) free( p_sys->psz_pragma ); - if( p_sys->psz_location ) free( p_sys->psz_location ); - if( p_sys->psz_user_agent ) free( p_sys->psz_user_agent ); + free( p_sys->psz_mime ); + free( p_sys->psz_pragma ); + free( p_sys->psz_location ); + free( p_sys->psz_user_agent ); Disconnect( p_access ); free( p_sys ); @@ -441,15 +440,15 @@ static void Close( vlc_object_t *p_this ) vlc_UrlClean( &p_sys->url ); vlc_UrlClean( &p_sys->proxy ); - if( p_sys->psz_mime ) free( p_sys->psz_mime ); - if( p_sys->psz_pragma ) free( p_sys->psz_pragma ); - if( p_sys->psz_location ) free( p_sys->psz_location ); + free( p_sys->psz_mime ); + free( p_sys->psz_pragma ); + free( p_sys->psz_location ); - if( p_sys->psz_icy_name ) free( p_sys->psz_icy_name ); - if( p_sys->psz_icy_genre ) free( p_sys->psz_icy_genre ); - if( p_sys->psz_icy_title ) free( p_sys->psz_icy_title ); + free( p_sys->psz_icy_name ); + free( p_sys->psz_icy_genre ); + free( p_sys->psz_icy_title ); - if( p_sys->psz_user_agent ) free( p_sys->psz_user_agent ); + free( p_sys->psz_user_agent ); Disconnect( p_access ); free( p_sys ); @@ -740,11 +739,16 @@ static int Control( access_t *p_access, int i_query, va_list args ) p_meta = (vlc_meta_t*)va_arg( args, vlc_meta_t* ); if( p_sys->psz_icy_name ) - vlc_meta_SetTitle( p_meta, p_sys->psz_icy_name ); + vlc_meta_Set( p_meta, vlc_meta_Title, p_sys->psz_icy_name ); if( p_sys->psz_icy_genre ) - vlc_meta_SetGenre( p_meta, p_sys->psz_icy_genre ); + vlc_meta_Set( p_meta, vlc_meta_Genre, p_sys->psz_icy_genre ); if( p_sys->psz_icy_title ) - vlc_meta_SetNowPlaying( p_meta, p_sys->psz_icy_title ); + vlc_meta_Set( p_meta, vlc_meta_NowPlaying, p_sys->psz_icy_title ); + break; + + case ACCESS_GET_CONTENT_TYPE: + *va_arg( args, char ** ) = + p_sys->psz_mime ? strdup( p_sys->psz_mime ) : NULL; break; case ACCESS_GET_TITLE_INFO: @@ -770,13 +774,13 @@ static int Connect( access_t *p_access, int64_t i_tell ) vlc_url_t srv = p_sys->b_proxy ? p_sys->proxy : p_sys->url; /* Clean info */ - if( p_sys->psz_location ) free( p_sys->psz_location ); - if( p_sys->psz_mime ) free( p_sys->psz_mime ); - if( p_sys->psz_pragma ) free( p_sys->psz_pragma ); + free( p_sys->psz_location ); + free( p_sys->psz_mime ); + free( p_sys->psz_pragma ); - if( p_sys->psz_icy_genre ) free( p_sys->psz_icy_genre ); - if( p_sys->psz_icy_name ) free( p_sys->psz_icy_name ); - if( p_sys->psz_icy_title ) free( p_sys->psz_icy_title ); + free( p_sys->psz_icy_genre ); + free( p_sys->psz_icy_name ); + free( p_sys->psz_icy_title ); p_sys->psz_location = NULL; @@ -932,37 +936,41 @@ static int Request( access_t *p_access, int64_t i_tell ) } /* Authentication */ - if( p_sys->url.psz_username && *p_sys->url.psz_username ) + if( p_sys->url.psz_username || p_sys->url.psz_password ) { - char *buf; + char buf[strlen( p_sys->url.psz_username ?: "" ) + + strlen( p_sys->url.psz_password ?: "" ) + 2]; char *b64; - asprintf( &buf, "%s:%s", p_sys->url.psz_username, - p_sys->url.psz_password ? p_sys->url.psz_password : "" ); - + snprintf( buf, sizeof( buf ), "%s:%s", p_sys->url.psz_username ?: "", + p_sys->url.psz_password ?: "" ); b64 = vlc_b64_encode( buf ); - free( buf ); - net_Printf( VLC_OBJECT(p_access), p_sys->fd, pvs, - "Authorization: Basic %s\r\n", b64 ); - free( b64 ); + if( b64 != NULL ) + { + net_Printf( VLC_OBJECT(p_access), p_sys->fd, pvs, + "Authorization: Basic %s\r\n", b64 ); + free( b64 ); + } } /* Proxy Authentication */ - if( p_sys->proxy.psz_username && *p_sys->proxy.psz_username ) + if( p_sys->proxy.psz_username || p_sys->proxy.psz_password ) { - char *buf; + char buf[strlen( p_sys->proxy.psz_username ?: "" ) + + strlen( p_sys->proxy.psz_password ?: "" )]; char *b64; - asprintf( &buf, "%s:%s", p_sys->proxy.psz_username, - p_sys->proxy.psz_password ? p_sys->proxy.psz_password : "" ); - + snprintf( buf, sizeof( buf ), "%s:%s", p_sys->proxy.psz_username ?: "", + p_sys->proxy.psz_password ?: "" ); b64 = vlc_b64_encode( buf ); - free( buf ); - net_Printf( VLC_OBJECT(p_access), p_sys->fd, pvs, - "Proxy-Authorization: Basic %s\r\n", b64 ); - free( b64 ); + if( b64 != NULL) + { + net_Printf( VLC_OBJECT(p_access), p_sys->fd, pvs, + "Proxy-Authorization: Basic %s\r\n", b64 ); + free( b64 ); + } } /* ICY meta data request */ @@ -1016,7 +1024,7 @@ static int Request( access_t *p_access, int64_t i_tell ) { p_sys->b_seekable = VLC_FALSE; } - if( p_sys->i_code != 206 ) + if( p_sys->i_code != 206 && p_sys->i_code != 401 ) { p_sys->b_seekable = VLC_FALSE; } @@ -1067,7 +1075,7 @@ static int Request( access_t *p_access, int64_t i_tell ) if( p_sys->b_continuous ) { p_access->info.i_size = -1; - msg_Dbg( p_access, "this frame size="I64Fd, atoll(p ) ); + msg_Dbg( p_access, "this frame size=%lld", atoll(p ) ); p_sys->i_remaining = atoll( p ); } else @@ -1086,8 +1094,16 @@ static int Request( access_t *p_access, int64_t i_tell ) { const char *psz_http_ext = p_sys->b_ssl ? "s" : "" ; - asprintf(&psz_new_loc, "http%s://%s:%d%s", psz_http_ext, - p_sys->url.psz_host, p_sys->url.i_port, p); + if( p_sys->url.i_port == ( p_sys->b_ssl ? 443 : 80 ) ) + { + asprintf(&psz_new_loc, "http%s://%s%s", psz_http_ext, + p_sys->url.psz_host, p); + } + else + { + asprintf(&psz_new_loc, "http%s://%s:%d%s", psz_http_ext, + p_sys->url.psz_host, p_sys->url.i_port, p); + } } else {