Mercurial > hg > nginx-quic
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) { |