Commit 99ce7125 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

http: add --http2 to force HTTP/2

This is currently and transitionally used to test HTTP/2 over TLS.
Eventually, this should be done automatically.

Going forward, this will either be removed or used without TLS.
parent e8955e0d
...@@ -117,6 +117,8 @@ vlc_module_begin () ...@@ -117,6 +117,8 @@ vlc_module_begin ()
change_safe() change_safe()
add_bool( "http-forward-cookies", true, FORWARD_COOKIES_TEXT, add_bool( "http-forward-cookies", true, FORWARD_COOKIES_TEXT,
FORWARD_COOKIES_LONGTEXT, true ) FORWARD_COOKIES_LONGTEXT, true )
add_bool( "http2", false, N_("HTTP 2.0"),
N_("Negotiate HTTP version 2.0"), true )
/* 'itpc' = iTunes Podcast */ /* 'itpc' = iTunes Podcast */
add_shortcut( "http", "https", "unsv", "itpc", "icyx" ) add_shortcut( "http", "https", "unsv", "itpc", "icyx" )
set_callbacks( Open, Close ) set_callbacks( Open, Close )
...@@ -992,19 +994,20 @@ static int Connect( access_t *p_access, uint64_t i_tell ) ...@@ -992,19 +994,20 @@ static int Connect( access_t *p_access, uint64_t i_tell )
/* Initialize TLS/SSL session */ /* Initialize TLS/SSL session */
if( p_sys->p_creds != NULL ) if( p_sys->p_creds != NULL )
{ {
bool http2 = var_InheritBool( p_access, "http2" );
if( (p_sys->b_proxy || http2) && p_sys->i_version == 0 )
{ /* ALPN and CONNECT are not compatible with HTTP/1.0 */
Disconnect( p_access );
return -1;
}
/* CONNECT to establish TLS tunnel through HTTP proxy */ /* CONNECT to establish TLS tunnel through HTTP proxy */
if( p_sys->b_proxy ) if( p_sys->b_proxy )
{ {
char *psz; char *psz;
unsigned i_status; unsigned i_status;
if( p_sys->i_version == 0 )
{
/* CONNECT is not in HTTP/1.0 */
Disconnect( p_access );
return -1;
}
WriteHeaders( p_access, WriteHeaders( p_access,
"CONNECT %s:%d HTTP/1.1\r\nHost: %s:%d\r\n\r\n", "CONNECT %s:%d HTTP/1.1\r\nHost: %s:%d\r\n\r\n",
p_sys->url.psz_host, p_sys->url.i_port, p_sys->url.psz_host, p_sys->url.i_port,
...@@ -1054,17 +1057,28 @@ static int Connect( access_t *p_access, uint64_t i_tell ) ...@@ -1054,17 +1057,28 @@ static int Connect( access_t *p_access, uint64_t i_tell )
} }
/* TLS/SSL handshake */ /* TLS/SSL handshake */
const char *alpn[] = { "http/1.1", NULL }; const char *alpn[3] = { "h2", "http/1.1", NULL };
char *alp;
p_sys->p_tls = vlc_tls_ClientSessionCreate( p_sys->p_creds, p_sys->fd, p_sys->p_tls = vlc_tls_ClientSessionCreate( p_sys->p_creds, p_sys->fd,
p_sys->url.psz_host, "https", p_sys->url.psz_host, "https",
p_sys->i_version ? alpn : NULL, NULL ); p_sys->i_version ? (alpn + !http2) : NULL, &alp );
if( p_sys->p_tls == NULL ) if( p_sys->p_tls == NULL )
{ {
msg_Err( p_access, "cannot establish HTTP/TLS session" ); msg_Err( p_access, "cannot establish HTTP/TLS session" );
Disconnect( p_access ); Disconnect( p_access );
return -1; return -1;
} }
http2 = alp != NULL && !strcmp("h2", alp);
free( alp );
if( http2 )
{
msg_Dbg( p_access, "handing off to HTTP2 plugin" );
Disconnect( p_access );
return -1;
}
} }
return Request( p_access, i_tell ) ? -2 : 0; return Request( p_access, i_tell ) ? -2 : 0;
......
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