Tim Ruehsen <[email protected]> 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?= <[email protected]> > 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? Regards, Giuseppe
