changeset 883:eac23634d614

Auth-Status: WAIT
author Igor Sysoev <igor@sysoev.ru>
date Sun, 03 Dec 2006 13:48:49 +0000
parents 26c3e48b9996
children 4d68c486fcb0
files src/imap/ngx_imap.h src/imap/ngx_imap_auth_http_module.c
diffstat 2 files changed, 34 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/imap/ngx_imap.h
+++ b/src/imap/ngx_imap.h
@@ -160,6 +160,7 @@ typedef struct {
     unsigned                no_sync_literal:1;
     unsigned                starttls:1;
     unsigned                auth_method:2;
+    unsigned                auth_wait:1;
 
     ngx_str_t               login;
     ngx_str_t               passwd;
--- a/src/imap/ngx_imap_auth_http_module.c
+++ b/src/imap/ngx_imap_auth_http_module.c
@@ -488,6 +488,16 @@ ngx_imap_auth_http_process_headers(ngx_i
                     continue;
                 }
 
+                if (len == 4
+                    && ctx->header_start[0] == 'W'
+                    && ctx->header_start[1] == 'A'
+                    && ctx->header_start[2] == 'I'
+                    && ctx->header_start[3] == 'T')
+                {
+                    s->auth_wait = 1;
+                    continue;
+                }
+
                 ctx->errmsg.len = len;
                 ctx->errmsg.data = ctx->header_start;
 
@@ -632,6 +642,23 @@ ngx_imap_auth_http_process_headers(ngx_i
                 return;
             }
 
+            if (s->auth_wait) {
+                timer = ctx->sleep;
+
+                ngx_destroy_pool(ctx->pool);
+
+                if (timer == 0) {
+                    ngx_imap_auth_http_init(s);
+                    return;
+                }
+
+                ngx_add_timer(s->connection->read, timer * 1000);
+
+                s->connection->read->handler = ngx_imap_auth_sleep_handler;
+
+                return;
+            }
+
             if (ctx->addr.len == 0 || ctx->port.len == 0) {
                 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
                               "auth http server %V did not send server or port",
@@ -758,6 +785,12 @@ ngx_imap_auth_sleep_handler(ngx_event_t 
 
         rev->timedout = 0;
 
+        if (s->auth_wait) {
+            s->auth_wait = 0;
+            ngx_imap_auth_http_init(s);
+            return;
+        }
+
         if (s->protocol == NGX_IMAP_POP3_PROTOCOL) {
             s->imap_state = ngx_pop3_start;
             s->connection->read->handler = ngx_pop3_auth_state;