X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faccess%2Fhttp.c;h=ba0c33d13020608d5b99b8833b28f8543f2e2fdf;hb=3478c353410e423c60b477b39aff8a2be0c2b802;hp=c78d5647e1412732435586530da0fddca7c444e2;hpb=1090a5b5d7f41de535708062dea6c8058fc76328;p=vlc diff --git a/modules/access/http.c b/modules/access/http.c index c78d5647e1..ba0c33d130 100644 --- a/modules/access/http.c +++ b/modules/access/http.c @@ -31,6 +31,7 @@ #include #include +#include "vlc_interaction.h" #include "vlc_playlist.h" #include "vlc_meta.h" #include "network.h" @@ -62,13 +63,15 @@ static void Close( vlc_object_t * ); "in case it was untimely closed.") #define CONTINUOUS_TEXT N_("Continuous stream") -#define CONTINUOUS_LONGTEXT N_("Enable this option to read a file that is " \ - "being constantly updated (for example, a JPG file on a server)") +#define CONTINUOUS_LONGTEXT N_("This allows you to read a file that is " \ + "being constantly updated (for example, a JPG file on a server)." \ + "You should not globally enable this option as it will break all other " \ + "types of HTTP streams." ) vlc_module_begin(); set_description( _("HTTP input") ); set_capability( "access2", 0 ); - set_shortname( _( "HTTP/HTTPS" ) ); + set_shortname( _( "HTTP(S)" ) ); set_category( CAT_INPUT ); set_subcategory( SUBCAT_INPUT_ACCESS ); @@ -77,15 +80,14 @@ vlc_module_begin(); add_integer( "http-caching", 4 * DEFAULT_PTS_DELAY / 1000, NULL, CACHING_TEXT, CACHING_LONGTEXT, VLC_TRUE ); add_string( "http-user-agent", COPYRIGHT_MESSAGE , NULL, AGENT_TEXT, - AGENT_LONGTEXT, VLC_FALSE ); + AGENT_LONGTEXT, VLC_TRUE ); add_bool( "http-reconnect", 0, NULL, RECONNECT_TEXT, 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_shortcut( "http" ); - add_shortcut( "http4" ); - add_shortcut( "http6" ); add_shortcut( "https" ); add_shortcut( "unsv" ); set_callbacks( Open, Close ); @@ -153,33 +155,7 @@ static int Open( vlc_object_t *p_this ) { access_t *p_access = (access_t*)p_this; access_sys_t *p_sys; - char *psz; - - /* First set ipv4/ipv6 */ - var_Create( p_access, "ipv4", VLC_VAR_BOOL | VLC_VAR_DOINHERIT ); - var_Create( p_access, "ipv6", VLC_VAR_BOOL | VLC_VAR_DOINHERIT ); - - if( *p_access->psz_access ) - { - vlc_value_t val; - /* Find out which shortcut was used */ - if( !strncmp( p_access->psz_access, "http4", 6 ) ) - { - val.b_bool = VLC_TRUE; - var_Set( p_access, "ipv4", val ); - - val.b_bool = VLC_FALSE; - var_Set( p_access, "ipv6", val ); - } - else if( !strncmp( p_access->psz_access, "http6", 6 ) ) - { - val.b_bool = VLC_TRUE; - var_Set( p_access, "ipv6", val ); - - val.b_bool = VLC_FALSE; - var_Set( p_access, "ipv4", val ); - } - } + char *psz, *p; /* Set up p_access */ p_access->pf_read = Read; @@ -214,21 +190,13 @@ static int Open( vlc_object_t *p_this ) p_sys->psz_icy_title = NULL; p_sys->i_remaining = 0; - /* Parse URI */ - if( vlc_UrlIsNotEncoded( p_access->psz_path ) ) - { - psz = vlc_UrlEncode( p_access->psz_path ); - if( psz == NULL ) - { - free( p_sys ); - return VLC_ENOMEM; - } - vlc_UrlParse( &p_sys->url, psz, 0 ); - free( psz ); - } - else - vlc_UrlParse( &p_sys->url, p_access->psz_path, 0 ); + /* Parse URI - remove spaces */ + p = psz = strdup( p_access->psz_path ); + while( (p = strchr( p, ' ' )) != NULL ) + *p = '+'; + vlc_UrlParse( &p_sys->url, psz, 0 ); + free( psz ); if( p_sys->url.psz_host == NULL || *p_sys->url.psz_host == '\0' ) { @@ -300,6 +268,7 @@ static int Open( vlc_object_t *p_this ) p_sys->b_reconnect = var_CreateGetBool( p_access, "http-reconnect" ); p_sys->b_continuous = var_CreateGetBool( p_access, "http-continuous" ); +connect: /* Connect */ if( Connect( p_access, 0 ) ) { @@ -313,6 +282,31 @@ static int Open( vlc_object_t *p_this ) } } + if( p_sys->i_code == 401 ) + { + char *psz_login = NULL; char *psz_password = NULL; + int i_ret; + msg_Dbg( p_access, "Authentication failed" ); + i_ret = intf_UserLoginPassword( p_access, "HTTP authentication", + "Please enter a valid login and password.", &psz_login, &psz_password ); + if( i_ret == DIALOG_OK_YES ) + { + msg_Dbg( p_access, "retrying with user=%s, pwd=%s", + psz_login, psz_password ); + if( psz_login ) p_sys->url.psz_username = strdup( psz_login ); + if( psz_password ) p_sys->url.psz_password = strdup( psz_password ); + if( psz_login ) free( psz_login ); + if( psz_password ) free( psz_password ); + goto connect; + } + else + { + if( psz_login ) free( psz_login ); + if( psz_password ) free( psz_password ); + goto error; + } + } + if( ( p_sys->i_code == 301 || p_sys->i_code == 302 || p_sys->i_code == 303 || p_sys->i_code == 307 ) && p_sys->psz_location && *p_sys->psz_location ) @@ -322,6 +316,15 @@ static int Open( vlc_object_t *p_this ) msg_Dbg( p_access, "redirection to %s", p_sys->psz_location ); + /* Do not accept redirection outside of HTTP works */ + if( strncmp( p_sys->psz_location, "http", 4 ) + || ( ( p_sys->psz_location[4] != ':' ) /* HTTP */ + && strncmp( p_sys->psz_location + 4, "s:", 2 ) /* HTTP/SSL */ ) ) + { + msg_Err( p_access, "insecure redirection ignored" ); + goto error; + } + p_playlist = vlc_object_find( p_access, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( !p_playlist ) @@ -605,11 +608,13 @@ static int ReadICYMeta( access_t *p_access ) /* Read meta data length */ i_read = net_Read( p_access, p_sys->fd, p_sys->p_vs, &buffer, 1, VLC_TRUE ); - if( ( i_read <= 0 ) || ( buffer == 0 ) ) + if( i_read <= 0 ) return VLC_EGENERIC; + if( buffer == 0 ) + return VLC_SUCCESS; i_read = buffer << 4; - msg_Dbg( p_access, "ICY meta size=%u", i_read); + /* msg_Dbg( p_access, "ICY meta size=%u", i_read); */ psz_meta = malloc( i_read + 1 ); if( net_Read( p_access, p_sys->fd, p_sys->p_vs, @@ -618,7 +623,7 @@ static int ReadICYMeta( access_t *p_access ) psz_meta[i_read] = '\0'; /* Just in case */ - msg_Dbg( p_access, "icy-meta=%s", psz_meta ); + /* msg_Dbg( p_access, "icy-meta=%s", psz_meta ); */ /* Now parse the meta */ /* Look for StreamTitle= */ @@ -640,17 +645,19 @@ static int ReadICYMeta( access_t *p_access ) if( psz ) *psz = '\0'; } - if( p_sys->psz_icy_title ) free( p_sys->psz_icy_title ); - - p_sys->psz_icy_title = strdup( &p[1] ); + if( !p_sys->psz_icy_title || + strcmp( p_sys->psz_icy_title, &p[1] ) ) + { + if( p_sys->psz_icy_title ) + free( p_sys->psz_icy_title ); + p_sys->psz_icy_title = strdup( &p[1] ); + p_access->info.i_update |= INPUT_UPDATE_META; - p_access->info.i_update |= INPUT_UPDATE_META; + msg_Dbg( p_access, "New Title=%s", p_sys->psz_icy_title ); + } } - free( psz_meta ); - msg_Dbg( p_access, "New Title=%s", p_sys->psz_icy_title ); - return VLC_SUCCESS; } @@ -723,8 +730,7 @@ static int Control( access_t *p_access, int i_query, va_list args ) case ACCESS_GET_META: pp_meta = (vlc_meta_t**)va_arg( args, vlc_meta_t** ); *pp_meta = vlc_meta_New(); - msg_Dbg( p_access, "GET META %s %s %s", - p_sys->psz_icy_name, p_sys->psz_icy_genre, p_sys->psz_icy_title ); + if( p_sys->psz_icy_name ) vlc_meta_Add( *pp_meta, VLC_META_TITLE, p_sys->psz_icy_name ); @@ -785,7 +791,7 @@ static int Connect( access_t *p_access, int64_t i_tell ) /* Open connection */ - p_sys->fd = net_OpenTCP( p_access, srv.psz_host, srv.i_port ); + p_sys->fd = net_ConnectTCP( p_access, srv.psz_host, srv.i_port ); if( p_sys->fd < 0 ) { msg_Err( p_access, "cannot connect to %s:%d", srv.psz_host, srv.i_port ); @@ -874,7 +880,6 @@ static int Request( access_t *p_access, int64_t i_tell ) if( p_sys->b_proxy ) { - /* FIXME: support SSL proxies */ if( p_sys->url.psz_path ) { net_Printf( VLC_OBJECT(p_access), p_sys->fd, NULL, @@ -1011,7 +1016,13 @@ static int Request( access_t *p_access, int64_t i_tell ) { p_sys->b_seekable = VLC_FALSE; } - if( p_sys->i_code >= 400 ) + /* Authentication error - We'll have to display the dialog */ + if( p_sys->i_code == 401 ) + { + + } + /* Other fatal error */ + else if( p_sys->i_code >= 400 ) { msg_Err( p_access, "error: %s", psz ); free( psz );