comparison src/imap/ngx_imap_auth_http_module.c @ 541:b09ee85d0ac8 release-0.1.45

nginx-0.1.45-RELEASE import *) Change: the "ssl_engine" directive was canceled in the ngx_http_ssl_module and now is introduced at global level. *) Bugfix: the responses with SSI subrequests did not transferred via SSL connection. *) Various bug fixes in the IMAP/POP3 proxy.
author Igor Sysoev <igor@sysoev.ru>
date Thu, 08 Sep 2005 14:36:09 +0000
parents 371c1cee100d
children 511a89da35ad
comparison
equal deleted inserted replaced
540:983c48ab79bb 541:b09ee85d0ac8
103 ngx_module_t ngx_imap_auth_http_module = { 103 ngx_module_t ngx_imap_auth_http_module = {
104 NGX_MODULE_V1, 104 NGX_MODULE_V1,
105 &ngx_imap_auth_http_module_ctx, /* module context */ 105 &ngx_imap_auth_http_module_ctx, /* module context */
106 ngx_imap_auth_http_commands, /* module directives */ 106 ngx_imap_auth_http_commands, /* module directives */
107 NGX_IMAP_MODULE, /* module type */ 107 NGX_IMAP_MODULE, /* module type */
108 NULL, /* init master */
108 NULL, /* init module */ 109 NULL, /* init module */
109 NULL /* init process */ 110 NULL, /* init process */
111 NULL, /* init thread */
112 NULL, /* exit thread */
113 NULL, /* exit process */
114 NULL, /* exit master */
115 NGX_MODULE_V1_PADDING
110 }; 116 };
111 117
112 118
113 static char *ngx_imap_auth_http_protocol[] = { "pop3", "imap" }; 119 static char *ngx_imap_auth_http_protocol[] = { "pop3", "imap" };
114 120
118 { 124 {
119 ngx_int_t rc; 125 ngx_int_t rc;
120 ngx_imap_auth_http_ctx_t *ctx; 126 ngx_imap_auth_http_ctx_t *ctx;
121 ngx_imap_auth_http_conf_t *ahcf; 127 ngx_imap_auth_http_conf_t *ahcf;
122 128
129 s->connection->log->action = "in http auth state";
130
123 ctx = ngx_pcalloc(s->connection->pool, sizeof(ngx_imap_auth_http_ctx_t)); 131 ctx = ngx_pcalloc(s->connection->pool, sizeof(ngx_imap_auth_http_ctx_t));
124 if (ctx == NULL) { 132 if (ctx == NULL) {
125 ngx_imap_session_internal_server_error(s); 133 ngx_imap_session_internal_server_error(s);
126 return; 134 return;
127 } 135 }
140 ctx->peer.log = s->connection->log; 148 ctx->peer.log = s->connection->log;
141 ctx->peer.log_error = NGX_ERROR_ERR; 149 ctx->peer.log_error = NGX_ERROR_ERR;
142 150
143 rc = ngx_event_connect_peer(&ctx->peer); 151 rc = ngx_event_connect_peer(&ctx->peer);
144 152
145 if (rc == NGX_ERROR) { 153 if (rc == NGX_ERROR || rc == NGX_CONNECT_ERROR) {
146 ngx_imap_session_internal_server_error(s); 154 ngx_imap_session_internal_server_error(s);
147 return; 155 return;
148 } 156 }
149 157
150 ctx->peer.connection->data = s; 158 ctx->peer.connection->data = s;
154 ctx->peer.connection->read->handler = ngx_imap_auth_http_read_handler; 162 ctx->peer.connection->read->handler = ngx_imap_auth_http_read_handler;
155 ctx->peer.connection->write->handler = ngx_imap_auth_http_write_handler; 163 ctx->peer.connection->write->handler = ngx_imap_auth_http_write_handler;
156 164
157 ctx->handler = ngx_imap_auth_http_ignore_status_line; 165 ctx->handler = ngx_imap_auth_http_ignore_status_line;
158 166
167 ngx_add_timer(ctx->peer.connection->read, ahcf->timeout);
168 ngx_add_timer(ctx->peer.connection->write, ahcf->timeout);
169
159 if (rc == NGX_OK) { 170 if (rc == NGX_OK) {
160 ngx_imap_auth_http_write_handler(ctx->peer.connection->write); 171 ngx_imap_auth_http_write_handler(ctx->peer.connection->write);
161 return; 172 return;
162 } 173 }
163
164 ngx_add_timer(ctx->peer.connection->read, ahcf->timeout);
165 ngx_add_timer(ctx->peer.connection->write, ahcf->timeout);
166 } 174 }
167 175
168 176
169 static void 177 static void
170 ngx_imap_auth_http_write_handler(ngx_event_t *wev) 178 ngx_imap_auth_http_write_handler(ngx_event_t *wev)
183 ngx_log_debug0(NGX_LOG_DEBUG_IMAP, wev->log, 0, 191 ngx_log_debug0(NGX_LOG_DEBUG_IMAP, wev->log, 0,
184 "imap auth http write handler"); 192 "imap auth http write handler");
185 193
186 if (wev->timedout) { 194 if (wev->timedout) {
187 ngx_log_error(NGX_LOG_ERR, wev->log, NGX_ETIMEDOUT, 195 ngx_log_error(NGX_LOG_ERR, wev->log, NGX_ETIMEDOUT,
188 "auth http server timed out"); 196 "auth http server %V timed out",
197 &ctx->peer.peers->peer[0].name);
189 ngx_close_connection(ctx->peer.connection); 198 ngx_close_connection(ctx->peer.connection);
190 ngx_imap_session_internal_server_error(s); 199 ngx_imap_session_internal_server_error(s);
191 return; 200 return;
192 } 201 }
193 202
238 247
239 ctx = ngx_imap_get_module_ctx(s, ngx_imap_auth_http_module); 248 ctx = ngx_imap_get_module_ctx(s, ngx_imap_auth_http_module);
240 249
241 if (rev->timedout) { 250 if (rev->timedout) {
242 ngx_log_error(NGX_LOG_ERR, rev->log, NGX_ETIMEDOUT, 251 ngx_log_error(NGX_LOG_ERR, rev->log, NGX_ETIMEDOUT,
243 "auth http server timed out"); 252 "auth http server %V timed out",
253 &ctx->peer.peers->peer[0].name);
244 ngx_close_connection(ctx->peer.connection); 254 ngx_close_connection(ctx->peer.connection);
245 ngx_imap_session_internal_server_error(s); 255 ngx_imap_session_internal_server_error(s);
246 return; 256 return;
247 } 257 }
248 258
353 if (ch == LF) { 363 if (ch == LF) {
354 goto done; 364 goto done;
355 } 365 }
356 366
357 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, 367 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
358 "auth http server sent invalid response"); 368 "auth http server &V sent invalid response",
369 &ctx->peer.peers->peer[0].name);
359 ngx_close_connection(ctx->peer.connection); 370 ngx_close_connection(ctx->peer.connection);
360 ngx_imap_session_internal_server_error(s); 371 ngx_imap_session_internal_server_error(s);
361 return; 372 return;
362 } 373 }
363 } 374 }
518 if (ctx->err.len) { 529 if (ctx->err.len) {
519 s->out = ctx->err; 530 s->out = ctx->err;
520 531
521 if (ctx->sleep == 0) { 532 if (ctx->sleep == 0) {
522 s->quit = 1; 533 s->quit = 1;
534
535 ngx_imap_send(s->connection->write);
536
537 return;
523 } 538 }
524
525 ngx_imap_send(s->connection->write);
526 539
527 ngx_add_timer(s->connection->read, ctx->sleep * 1000); 540 ngx_add_timer(s->connection->read, ctx->sleep * 1000);
528 541
529 s->connection->read->handler = ngx_imap_auth_sleep_handler; 542 s->connection->read->handler = ngx_imap_auth_sleep_handler;
530 543
531 return; 544 return;
532 } 545 }
533 546
534 if (ctx->addr.len == 0 || ctx->port.len == 0) { 547 if (ctx->addr.len == 0 || ctx->port.len == 0) {
535 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, 548 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
536 "auth http server did not send server or port"); 549 "auth http server %V did not send server or port",
550 &ctx->peer.peers->peer[0].name);
537 ngx_imap_session_internal_server_error(s); 551 ngx_imap_session_internal_server_error(s);
538 return; 552 return;
539 } 553 }
540 554
541 ctx->peers = ngx_pcalloc(s->connection->pool, sizeof(ngx_peers_t)); 555 ctx->peers = ngx_pcalloc(s->connection->pool, sizeof(ngx_peers_t));
553 sin->sin_family = AF_INET; 567 sin->sin_family = AF_INET;
554 568
555 port = ngx_atoi(ctx->port.data, ctx->port.len); 569 port = ngx_atoi(ctx->port.data, ctx->port.len);
556 if (port == NGX_ERROR || port < 1 || port > 65536) { 570 if (port == NGX_ERROR || port < 1 || port > 65536) {
557 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, 571 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
558 "auth http server sent invalid server " 572 "auth http server %V sent invalid server "
559 "port:\"%V\"", &ctx->port); 573 "port:\"%V\"",
574 &ctx->peer.peers->peer[0].name, &ctx->port);
560 ngx_imap_session_internal_server_error(s); 575 ngx_imap_session_internal_server_error(s);
561 return; 576 return;
562 } 577 }
563 578
564 sin->sin_port = htons((in_port_t) port); 579 sin->sin_port = htons((in_port_t) port);
565 580
566 ctx->addr.data[ctx->addr.len] = '\0'; 581 ctx->addr.data[ctx->addr.len] = '\0';
567 sin->sin_addr.s_addr = inet_addr((char *) ctx->addr.data); 582 sin->sin_addr.s_addr = inet_addr((char *) ctx->addr.data);
568 if (sin->sin_addr.s_addr == INADDR_NONE) { 583 if (sin->sin_addr.s_addr == INADDR_NONE) {
569 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, 584 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
570 "auth http server sent invalid server " 585 "auth http server %V sent invalid server "
571 "address:\"%V\"", &ctx->addr); 586 "address:\"%V\"",
587 &ctx->peer.peers->peer[0].name, &ctx->addr);
572 ngx_imap_session_internal_server_error(s); 588 ngx_imap_session_internal_server_error(s);
573 return; 589 return;
574 } 590 }
575 591
576 ctx->peers->number = 1; 592 ctx->peers->number = 1;
610 } 626 }
611 627
612 /* rc == NGX_ERROR */ 628 /* rc == NGX_ERROR */
613 629
614 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, 630 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
615 "auth http server sent invalid header in response"); 631 "auth http server %V sent invalid header in response",
632 &ctx->peer.peers->peer[0].name);
616 ngx_close_connection(ctx->peer.connection); 633 ngx_close_connection(ctx->peer.connection);
617 ngx_imap_session_internal_server_error(s); 634 ngx_imap_session_internal_server_error(s);
618 635
619 return; 636 return;
620 } 637 }
651 } 668 }
652 669
653 if (ngx_handle_read_event(rev, 0) == NGX_ERROR) { 670 if (ngx_handle_read_event(rev, 0) == NGX_ERROR) {
654 ngx_imap_close_connection(s->connection); 671 ngx_imap_close_connection(s->connection);
655 } 672 }
673
674 ngx_imap_send(s->connection->write);
656 675
657 return; 676 return;
658 } 677 }
659 678
660 if (rev->active) { 679 if (rev->active) {