# HG changeset patch # User Igor Sysoev # Date 1165153729 0 # Node ID eac23634d614f6351fa77ccf983d3c2030cacb5d # Parent 26c3e48b9996c80d78ad1248bd07bc5d7dd57f6f Auth-Status: WAIT diff --git a/src/imap/ngx_imap.h b/src/imap/ngx_imap.h --- 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; diff --git a/src/imap/ngx_imap_auth_http_module.c b/src/imap/ngx_imap_auth_http_module.c --- 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;