diff options
author | Daniel Stenberg <daniel@haxx.se> | 2020-09-24 23:04:15 +0200 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2020-09-25 08:35:01 +0200 |
commit | c4693adc62e44e7abaa6a8aa2180693bcf120b43 (patch) | |
tree | 284cb791c85bd184451a91b76dfb83dd7f753765 | |
parent | 92a9b88ebf7aa61d8183e633106f554f3f39bf74 (diff) | |
download | curl-c4693adc62e44e7abaa6a8aa2180693bcf120b43.tar.gz |
imap: make imap_send use dynbuf for the send buffer management
Reuses the buffer and thereby reduces number of mallocs over a transfer.
Closes #6010
-rw-r--r-- | lib/dynbuf.h | 1 | ||||
-rw-r--r-- | lib/imap.c | 31 | ||||
-rw-r--r-- | lib/imap.h | 5 | ||||
-rwxr-xr-x | tests/runtests.pl | 2 |
4 files changed, 19 insertions, 20 deletions
diff --git a/lib/dynbuf.h b/lib/dynbuf.h index 90a4f6622..39b859570 100644 --- a/lib/dynbuf.h +++ b/lib/dynbuf.h @@ -84,4 +84,5 @@ int Curl_dyn_vprintf(struct dynbuf *dyn, const char *format, va_list ap_save); #define DYN_QLOG_NAME 1024 #define DYN_H1_TRAILER 4096 #define DYN_PINGPPONG_CMD (64*1024) +#define DYN_IMAP_CMD (64*1024) #endif diff --git a/lib/imap.c b/lib/imap.c index 02fc796e4..46367be10 100644 --- a/lib/imap.c +++ b/lib/imap.c @@ -1429,6 +1429,7 @@ static CURLcode imap_connect(struct connectdata *conn, bool *done) imapc->preftype = IMAP_TYPE_ANY; Curl_sasl_init(&imapc->sasl, &saslimap); + Curl_dyn_init(&imapc->dyn, DYN_IMAP_CMD); /* Initialise the pingpong layer */ Curl_pp_setup(pp); Curl_pp_init(pp); @@ -1632,6 +1633,7 @@ static CURLcode imap_disconnect(struct connectdata *conn, bool dead_connection) /* Disconnect from the server */ Curl_pp_disconnect(&imapc->pp); + Curl_dyn_free(&imapc->dyn); /* Cleanup the SASL module */ Curl_sasl_cleanup(conn, imapc->sasl.authused); @@ -1733,30 +1735,25 @@ static CURLcode imap_sendf(struct connectdata *conn, const char *fmt, ...) { CURLcode result = CURLE_OK; struct imap_conn *imapc = &conn->proto.imapc; - char *taggedfmt; - va_list ap; DEBUGASSERT(fmt); - /* Calculate the next command ID wrapping at 3 digits */ - imapc->cmdid = (imapc->cmdid + 1) % 1000; - /* Calculate the tag based on the connection ID and command ID */ msnprintf(imapc->resptag, sizeof(imapc->resptag), "%c%03d", - 'A' + curlx_sltosi(conn->connection_id % 26), imapc->cmdid); - - /* Prefix the format with the tag */ - taggedfmt = aprintf("%s %s", imapc->resptag, fmt); - if(!taggedfmt) - return CURLE_OUT_OF_MEMORY; + 'A' + curlx_sltosi(conn->connection_id % 26), + (++imapc->cmdid)%1000); - /* Send the data with the tag */ - va_start(ap, fmt); - result = Curl_pp_vsendf(&imapc->pp, taggedfmt, ap); - va_end(ap); - - free(taggedfmt); + /* start with a blank buffer */ + Curl_dyn_reset(&imapc->dyn); + /* append tag + space + fmt */ + result = Curl_dyn_addf(&imapc->dyn, "%s %s", imapc->resptag, fmt); + if(!result) { + va_list ap; + va_start(ap, fmt); + result = Curl_pp_vsendf(&imapc->pp, Curl_dyn_ptr(&imapc->dyn), ap); + va_end(ap); + } return result; } diff --git a/lib/imap.h b/lib/imap.h index 4786f5624..8f373d284 100644 --- a/lib/imap.h +++ b/lib/imap.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 2009 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al. + * Copyright (C) 2009 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -75,13 +75,14 @@ struct imap_conn { bool preauth; /* Is this connection PREAUTH? */ struct SASL sasl; /* SASL-related parameters */ unsigned int preftype; /* Preferred authentication type */ - int cmdid; /* Last used command ID */ + unsigned int cmdid; /* Last used command ID */ char resptag[5]; /* Response tag to wait for */ bool tls_supported; /* StartTLS capability supported by server */ bool login_disabled; /* LOGIN command disabled by server */ bool ir_supported; /* Initial response supported by server */ char *mailbox; /* The last selected mailbox */ char *mailbox_uidvalidity; /* UIDVALIDITY parsed from select response */ + struct dynbuf dyn; /* for the IMAP commands */ }; extern const struct Curl_handler Curl_handler_imap; diff --git a/tests/runtests.pl b/tests/runtests.pl index 7bfaab57a..49b318dc7 100755 --- a/tests/runtests.pl +++ b/tests/runtests.pl @@ -166,7 +166,7 @@ my $SSHSRVMD5 = "[uninitialized]"; # MD5 of ssh server public key my $srcdir = $ENV{'srcdir'} || '.'; my $CURL="../src/curl".exe_ext('TOOL'); # what curl executable to run on the tests -my $VCURL=$CURL; # what curl binary to use to verify the servers with +my $VCURL="curl"; # what curl binary to use to verify the servers with # VCURL is handy to set to the system one when the one you # just built hangs or crashes and thus prevent verification my $DBGCURL=$CURL; #"../src/.libs/curl"; # alternative for debugging |