diff options
author | Igor Sysoev <igor@sysoev.ru> | 2005-07-14 12:51:53 +0000 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2005-07-14 12:51:53 +0000 |
commit | 187b7d95589f674ce3262b05c311554bcd8f847c (patch) | |
tree | 0ac48dad3e3204d12837c2562d99020eafe29038 /src/imap/ngx_imap_proxy_module.c | |
parent | b3ad9f30d960bd1dcc3d8fd5c9963bf3e93bb7b3 (diff) | |
download | nginx-187b7d95589f674ce3262b05c311554bcd8f847c.tar.gz nginx-187b7d95589f674ce3262b05c311554bcd8f847c.zip |
nginx-0.1.39-RELEASE importrelease-0.1.39
*) 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.
Diffstat (limited to 'src/imap/ngx_imap_proxy_module.c')
-rw-r--r-- | src/imap/ngx_imap_proxy_module.c | 36 |
1 files changed, 30 insertions, 6 deletions
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; |