Commit dee99e90 authored by Gildas Bazin's avatar Gildas Bazin

* modules/access/http.c: --http-reconnect option to automatically try to...

* modules/access/http.c: --http-reconnect option to automatically try to reconnect in case the connection was untimely closed (enabled by default for ICY/Icecast web radios).
parent 99b5f19f
...@@ -62,6 +62,10 @@ static void Close( vlc_object_t * ); ...@@ -62,6 +62,10 @@ static void Close( vlc_object_t * );
#define AGENT_LONGTEXT N_("Allows you to modify the user agent that will be " \ #define AGENT_LONGTEXT N_("Allows you to modify the user agent that will be " \
"used for the connection.") "used for the connection.")
#define RECONNECT_TEXT N_("Auto re-connect")
#define RECONNECT_LONGTEXT N_("Will automatically attempt a re-connection " \
"in case it was untimely closed.")
vlc_module_begin(); vlc_module_begin();
set_description( _("HTTP input") ); set_description( _("HTTP input") );
set_capability( "access2", 0 ); set_capability( "access2", 0 );
...@@ -74,6 +78,8 @@ vlc_module_begin(); ...@@ -74,6 +78,8 @@ vlc_module_begin();
add_string( "http-pwd", NULL , NULL, PASS_TEXT, PASS_LONGTEXT, VLC_FALSE ); add_string( "http-pwd", NULL , NULL, PASS_TEXT, PASS_LONGTEXT, VLC_FALSE );
add_string( "http-user-agent", COPYRIGHT_MESSAGE , NULL, AGENT_TEXT, add_string( "http-user-agent", COPYRIGHT_MESSAGE , NULL, AGENT_TEXT,
AGENT_LONGTEXT, VLC_FALSE ); AGENT_LONGTEXT, VLC_FALSE );
add_bool( "http-reconnect", 0, NULL, RECONNECT_TEXT,
RECONNECT_LONGTEXT, VLC_TRUE );
add_shortcut( "http" ); add_shortcut( "http" );
add_shortcut( "http4" ); add_shortcut( "http4" );
...@@ -110,6 +116,7 @@ struct access_sys_t ...@@ -110,6 +116,7 @@ struct access_sys_t
int64_t i_chunk; int64_t i_chunk;
vlc_bool_t b_seekable; vlc_bool_t b_seekable;
vlc_bool_t b_reconnect;
}; };
/* */ /* */
...@@ -245,6 +252,8 @@ static int Open ( vlc_object_t *p_this ) ...@@ -245,6 +252,8 @@ static int Open ( vlc_object_t *p_this )
p_sys->psz_user, p_sys->psz_passwd ); p_sys->psz_user, p_sys->psz_passwd );
} }
p_sys->b_reconnect = var_CreateGetBool( p_access, "http-reconnect" );
/* Connect */ /* Connect */
if( Connect( p_access, 0 ) ) if( Connect( p_access, 0 ) )
{ {
...@@ -266,7 +275,8 @@ static int Open ( vlc_object_t *p_this ) ...@@ -266,7 +275,8 @@ static int Open ( vlc_object_t *p_this )
msg_Dbg( p_access, "redirection to %s", p_sys->psz_location ); msg_Dbg( p_access, "redirection to %s", p_sys->psz_location );
p_playlist = vlc_object_find( p_access, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); p_playlist = vlc_object_find( p_access, VLC_OBJECT_PLAYLIST,
FIND_ANYWHERE );
if( !p_playlist ) if( !p_playlist )
{ {
msg_Err( p_access, "redirection failed: can't find playlist" ); msg_Err( p_access, "redirection failed: can't find playlist" );
...@@ -292,8 +302,10 @@ static int Open ( vlc_object_t *p_this ) ...@@ -292,8 +302,10 @@ static int Open ( vlc_object_t *p_this )
p_access->psz_demux ); p_access->psz_demux );
} }
/* Pts delay */ if( p_sys->b_reconnect ) msg_Dbg( p_access, "auto re-connect enabled" );
var_Create( p_access, "http-caching", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
/* PTS delay */
var_Create( p_access, "http-caching", VLC_VAR_INTEGER |VLC_VAR_DOINHERIT );
return VLC_SUCCESS; return VLC_SUCCESS;
...@@ -346,8 +358,8 @@ static void Close( vlc_object_t *p_this ) ...@@ -346,8 +358,8 @@ static void Close( vlc_object_t *p_this )
*****************************************************************************/ *****************************************************************************/
static int Read( access_t *p_access, uint8_t *p_buffer, int i_len ) static int Read( access_t *p_access, uint8_t *p_buffer, int i_len )
{ {
access_sys_t *p_sys = p_access->p_sys; access_sys_t *p_sys = p_access->p_sys;
int i_read; int i_read;
if( p_sys->fd < 0 ) if( p_sys->fd < 0 )
{ {
...@@ -411,17 +423,31 @@ static int Read( access_t *p_access, uint8_t *p_buffer, int i_len ) ...@@ -411,17 +423,31 @@ static int Read( access_t *p_access, uint8_t *p_buffer, int i_len )
{ {
/* read the empty line */ /* read the empty line */
char *psz = net_Gets( VLC_OBJECT(p_access), p_sys->fd ); char *psz = net_Gets( VLC_OBJECT(p_access), p_sys->fd );
if( psz ) if( psz ) free( psz );
{
free( psz );
}
} }
} }
} }
else if( i_read == 0 ) else if( i_read == 0 )
{ {
p_access->info.b_eof = VLC_TRUE; if( p_sys->b_reconnect )
{
msg_Dbg( p_access, "got disconnected, trying to reconnect" );
net_Close( p_sys->fd ); p_sys->fd = -1;
if( Connect( p_access, p_access->info.i_pos ) )
{
msg_Dbg( p_access, "reconnection failed" );
}
else
{
p_sys->b_reconnect = VLC_FALSE;
i_read = Read( p_access, p_buffer, i_len );
p_sys->b_reconnect = VLC_TRUE;
}
}
if( i_read == 0 ) p_access->info.b_eof = VLC_TRUE;
} }
return i_read; return i_read;
} }
...@@ -669,6 +695,7 @@ static int Connect( access_t *p_access, int64_t i_tell ) ...@@ -669,6 +695,7 @@ static int Connect( access_t *p_access, int64_t i_tell )
{ {
p_sys->psz_protocol = "ICY"; p_sys->psz_protocol = "ICY";
p_sys->i_code = atoi( &psz[4] ); p_sys->i_code = atoi( &psz[4] );
p_sys->b_reconnect = VLC_TRUE;
} }
else else
{ {
...@@ -738,6 +765,12 @@ static int Connect( access_t *p_access, int64_t i_tell ) ...@@ -738,6 +765,12 @@ static int Connect( access_t *p_access, int64_t i_tell )
p_sys->psz_mime = strdup( p ); p_sys->psz_mime = strdup( p );
msg_Dbg( p_access, "Content-Type: %s", p_sys->psz_mime ); msg_Dbg( p_access, "Content-Type: %s", p_sys->psz_mime );
} }
else if( !strcasecmp( psz, "Server" ) &&
!strncasecmp( p, "Icecast", 7 ) )
{
p_sys->b_reconnect = VLC_TRUE;
msg_Dbg( p_access, "Server: %s", p );
}
else if( !strcasecmp( psz, "Transfer-Encoding" ) ) else if( !strcasecmp( psz, "Transfer-Encoding" ) )
{ {
msg_Dbg( p_access, "Transfer-Encoding: %s", p ); msg_Dbg( p_access, "Transfer-Encoding: %s", p );
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment