X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faccess%2Fhttp.c;h=8d3bcfd705b1c5f598486642461b780d3509e544;hb=a133370a475c74fed09d4e7427c75f60b4a7b7e9;hp=df634f1b9dab42b96b4df9734c6d748b79ea49f8;hpb=19f542a35b43fadc821547fea49f7cbd90ad0b69;p=vlc diff --git a/modules/access/http.c b/modules/access/http.c index df634f1b9d..8d3bcfd705 100644 --- a/modules/access/http.c +++ b/modules/access/http.c @@ -32,14 +32,15 @@ #include #include -#include +#include -#include "vlc_interaction.h" -#include "vlc_playlist.h" -#include "vlc_meta.h" -#include "network.h" -#include "vlc_url.h" -#include "vlc_tls.h" +#include +#include +#include +#include +#include +#include +#include /***************************************************************************** * Module descriptor @@ -49,7 +50,7 @@ static void Close( vlc_object_t * ); #define PROXY_TEXT N_("HTTP proxy") #define PROXY_LONGTEXT N_( \ - "HTTP proxy to be usesd It must be of the form " \ + "HTTP proxy to be used It must be of the form " \ "http://[user[:pass]@]myproxy.mydomain:myport/ ; " \ "if empty, the http_proxy environment variable will be tried." ) @@ -67,10 +68,9 @@ static void Close( vlc_object_t * ); "Automatically try to reconnect to the stream in case of a sudden " \ "disconnect." ) -/// \bug missing space before you should #define CONTINUOUS_TEXT N_("Continuous stream") #define CONTINUOUS_LONGTEXT N_("Read a file that is " \ - "being constantly updated (for example, a JPG file on a server)." \ + "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." ) @@ -118,7 +118,7 @@ struct access_sys_t /* */ int i_code; - char *psz_protocol; + const char *psz_protocol; int i_version; char *psz_mime; @@ -265,18 +265,28 @@ static int Open( vlc_object_t *p_this ) connect: /* Connect */ - if( Connect( p_access, 0 ) ) + switch( Connect( p_access, 0 ) ) { - /* Retry with http 1.0 */ - msg_Dbg( p_access, "switching to HTTP version 1.0" ); - p_sys->i_version = 0; - p_sys->b_seekable = VLC_FALSE; - - if( p_access->b_die || - Connect( p_access, 0 ) ) - { + case -1: goto error; - } + + case -2: + /* Retry with http 1.0 */ + msg_Dbg( p_access, "switching to HTTP version 1.0" ); + p_sys->i_version = 0; + p_sys->b_seekable = VLC_FALSE; + + if( p_access->b_die || Connect( p_access, 0 ) ) + goto error; + +#ifdef DEBUG + case 0: + break; + + default: + msg_Err( p_access, "You should not be here" ); + abort(); +#endif } if( p_sys->i_code == 401 ) @@ -787,10 +797,10 @@ static int Connect( access_t *p_access, int64_t i_tell ) /* Open connection */ p_sys->fd = net_ConnectTCP( p_access, srv.psz_host, srv.i_port ); - if( p_sys->fd < 0 ) + if( p_sys->fd == -1 ) { msg_Err( p_access, "cannot connect to %s:%d", srv.psz_host, srv.i_port ); - return VLC_EGENERIC; + return -1; } /* Initialize TLS/SSL session */ @@ -806,7 +816,7 @@ static int Connect( access_t *p_access, int64_t i_tell ) { /* CONNECT is not in HTTP/1.0 */ Disconnect( p_access ); - return VLC_EGENERIC; + return -1; } net_Printf( VLC_OBJECT(p_access), p_sys->fd, NULL, @@ -820,7 +830,7 @@ static int Connect( access_t *p_access, int64_t i_tell ) { msg_Err( p_access, "cannot establish HTTP/TLS tunnel" ); Disconnect( p_access ); - return VLC_EGENERIC; + return -1; } sscanf( psz, "HTTP/%*u.%*u %3u", &i_status ); @@ -830,7 +840,7 @@ static int Connect( access_t *p_access, int64_t i_tell ) { msg_Err( p_access, "HTTP/TLS tunnel through proxy denied" ); Disconnect( p_access ); - return VLC_EGENERIC; + return -1; } do @@ -840,7 +850,7 @@ static int Connect( access_t *p_access, int64_t i_tell ) { msg_Err( p_access, "HTTP proxy connection failed" ); Disconnect( p_access ); - return VLC_EGENERIC; + return -1; } if( *psz == '\0' ) @@ -858,12 +868,12 @@ static int Connect( access_t *p_access, int64_t i_tell ) { msg_Err( p_access, "cannot establish HTTP/TLS session" ); Disconnect( p_access ); - return VLC_EGENERIC; + return -1; } p_sys->p_vs = &p_sys->p_tls->sock; } - return Request( p_access, i_tell ); + return Request( p_access, i_tell ) ? -2 : 0; } @@ -892,7 +902,7 @@ static int Request( access_t *p_access, int64_t i_tell ) } else { - char *psz_path = p_sys->url.psz_path; + const char *psz_path = p_sys->url.psz_path; if( !psz_path || !*psz_path ) { psz_path = "/"; @@ -1068,8 +1078,32 @@ static int Request( access_t *p_access, int64_t i_tell ) } else if( !strcasecmp( psz, "Location" ) ) { + char * psz_new_loc; + + /* This does not follow RFC 2068, but yet if the url is not absolute, + * handle it as everyone does. */ + if( p[0] == '/' ) + { + const char *psz_http_ext = p_sys->b_ssl ? "s" : "" ; + + 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 + { + psz_new_loc = strdup( p ); + } + if( p_sys->psz_location ) free( p_sys->psz_location ); - p_sys->psz_location = strdup( p ); + p_sys->psz_location = psz_new_loc; } else if( !strcasecmp( psz, "Content-Type" ) ) { @@ -1174,5 +1208,5 @@ static void Disconnect( access_t *p_access ) net_Close(p_sys->fd); p_sys->fd = -1; } - + }