[vlc-commits] tls: simplify server code

Rémi Denis-Courmont git at videolan.org
Sat Sep 29 22:12:18 CEST 2012


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sat Sep 29 23:00:21 2012 +0300| [52eb2b94e64261abd276c47d41326b32fbfdb546] | committer: Rémi Denis-Courmont

tls: simplify server code

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=52eb2b94e64261abd276c47d41326b32fbfdb546
---

 include/vlc_tls.h   |    4 +--
 src/network/httpd.c |   78 +++++++++++----------------------------------------
 src/network/tls.c   |    7 ++---
 3 files changed, 20 insertions(+), 69 deletions(-)

diff --git a/include/vlc_tls.h b/include/vlc_tls.h
index d732d16..7c7720c 100644
--- a/include/vlc_tls.h
+++ b/include/vlc_tls.h
@@ -48,9 +48,8 @@ struct vlc_tls
 VLC_API vlc_tls_t *vlc_tls_ClientSessionCreate (vlc_tls_creds_t *, int fd,
                                                 const char *host);
 vlc_tls_t *vlc_tls_ServerSessionCreate (vlc_tls_creds_t *, int fd);
-int vlc_tls_ServerSessionHandshake (vlc_tls_t *);
+int vlc_tls_SessionHandshake (vlc_tls_t *);
 VLC_API void vlc_tls_SessionDelete (vlc_tls_t *);
-#define vlc_tls_ServerSessionDelete vlc_tls_SessionDelete
 
 /* NOTE: It is assumed that a->sock.p_sys = a */
 # define tls_Send( a, b, c ) (((vlc_tls_t *)a)->sock.pf_send (a, b, c))
@@ -77,7 +76,6 @@ VLC_API vlc_tls_creds_t *vlc_tls_ClientCreate (vlc_object_t *);
 vlc_tls_creds_t *vlc_tls_ServerCreate (vlc_object_t *,
                                        const char *cert, const char *key);
 VLC_API void vlc_tls_Delete (vlc_tls_creds_t *);
-#define vlc_tls_ServerDelete vlc_tls_Delete
 int vlc_tls_ServerAddCA (vlc_tls_creds_t *srv, const char *path);
 int vlc_tls_ServerAddCRL (vlc_tls_creds_t *srv, const char *path);
 
diff --git a/src/network/httpd.c b/src/network/httpd.c
index 043e28b..e90dc98 100644
--- a/src/network/httpd.c
+++ b/src/network/httpd.c
@@ -928,7 +928,7 @@ httpd_host_t *vlc_https_HostNew( vlc_object_t *obj )
     return httpd_HostCreate( obj, "http-host", "https-port", tls );
 
 error:
-    vlc_tls_ServerDelete( tls );
+    vlc_tls_Delete( tls );
     return NULL;
 }
 
@@ -987,8 +987,7 @@ static httpd_host_t *httpd_HostCreate( vlc_object_t *p_this,
 
         vlc_mutex_unlock( &httpd.mutex );
         vlc_UrlClean( &url );
-        if( p_tls != NULL )
-            vlc_tls_ServerDelete( p_tls );
+        vlc_tls_Delete( p_tls );
         return host;
     }
 
@@ -1051,10 +1050,7 @@ error:
     }
 
     vlc_UrlClean( &url );
-
-    if( p_tls != NULL )
-        vlc_tls_ServerDelete( p_tls );
-
+    vlc_tls_Delete( p_tls );
     return NULL;
 }
 
@@ -1100,9 +1096,7 @@ void httpd_HostDelete( httpd_host_t *host )
         /* TODO */
     }
 
-    if( host->p_tls != NULL)
-        vlc_tls_ServerDelete( host->p_tls );
-
+    vlc_tls_Delete( host->p_tls );
     net_ListenClose( host->fds );
     vlc_cond_destroy( &host->wait );
     vlc_mutex_destroy( &host->lock );
@@ -1300,7 +1294,7 @@ static void httpd_ClientClean( httpd_client_t *cl )
     if( cl->fd >= 0 )
     {
         if( cl->p_tls != NULL )
-            vlc_tls_ServerSessionDelete( cl->p_tls );
+            vlc_tls_SessionDelete( cl->p_tls );
         net_Close( cl->fd );
         cl->fd = -1;
     }
@@ -1324,6 +1318,8 @@ static httpd_client_t *httpd_ClientNew( int fd, vlc_tls_t *p_tls, mtime_t now )
     cl->p_tls = p_tls;
 
     httpd_ClientInit( cl, now );
+    if( p_tls != NULL )
+        cl->i_state = HTTPD_CLIENT_TLS_HS_OUT;
 
     return cl;
 }
