diff src/imap/ngx_imap_proxy_module.c @ 529:e5d7d0334fdb release-0.1.39

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.
author Igor Sysoev <igor@sysoev.ru>
date Thu, 14 Jul 2005 12:51:53 +0000
parents 7fa11e5c6e96
children c3bd8cdabb8f
line wrap: on
line diff
--- 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 
         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 
     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 
         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_se
         }
 
     } 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;