Adds correct respect for contiunation responses following APPEND

fork
Andrew Jessup 12 years ago
parent 0b319c31a0
commit 189e4c4e4e

@ -414,7 +414,8 @@ ImapConnection.prototype.connect = function(loginCb) {
}
}
}
} else if (data[0][0] === 'A') { // Tagged server response
} else if (data[0][0] === 'A' ||
(data[0] === '+' && self._state.requests.length ) ) { // Tagged server response or continutation response
var sendBox = false;
clearTimeout(self._state.tmrKeepalive);
@ -427,7 +428,7 @@ ImapConnection.prototype.connect = function(loginCb) {
self._resetBox();
}
}
debugger;
if (self._state.requests[0].command.indexOf('RENAME') > -1) {
self._state.box.name = self._state.box._newName;
delete self._state.box._newName;
@ -438,7 +439,14 @@ ImapConnection.prototype.connect = function(loginCb) {
var err = null;
var args = self._state.requests[0].args,
cmd = self._state.requests[0].command;
if (data[1] !== 'OK') {
if (data[0] === '+') {
if (cmd.indexOf('APPEND') !== 0) {
err = new Error('Unexpected continuation');
err.type = 'continuation';
err.request = cmd;
} else
return self._state.requests[0].callback();
} else if (data[1] !== 'OK') {
err = new Error('Error while executing request: ' + data[2]);
err.type = data[1];
err.request = cmd;
@ -466,6 +474,7 @@ ImapConnection.prototype.connect = function(loginCb) {
self.capabilities.indexOf('IDLE') > -1) {
// According to RFC 2177, we should re-IDLE at least every 29
// minutes to avoid disconnection by the server
debugger;
self._send('IDLE', undefined, true);
}
self._state.tmrKeepalive = setTimeout(function() {
@ -639,17 +648,17 @@ ImapConnection.prototype.append = function(data, options, cb) {
cmd += ('0'+(-options.date.getTimezoneOffset() % 60)).slice(-2);
cmd += '"';
}
if (data instanceof Buffer) {
cmd += ' {'+data.length+"}\r\n"
cmdbuf = new Buffer(Buffer.byteLength(cmd)+data.length);
cmdbuf.write(cmd);
data.copy(cmdbuf, Buffer.byteLength(cmd));
this._send(cmdbuf, cb);
} else {
cmd += ' {'+Buffer.byteLength(data.toString())+"}\r\n"
cmd += data.toString(); // Send the command+data as a string
this._send(cmd, cb);
}
cmd += ' {';
cmd += (Buffer.isBuffer(data) ? data.length : Buffer.byteLength(data));
cmd += '}\r\n';
var self = this, step = 1;
this._send(cmd, function(err) {
if (err || step++ === 2)
return cb(err);
self._state.conn.cleartext.write(data);
self._state.conn.cleartext.write(CRLF);
debug('\n<<SENT>>: ' + util.inspect(data.toString()) + '\n');
});
}
ImapConnection.prototype.fetch = function(uids, options) {
@ -976,12 +985,12 @@ ImapConnection.prototype._noop = function() {
if (this._state.status >= STATES.AUTH)
this._send('NOOP');
};
ImapConnection.prototype._send = function(cmdobj, cb, bypass) {
if (typeof cmdobj !== 'undefined' && !bypass)
this._state.requests.push({ command: cmdobj, callback: cb, args: [] });
if ((typeof cmdobj === 'undefined' && this._state.requests.length) ||
ImapConnection.prototype._send = function(cmdstr, cb, bypass) {
if (typeof cmdstr !== 'undefined' && !bypass)
this._state.requests.push({ command: cmdstr, callback: cb, args: [] });
if ((typeof cmdstr === 'undefined' && this._state.requests.length) ||
this._state.requests.length === 1 || bypass) {
var prefix = '', cmd = (bypass ? cmdobj : this._state.requests[0].command);
var prefix = '', cmd = (bypass ? cmdstr : this._state.requests[0].command);
clearTimeout(this._state.tmrKeepalive);
if (this._state.ext.idle.sentIdle && cmd !== 'DONE') {
this._send('DONE', undefined, true);

Loading…
Cancel
Save