@@ -1882,9 +1878,9 @@ static void httpd_ClientSend( httpd_client_t *cl )
     }
 }
 
-static void httpd_ClientTlsHsIn( httpd_client_t *cl )
+static void httpd_ClientTlsHandshake( httpd_client_t *cl )
 {
-    switch( vlc_tls_ServerSessionHandshake( cl->p_tls ) )
+    switch( vlc_tls_SessionHandshake( cl->p_tls ) )
     {
         case 0:
             cl->i_state = HTTPD_CLIENT_RECEIVING;
@@ -1892,30 +1888,15 @@ static void httpd_ClientTlsHsIn( httpd_client_t *cl )
 
         case -1:
             cl->i_state = HTTPD_CLIENT_DEAD;
-            cl->p_tls = NULL;
-            break;
-
-        case 2:
-            cl->i_state = HTTPD_CLIENT_TLS_HS_OUT;
-    }
-}
-
-static void httpd_ClientTlsHsOut( httpd_client_t *cl )
-{
-    switch( vlc_tls_ServerSessionHandshake( cl->p_tls ) )
-    {
-        case 0:
-            cl->i_state = HTTPD_CLIENT_RECEIVING;
-            break;
-
-        case -1:
-            cl->i_state = HTTPD_CLIENT_DEAD;
-            cl->p_tls = NULL;
             break;
 
         case 1:
             cl->i_state = HTTPD_CLIENT_TLS_HS_IN;
             break;
+
+        case 2:
+            cl->i_state = HTTPD_CLIENT_TLS_HS_OUT;
+            break;
     }
 }
 
@@ -2303,13 +2284,10 @@ static void* httpd_HostThread( void *data )
             {
                 httpd_ClientSend( cl );
             }
-            else if( cl->i_state == HTTPD_CLIENT_TLS_HS_IN )
+            else if( cl->i_state == HTTPD_CLIENT_TLS_HS_IN
+                  || cl->i_state == HTTPD_CLIENT_TLS_HS_OUT )
             {
-                httpd_ClientTlsHsIn( cl );
-            }
-            else if( cl->i_state == HTTPD_CLIENT_TLS_HS_OUT )
-            {
-                httpd_ClientTlsHsOut( cl );
+                httpd_ClientTlsHandshake( cl );
             }
         }
 
@@ -2317,7 +2295,6 @@ static void* httpd_HostThread( void *data )
         for( nfd = 0; nfd < host->nfd; nfd++ )
         {
             httpd_client_t *cl;
-            int i_state = -1;
             int fd = ufd[nfd].fd;
 
             assert (fd == host->fds[nfd]);
@@ -2335,34 +2312,13 @@ static void* httpd_HostThread( void *data )
             vlc_tls_t *p_tls;
 
             if( host->p_tls != NULL )
-            {
                 p_tls = vlc_tls_ServerSessionCreate( host->p_tls, fd );
-                switch( vlc_tls_ServerSessionHandshake( p_tls ) )
-                {
-                    case -1:
-                        msg_Err( host, "Rejecting TLS connection" );
-                        /* p_tls is destroyed implicitly */
-                        net_Close( fd );
-                        fd = -1;
-                        p_tls = NULL;
-                        continue;
-
-                    case 1: /* missing input - most likely */
-                        i_state = HTTPD_CLIENT_TLS_HS_IN;
-                        break;
-
-                    case 2: /* missing output */
-                        i_state = HTTPD_CLIENT_TLS_HS_OUT;
-                        break;
-                }
-            }
             else
                 p_tls = NULL;
 
             cl = httpd_ClientNew( fd, p_tls, now );
+
             TAB_APPEND( host->i_client, host->client, cl );
-            if( i_state != -1 )
-                cl->i_state = i_state; // override state for TLS
         }
     }
     vlc_mutex_unlock( &host->lock );
diff --git a/src/network/tls.c b/src/network/tls.c
index 0c0583d..1ffc465 100644
--- a/src/network/tls.c
+++ b/src/network/tls.c
@@ -185,12 +185,9 @@ vlc_tls_t *vlc_tls_ServerSessionCreate (vlc_tls_creds_t *crd, int fd)
     return vlc_tls_SessionCreate (crd, fd, NULL);
 }
 
-int vlc_tls_ServerSessionHandshake (vlc_tls_t *ses)
+int vlc_tls_SessionHandshake (vlc_tls_t *session)
 {
-    int val = ses->handshake (ses);
-    if (val < 0)
-        vlc_tls_ServerSessionDelete (ses);
-    return val;
+    return session->handshake (session);
 }
 
 /**



More information about the vlc-commits mailing list