diff src/imap/ngx_imap_proxy.c @ 423:fda5987b188d

nginx-0.0.10-2004-09-13-20:18:09 import
author Igor Sysoev <igor@sysoev.ru>
date Mon, 13 Sep 2004 16:18:09 +0000
parents edaefb2a20fc
children 3f88935a02e8
line wrap: on
line diff
--- a/src/imap/ngx_imap_proxy.c
+++ b/src/imap/ngx_imap_proxy.c
@@ -41,10 +41,17 @@ void ngx_imap_proxy_init(ngx_imap_sessio
 
     peers->number = 1;
     peers->max_fails = 1;
+#if 0
     peers->peers[0].addr = inet_addr("81.19.69.70");
     peers->peers[0].addr_port_text.len = sizeof("81.19.69.70:110") - 1;
     peers->peers[0].addr_port_text.data = "81.19.69.70:110";
     peers->peers[0].port = htons(110);
+#else
+    peers->peers[0].addr = inet_addr("81.19.64.101");
+    peers->peers[0].addr_port_text.len = sizeof("81.19.64.101:110") - 1;
+    peers->peers[0].addr_port_text.data = "81.19.64.101:110";
+    peers->peers[0].port = htons(110);
+#endif
 
     rc = ngx_event_connect_peer(&p->upstream);
 
@@ -91,6 +98,12 @@ static void ngx_imap_proxy_auth_handler(
     c = rev->data;
     s = c->data;
 
+    if (rev->timedout) {
+        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");
+        ngx_imap_proxy_close_session(s);
+        return;
+    }
+
     if (s->proxy->buffer == NULL) {
         s->proxy->buffer = ngx_create_temp_buf(c->pool, /* STUB */ 4096);
         if (s->proxy->buffer == NULL) {
@@ -238,22 +251,49 @@ static void ngx_imap_proxy_handler(ngx_e
     size_t               size;
     ssize_t              n;
     ngx_buf_t           *b;
-    ngx_uint_t           data, do_write;
+    ngx_uint_t           again, do_write;
     ngx_connection_t    *c, *src, *dst;
     ngx_imap_session_t  *s;
 
     c = ev->data;
     s = c->data;
 
+    if (ev->timedout) {
+        if (c == s->connection) {
+            ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT,
+                          "client timed out");
+        } else {
+            ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT,
+                          "upstream timed out");
+        }
+
+        ngx_imap_proxy_close_session(s);
+        return;
+    }
+
     if (c == s->connection) {
-        src = c;
-        dst = s->proxy->upstream.connection;
-        b = s->buffer;
+        if (ev->write) {
+            src = s->proxy->upstream.connection;
+            dst = c;
+            b = s->proxy->buffer;
+
+        } else {
+            src = c;
+            dst = s->proxy->upstream.connection;
+            b = s->buffer;
+        }
 
     } else {
-        src = c;
-        dst = s->connection;
-        b = s->proxy->buffer;
+        if (ev->write) {
+            src = s->connection;
+            dst = c;
+            b = s->buffer;
+
+        } else {
+            src = c;
+            dst = s->connection;
+            b = s->proxy->buffer;
+        }
     }
 
     do_write = ev->write ? 1 : 0;
@@ -263,13 +303,13 @@ static void ngx_imap_proxy_handler(ngx_e
                    do_write, src->fd, dst->fd);
 
     do {
-        data = 0;
+        again = 0;
 
         if (do_write == 1) {
 
             size = b->last - b->pos;
 
-            if (dst->write->ready && size) {
+            if (size && dst->write->ready) {
                 n = ngx_send(dst, b->pos, size);
 
                 if (n == NGX_ERROR) {
@@ -278,7 +318,7 @@ static void ngx_imap_proxy_handler(ngx_e
                 }
 
                 if (n > 0) {
-                    data = 1;
+                    again = 1;
                     b->pos += n;
 
                     if (b->pos == b->last) {
@@ -301,7 +341,7 @@ static void ngx_imap_proxy_handler(ngx_e
 
         size = b->end - b->last;
 
-        if (src->read->ready && size) {
+        if (size && src->read->ready) {
             n = ngx_recv(src, b->last, size);
 
             if (n == NGX_ERROR || n == 0) {
@@ -310,7 +350,7 @@ static void ngx_imap_proxy_handler(ngx_e
             }
 
             if (n > 0) {
-                data = 1;
+                again = 1;
                 do_write = 1;
                 b->last += n;
             }
@@ -323,7 +363,7 @@ static void ngx_imap_proxy_handler(ngx_e
             }
         }
 
-    } while (data);
+    } while (again);
 }