From 9a56390e597aa016cb03db1e59dfd880b23eb3fd Mon Sep 17 00:00:00 2001 From: Patrick McCarren Date: Fri, 18 Jul 2014 12:14:09 -0400 Subject: [PATCH] Added append LITERAL+ extension support The client will automatically detect if the server supports LITERAL+ during an append, and if so, will immediately send the message data. This allows messages to be append to a Microsoft Exchange server. --- lib/Connection.js | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/lib/Connection.js b/lib/Connection.js index 81a6aab..f6021ec 100644 --- a/lib/Connection.js +++ b/lib/Connection.js @@ -212,12 +212,7 @@ Connection.prototype.connect = function() { self.debug && self.debug('=> ' + inspect(CRLF)); self._sock.write(CRLF); } else if (type === 'APPEND') { - var val = self._curReq.appendData; - if (Buffer.isBuffer(self._curReq.appendData)) - val = val.toString('utf8'); - self.debug && self.debug('=> ' + inspect(self._curReq.appendData)); - self._sock.write(self._curReq.appendData); - self._sock.write(CRLF); + self._sockWriteAppendData(self._curReq.appendData); } else if (self._curReq.lines && self._curReq.lines.length) { var line = self._curReq.lines.shift() + '\r\n'; self.debug && self.debug('=> ' + inspect(line)); @@ -278,6 +273,7 @@ Connection.prototype.end = function() { }; Connection.prototype.append = function(data, options, cb) { + var literal = this.serverSupports('LITERAL+'); if (typeof options === 'function') { cb = options; options = undefined; @@ -323,10 +319,14 @@ Connection.prototype.append = function(data, options, cb) { } cmd += ' {'; cmd += (Buffer.isBuffer(data) ? data.length : Buffer.byteLength(data)); - cmd += '}'; + cmd += (literal ? '+' : '') + '}'; this._enqueue(cmd, cb); - this._queue[this._queue.length - 1].appendData = data; + + if (literal) + this._queue[this._queue.length - 1].literalAppendData = data; + else + this._queue[this._queue.length - 1].appendData = data; }; Connection.prototype.getBoxes = function(namespace, cb) { @@ -1677,6 +1677,23 @@ Connection.prototype._processQueue = function() { var out = prefix + ' ' + this._curReq.fullcmd; this.debug && this.debug('=> ' + inspect(out)); this._sock.write(out + CRLF, 'utf8'); + + if (! this._curReq.literalAppendData) + return; + + // LITERAL+: we are appending a mesage, and not waiting for a reply + this._sockWriteAppendData(this._curReq.literalAppendData); +}; + +Connection.prototype._sockWriteAppendData = function(appendData) +{ + var val = appendData; + if (Buffer.isBuffer(appendData)) + val = val.toString('utf8'); + + this.debug && this.debug('=> ' + inspect(val)); + this._sock.write(val); + this._sock.write(CRLF); }; Connection.prototype._enqueue = function(fullcmd, promote, cb) {