On Monday 28 September 2015 15:30:33 Giuseppe Scrivano wrote:
> Tim Ruehsen <tim.rueh...@gmx.de> writes:
> > Please review / test this patch.
> > 
> > BTW, I am not sure if contributors.debian.org is configured correctly.
> > The rehandshake occurs right after the HTTP request and it has a pretty
> > heavy impact on download duration.
> > 
> > Regards, Tim
> > 
> > On Sunday 27 September 2015 20:03:54 Tim Ruehsen wrote:
> >> Follow-up Comment #2, bug #46061 (project wget):
> >> 
> >> Wget is not reacting on GNUTLS_E_REHANDSHAKE. Should be straight
> >> forward...
> >> 
> >>     _______________________________________________________
> >> 
> >> Reply to this item at:
> >>   <http://savannah.gnu.org/bugs/?46061>
> >> 
> >> _______________________________________________
> >> 
> >>   Nachricht gesendet von/durch Savannah
> >>   http://savannah.gnu.org/
> > 
> > From cbec5b0c780f9d1fc343fabf22e8ee7c7cb3222d Mon Sep 17 00:00:00 2001
> > From: =?UTF-8?q?Tim=20R=C3=BChsen?= <tim.rueh...@gmx.de>
> > Date: Mon, 28 Sep 2015 12:00:33 +0200
> > Subject: [PATCH] Handle TLS rehandshakes in GnuTLS code
> > 
> > * src/gnutls.c: New static function _do_handshake()
> > * src/gnutls.c (wgnutls_read_timeout): Handle rehandshake
> > * src/gnutls.c (wgnutls_write): Handle rehandshake
> > * src/gnutls.c (ssl_connect_wget): Move handshake code into
> > _do_handshake()
> > 
> > Fixes #46061
> > ---
> > 
> >  src/gnutls.c | 179
> >  ++++++++++++++++++++++++++++++++++------------------------- 1 file
> >  changed, 102 insertions(+), 77 deletions(-)
> > 
> > diff --git a/src/gnutls.c b/src/gnutls.c
> > index a38301a..2f53592 100644
> > --- a/src/gnutls.c
> > +++ b/src/gnutls.c
> > @@ -57,6 +57,9 @@ as that of the covered work.  */
> > 
> >  #include "host.h"
> >  
> >  static int
> > 
> > +_do_handshake(gnutls_session_t session, int fd, double timeout);
> > +
> > +static int
> > 
> >  key_type_to_gnutls_type (enum keyfile_type type)
> >  {
> >  
> >    switch (type)
> > 
> > @@ -277,6 +280,12 @@ wgnutls_read_timeout (int fd, char *buf, int bufsize,
> > void *arg, double timeout)> 
> >          {
> >          
> >            ret = gnutls_record_recv (ctx->session, buf, bufsize);
> >            timed_out = timeout && ptimer_measure (timer) >= timeout;
> > 
> > +          if (!timed_out && ret == GNUTLS_E_REHANDSHAKE)
> > +            {
> > +              DEBUGP (("GnuTLS: *** REHANDSHAKE while reading\n"));
> > +              if ((ret = _do_handshake(ctx->session, fd, timeout)) == 0)
> > +                ret = GNUTLS_E_AGAIN; /* restart reading */
> > +            }
> > 
> >          }
> >      
> >      }
> >    
> >    while (ret == GNUTLS_E_INTERRUPTED || (ret == GNUTLS_E_AGAIN &&
> >    !timed_out));> 
> > @@ -332,7 +341,15 @@ wgnutls_write (int fd _GL_UNUSED, char *buf, int
> > bufsize, void *arg)> 
> >    int ret;
> >    struct wgnutls_transport_context *ctx = arg;
> >    do
> > 
> > -    ret = gnutls_record_send (ctx->session, buf, bufsize);
> > +    {
> > +      ret = gnutls_record_send (ctx->session, buf, bufsize);
> > +      if (ret == GNUTLS_E_REHANDSHAKE)
> > +        {
> > +          DEBUGP (("GnuTLS: *** REHANDSHAKE while writing\n"));
> > +          if ((ret = _do_handshake(ctx->session, fd, 0)) == 0)
> 
> one thing: timeout here should be the remaining time instead of 0?

wgnutls_write is called without timeout. So, what can we do here ?

But maybe we don't have to check for GNUTLS_E_REHANDSHAKE at this point at 
all. Regarding 
http://www.gnutls.org/manual/html_node/Re_002dauthentication.html, only 
gnutls_record_recv() returns GNUTLS_E_REHANDSHAKE.

If you don't mind, I'll remove the rehandshake code from wgnutls_write().

Tim

Reply via email to