diff options
author | Maxim Dounin <mdounin@mdounin.ru> | 2013-09-30 22:09:57 +0400 |
---|---|---|
committer | Maxim Dounin <mdounin@mdounin.ru> | 2013-09-30 22:09:57 +0400 |
commit | 4f6f653f482abc3b963727ea5f2c5d708d8fd605 (patch) | |
tree | f60612bbd54711ac76addbea535e8647ca119775 /src/mail/ngx_mail_handler.c | |
parent | f86169ae7bbb30d0955be03a0adad1d1cd73a046 (diff) | |
download | nginx-4f6f653f482abc3b963727ea5f2c5d708d8fd605.tar.gz nginx-4f6f653f482abc3b963727ea5f2c5d708d8fd605.zip |
Mail: smtp pipelining support.
Basically, this does the following two changes (and corresponding
modifications of related code):
1. Does not reset session buffer unless it's reached it's end, and always
wait for LF to terminate command (even if we detected invalid command).
2. Record command name to make it available for handlers (since now we
can't assume that command starts from s->buffer->start).
Diffstat (limited to 'src/mail/ngx_mail_handler.c')
-rw-r--r-- | src/mail/ngx_mail_handler.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/src/mail/ngx_mail_handler.c b/src/mail/ngx_mail_handler.c index ae955f9c6..7cfff1a07 100644 --- a/src/mail/ngx_mail_handler.c +++ b/src/mail/ngx_mail_handler.c @@ -620,7 +620,9 @@ ngx_mail_read_command(ngx_mail_session_t *s, ngx_connection_t *c) return NGX_ERROR; } - return NGX_AGAIN; + if (s->buffer->pos == s->buffer->last) { + return NGX_AGAIN; + } } cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); @@ -661,8 +663,12 @@ void ngx_mail_auth(ngx_mail_session_t *s, ngx_connection_t *c) { s->args.nelts = 0; - s->buffer->pos = s->buffer->start; - s->buffer->last = s->buffer->start; + + if (s->buffer->pos == s->buffer->last) { + s->buffer->pos = s->buffer->start; + s->buffer->last = s->buffer->start; + } + s->state = 0; if (c->read->timer_set) { |