Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nginx/nginx.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src/imap
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2005-07-14 16:51:53 +0400
committerIgor Sysoev <igor@sysoev.ru>2005-07-14 16:51:53 +0400
commit187b7d95589f674ce3262b05c311554bcd8f847c (patch)
tree0ac48dad3e3204d12837c2562d99020eafe29038 /src/imap
parentb3ad9f30d960bd1dcc3d8fd5c9963bf3e93bb7b3 (diff)
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')
-rw-r--r--src/imap/ngx_imap_handler.c4
-rw-r--r--src/imap/ngx_imap_parse.c5
-rw-r--r--src/imap/ngx_imap_proxy_module.c36
3 files changed, 35 insertions, 10 deletions
diff --git a/src/imap/ngx_imap_handler.c b/src/imap/ngx_imap_handler.c
index 6464d4a85..25509b2fe 100644
--- a/src/imap/ngx_imap_handler.c
+++ b/src/imap/ngx_imap_handler.c
@@ -16,7 +16,7 @@ static ngx_int_t ngx_imap_read_command(ngx_imap_session_t *s);
static ngx_str_t greetings[] = {
ngx_string("+OK POP3 ready" CRLF),
- ngx_string("* OK IMAP ready" CRLF)
+ ngx_string("* OK IMAP4 ready" CRLF)
};
static ngx_str_t internal_server_errors[] = {
@@ -27,7 +27,7 @@ static ngx_str_t internal_server_errors[] = {
static u_char pop3_ok[] = "+OK" CRLF;
static u_char pop3_invalid_command[] = "-ERR invalid command" CRLF;
-static u_char imap_ok[] = "OK" CRLF;
+static u_char imap_ok[] = "OK completed" CRLF;
static u_char imap_next[] = "+ OK" CRLF;
static u_char imap_bye[] = "* BYE" CRLF;
static u_char imap_invalid_command[] = "BAD invalid command" CRLF;
diff --git a/src/imap/ngx_imap_parse.c b/src/imap/ngx_imap_parse.c
index e3923e892..374605ec5 100644
--- a/src/imap/ngx_imap_parse.c
+++ b/src/imap/ngx_imap_parse.c
@@ -252,7 +252,7 @@ ngx_int_t ngx_imap_parse_command(ngx_imap_session_t *s)
goto invalid;
case sw_literal_argument:
- if (--s->literal_len) {
+ if (s->literal_len && --s->literal_len) {
break;
}
@@ -281,7 +281,8 @@ ngx_int_t ngx_imap_parse_command(ngx_imap_session_t *s)
case LF:
goto done;
default:
- goto invalid;
+ state = sw_spaces_before_argument;
+ break;
}
break;
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;