From 187b7d95589f674ce3262b05c311554bcd8f847c Mon Sep 17 00:00:00 2001 From: Igor Sysoev Date: Thu, 14 Jul 2005 12:51:53 +0000 Subject: nginx-0.1.39-RELEASE import *) The changes in the ngx_http_charset_module: the "default_charset" directive was canceled; the "charset" directive sets the response charset; the "source_charset" directive sets the source charset only. *) Bugfix: the backend "WWW-Authenticate" header line did not transferred while the 401 response code redirecting. *) Bugfix: the ngx_http_proxy_module and ngx_http_fastcgi_module may close a connection before anything was transferred to a client; the bug had appeared in 0.1.38. *) Workaround: the Linux glibc crypt_r() initialization bug. *) Bugfix: the ngx_http_ssi_module did not support the relative URI in the "include virtual" command. *) Bugfix: if the backend response had the "Location" header line and nginx should not rewrite this line, then the 500 code response body was transferred; the bug had appeared in 0.1.29. *) Bugfix: some directives of the ngx_http_proxy_module and ngx_http_fastcgi_module were not inherited from the server to the location level; the bug had appeared in 0.1.29. *) Bugfix: the ngx_http_ssl_module did not support the certificate chain. *) Bugfix: the ngx_http_autoindex_module did not show correctly the long file names; the bug had appeared in 0.1.38. *) Bugfixes in IMAP/POP3 proxy in interaction with a backend at the login state. --- src/imap/ngx_imap_proxy_module.c | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) (limited to 'src/imap/ngx_imap_proxy_module.c') diff --git a/src/imap/ngx_imap_proxy_module.c b/src/imap/ngx_imap_proxy_module.c index 5177e289f..81ddb8397 100644 --- a/src/imap/ngx_imap_proxy_module.c +++ b/src/imap/ngx_imap_proxy_module.c @@ -169,11 +169,21 @@ ngx_imap_proxy_imap_handler(ngx_event_t *rev) return; } - if (rc == NGX_ERROR) { + if (rc == NGX_ERROR || rc == NGX_IMAP_PROXY_INVALID) { ngx_imap_proxy_internal_server_error(s); return; } + if (rc == NGX_IMAP_PROXY_ERROR) { + s->connection->read->handler = ngx_imap_proxy_handler; + s->connection->write->handler = ngx_imap_proxy_handler; + rev->handler = ngx_imap_proxy_handler; + c->write->handler = ngx_imap_proxy_handler; + + ngx_imap_proxy_handler(c->read); + return; + } + switch (s->imap_state) { case ngx_imap_start: @@ -198,14 +208,14 @@ ngx_imap_proxy_imap_handler(ngx_event_t *rev) case ngx_imap_login: ngx_log_debug0(NGX_LOG_DEBUG_IMAP, rev->log, 0, "imap proxy send user"); - line.len = s->login.len + 1 + NGX_SIZE_T_LEN + 1 + 2; + line.len = s->login.len + 1 + 1 + NGX_SIZE_T_LEN + 1 + 2; line.data = ngx_palloc(c->pool, line.len); if (line.data == NULL) { ngx_imap_proxy_internal_server_error(s); return; } - line.len = ngx_sprintf(line.data, "%V{%uz}" CRLF, + line.len = ngx_sprintf(line.data, "%V {%uz}" CRLF, &s->login, s->passwd.len) - line.data; @@ -298,11 +308,21 @@ ngx_imap_proxy_pop3_handler(ngx_event_t *rev) return; } - if (rc == NGX_ERROR) { + if (rc == NGX_ERROR || rc == NGX_IMAP_PROXY_INVALID) { ngx_imap_proxy_internal_server_error(s); return; } + if (rc == NGX_IMAP_PROXY_ERROR) { + s->connection->read->handler = ngx_imap_proxy_handler; + s->connection->write->handler = ngx_imap_proxy_handler; + rev->handler = ngx_imap_proxy_handler; + c->write->handler = ngx_imap_proxy_handler; + + ngx_imap_proxy_handler(c->read); + return; + } + switch (s->imap_state) { case ngx_pop3_start: @@ -424,13 +444,17 @@ ngx_imap_proxy_read_response(ngx_imap_session_t *s, ngx_uint_t what) } } else { + if (p[0] == 'N' && p[1] == 'O') { + return NGX_IMAP_PROXY_ERROR; + } + if (what == NGX_IMAP_WAIT_OK) { if (p[0] == '*' && p[1] == ' ' && p[2] == 'O' && p[3] == 'K') { return NGX_OK; } } else { - if (p[0] == '+' && p[1] == ' ' && p[2] == 'O' && p[3] == 'K') { + if (p[0] == '+') { return NGX_OK; } } @@ -528,7 +552,7 @@ ngx_imap_proxy_handler(ngx_event_t *ev) if (n == NGX_AGAIN || n < (ssize_t) size) { if (ngx_handle_write_event(dst->write, /* TODO: LOWAT */ 0) - == NGX_ERROR) + == NGX_ERROR) { ngx_imap_proxy_close_session(s); return; -- cgit v1.2.3