Changeset 9b67285


Ignore:
Timestamp:
2012-12-24T19:17:37Z (12 years ago)
Author:
Wilmer van der Gaast <wilmer@…>
Branches:
master
Children:
c1d9c95
Parents:
def3650
Message:

SSL session caching. You'd think that this makes Twitter stuff faster, except
Twitter webservers seem to do successful session resumes only sporadically.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • lib/ssl_gnutls.c

    rdef3650 r9b67285  
    22  * BitlBee -- An IRC to other IM-networks gateway                     *
    33  *                                                                    *
    4   * Copyright 2002-2011 Wilmer van der Gaast and others                *
     4  * Copyright 2002-2012 Wilmer van der Gaast and others                *
    55  \********************************************************************/
    66
     
    6363};
    6464
     65static GHashTable *session_cache;
     66
    6567static gboolean ssl_connected( gpointer data, gint source, b_input_condition cond );
    6668static gboolean ssl_starttls_real( gpointer data, gint source, b_input_condition cond );
     
    9799        */
    98100       
     101        session_cache = g_hash_table_new_full( g_str_hash, g_str_equal, g_free, g_free );
     102       
    99103        atexit( ssl_deinit );
    100104}
     
    104108        gnutls_global_deinit();
    105109        gnutls_certificate_free_credentials( xcred );
     110        g_hash_table_destroy( session_cache );
     111        session_cache = NULL;
    106112}
    107113
     
    220226
    221227        return verifyret;
     228}
     229
     230struct ssl_session
     231{
     232        size_t size;
     233        char data[];
     234};
     235
     236static void ssl_cache_add( struct scd *conn )
     237{
     238        size_t data_size;
     239        struct ssl_session *data;
     240        char *hostname;
     241       
     242        if( !conn->hostname ||
     243            gnutls_session_get_data( conn->session, NULL, &data_size ) != 0 )
     244                return;
     245       
     246        data = g_malloc( sizeof( struct ssl_session ) + data_size );
     247        if( gnutls_session_get_data( conn->session, data->data, &data->size ) != 0 )
     248        {
     249                g_free( data );
     250                return;
     251        }
     252       
     253        hostname = g_strdup( conn->hostname );
     254        g_hash_table_insert( session_cache, hostname, data );
     255}
     256
     257static void ssl_cache_resume( struct scd *conn )
     258{
     259        struct ssl_session *data;
     260       
     261        if( conn->hostname &&
     262            ( data = g_hash_table_lookup( session_cache, conn->hostname ) ) )
     263        {
     264                gnutls_session_set_data( conn->session, data->data, data->size );
     265                g_hash_table_remove( session_cache, conn->hostname );
     266        }
    222267}
    223268
     
    280325        gnutls_transport_set_ptr( conn->session, (gnutls_transport_ptr_t) GNUTLS_STUPID_CAST conn->fd );
    281326       
     327        ssl_cache_resume( conn );
     328       
    282329        return ssl_handshake( data, source, cond );
    283330}
     
    320367                        /* For now we can't handle non-blocking perfectly everywhere... */
    321368                        sock_make_blocking( conn->fd );
    322                
     369                       
     370                        ssl_cache_add( conn );
    323371                        conn->established = TRUE;
    324372                        conn->func( conn->data, 0, conn, cond );
Note: See TracChangeset for help on using the changeset viewer.