Mercurial > hg > nginx
comparison src/imap/ngx_imap_auth_http_module.c @ 884:4d68c486fcb0
upstream choice modules
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 04 Dec 2006 16:46:13 +0000 |
parents | eac23634d614 |
children | a0310ac2814f |
comparison
equal
deleted
inserted
replaced
883:eac23634d614 | 884:4d68c486fcb0 |
---|---|
10 #include <ngx_event_connect.h> | 10 #include <ngx_event_connect.h> |
11 #include <ngx_imap.h> | 11 #include <ngx_imap.h> |
12 | 12 |
13 | 13 |
14 typedef struct { | 14 typedef struct { |
15 ngx_peers_t *peers; | 15 ngx_peer_addr_t *peer; |
16 | 16 |
17 ngx_msec_t timeout; | 17 ngx_msec_t timeout; |
18 | 18 |
19 ngx_str_t host_header; | 19 ngx_str_t host_header; |
20 ngx_str_t uri; | 20 ngx_str_t uri; |
173 return; | 173 return; |
174 } | 174 } |
175 | 175 |
176 ngx_imap_set_ctx(s, ctx, ngx_imap_auth_http_module); | 176 ngx_imap_set_ctx(s, ctx, ngx_imap_auth_http_module); |
177 | 177 |
178 ctx->peer.peers = ahcf->peers; | 178 ctx->peer.sockaddr = ahcf->peer->sockaddr; |
179 ctx->peer.socklen = ahcf->peer->socklen; | |
180 ctx->peer.name = &ahcf->peer->name; | |
181 ctx->peer.get = ngx_event_get_peer; | |
179 ctx->peer.log = s->connection->log; | 182 ctx->peer.log = s->connection->log; |
180 ctx->peer.log_error = NGX_ERROR_ERR; | 183 ctx->peer.log_error = NGX_ERROR_ERR; |
181 | 184 |
182 rc = ngx_event_connect_peer(&ctx->peer); | 185 rc = ngx_event_connect_peer(&ctx->peer); |
183 | 186 |
227 ngx_log_debug0(NGX_LOG_DEBUG_IMAP, wev->log, 0, | 230 ngx_log_debug0(NGX_LOG_DEBUG_IMAP, wev->log, 0, |
228 "imap auth http write handler"); | 231 "imap auth http write handler"); |
229 | 232 |
230 if (wev->timedout) { | 233 if (wev->timedout) { |
231 ngx_log_error(NGX_LOG_ERR, wev->log, NGX_ETIMEDOUT, | 234 ngx_log_error(NGX_LOG_ERR, wev->log, NGX_ETIMEDOUT, |
232 "auth http server %V timed out", | 235 "auth http server %V timed out", ctx->peer.name); |
233 &ctx->peer.peers->peer[0].name); | |
234 ngx_close_connection(ctx->peer.connection); | 236 ngx_close_connection(ctx->peer.connection); |
235 ngx_destroy_pool(ctx->pool); | 237 ngx_destroy_pool(ctx->pool); |
236 ngx_imap_session_internal_server_error(s); | 238 ngx_imap_session_internal_server_error(s); |
237 return; | 239 return; |
238 } | 240 } |
291 | 293 |
292 ctx = ngx_imap_get_module_ctx(s, ngx_imap_auth_http_module); | 294 ctx = ngx_imap_get_module_ctx(s, ngx_imap_auth_http_module); |
293 | 295 |
294 if (rev->timedout) { | 296 if (rev->timedout) { |
295 ngx_log_error(NGX_LOG_ERR, rev->log, NGX_ETIMEDOUT, | 297 ngx_log_error(NGX_LOG_ERR, rev->log, NGX_ETIMEDOUT, |
296 "auth http server %V timed out", | 298 "auth http server %V timed out", ctx->peer.name); |
297 &ctx->peer.peers->peer[0].name); | |
298 ngx_close_connection(ctx->peer.connection); | 299 ngx_close_connection(ctx->peer.connection); |
299 ngx_destroy_pool(ctx->pool); | 300 ngx_destroy_pool(ctx->pool); |
300 ngx_imap_session_internal_server_error(s); | 301 ngx_imap_session_internal_server_error(s); |
301 return; | 302 return; |
302 } | 303 } |
411 goto done; | 412 goto done; |
412 } | 413 } |
413 | 414 |
414 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, | 415 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, |
415 "auth http server &V sent invalid response", | 416 "auth http server &V sent invalid response", |
416 &ctx->peer.peers->peer[0].name); | 417 ctx->peer.name); |
417 ngx_close_connection(ctx->peer.connection); | 418 ngx_close_connection(ctx->peer.connection); |
418 ngx_destroy_pool(ctx->pool); | 419 ngx_destroy_pool(ctx->pool); |
419 ngx_imap_session_internal_server_error(s); | 420 ngx_imap_session_internal_server_error(s); |
420 return; | 421 return; |
421 } | 422 } |
445 { | 446 { |
446 u_char *p; | 447 u_char *p; |
447 time_t timer; | 448 time_t timer; |
448 size_t len, size; | 449 size_t len, size; |
449 ngx_int_t rc, port, n; | 450 ngx_int_t rc, port, n; |
450 ngx_peers_t *peers; | 451 ngx_peer_addr_t *peer; |
451 struct sockaddr_in *sin; | 452 struct sockaddr_in *sin; |
452 | 453 |
453 ngx_log_debug0(NGX_LOG_DEBUG_IMAP, s->connection->log, 0, | 454 ngx_log_debug0(NGX_LOG_DEBUG_IMAP, s->connection->log, 0, |
454 "imap auth http process headers"); | 455 "imap auth http process headers"); |
455 | 456 |
660 } | 661 } |
661 | 662 |
662 if (ctx->addr.len == 0 || ctx->port.len == 0) { | 663 if (ctx->addr.len == 0 || ctx->port.len == 0) { |
663 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, | 664 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, |
664 "auth http server %V did not send server or port", | 665 "auth http server %V did not send server or port", |
665 &ctx->peer.peers->peer[0].name); | 666 ctx->peer.name); |
666 ngx_destroy_pool(ctx->pool); | 667 ngx_destroy_pool(ctx->pool); |
667 ngx_imap_session_internal_server_error(s); | 668 ngx_imap_session_internal_server_error(s); |
668 return; | 669 return; |
669 } | 670 } |
670 | 671 |
671 if (s->passwd.data == NULL) { | 672 if (s->passwd.data == NULL) { |
672 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, | 673 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, |
673 "auth http server %V did not send password", | 674 "auth http server %V did not send password", |
674 &ctx->peer.peers->peer[0].name); | 675 ctx->peer.name); |
675 ngx_destroy_pool(ctx->pool); | 676 ngx_destroy_pool(ctx->pool); |
676 ngx_imap_session_internal_server_error(s); | 677 ngx_imap_session_internal_server_error(s); |
677 return; | 678 return; |
678 } | 679 } |
679 | 680 |
680 peers = ngx_pcalloc(s->connection->pool, sizeof(ngx_peers_t)); | 681 peer = ngx_pcalloc(s->connection->pool, sizeof(ngx_peer_addr_t)); |
681 if (peers == NULL) { | 682 if (peer == NULL) { |
682 ngx_destroy_pool(ctx->pool); | 683 ngx_destroy_pool(ctx->pool); |
683 ngx_imap_session_internal_server_error(s); | 684 ngx_imap_session_internal_server_error(s); |
684 return; | 685 return; |
685 } | 686 } |
686 | 687 |
696 port = ngx_atoi(ctx->port.data, ctx->port.len); | 697 port = ngx_atoi(ctx->port.data, ctx->port.len); |
697 if (port == NGX_ERROR || port < 1 || port > 65536) { | 698 if (port == NGX_ERROR || port < 1 || port > 65536) { |
698 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, | 699 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, |
699 "auth http server %V sent invalid server " | 700 "auth http server %V sent invalid server " |
700 "port:\"%V\"", | 701 "port:\"%V\"", |
701 &ctx->peer.peers->peer[0].name, &ctx->port); | 702 ctx->peer.name, &ctx->port); |
702 ngx_destroy_pool(ctx->pool); | 703 ngx_destroy_pool(ctx->pool); |
703 ngx_imap_session_internal_server_error(s); | 704 ngx_imap_session_internal_server_error(s); |
704 return; | 705 return; |
705 } | 706 } |
706 | 707 |
710 sin->sin_addr.s_addr = inet_addr((char *) ctx->addr.data); | 711 sin->sin_addr.s_addr = inet_addr((char *) ctx->addr.data); |
711 if (sin->sin_addr.s_addr == INADDR_NONE) { | 712 if (sin->sin_addr.s_addr == INADDR_NONE) { |
712 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, | 713 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, |
713 "auth http server %V sent invalid server " | 714 "auth http server %V sent invalid server " |
714 "address:\"%V\"", | 715 "address:\"%V\"", |
715 &ctx->peer.peers->peer[0].name, &ctx->addr); | 716 ctx->peer.name, &ctx->addr); |
716 ngx_destroy_pool(ctx->pool); | 717 ngx_destroy_pool(ctx->pool); |
717 ngx_imap_session_internal_server_error(s); | 718 ngx_imap_session_internal_server_error(s); |
718 return; | 719 return; |
719 } | 720 } |
720 | 721 |
721 peers->number = 1; | 722 peer->sockaddr = (struct sockaddr *) sin; |
722 | 723 peer->socklen = sizeof(struct sockaddr_in); |
723 peers->peer[0].sockaddr = (struct sockaddr *) sin; | |
724 peers->peer[0].socklen = sizeof(struct sockaddr_in); | |
725 | 724 |
726 len = ctx->addr.len + 1 + ctx->port.len; | 725 len = ctx->addr.len + 1 + ctx->port.len; |
727 | 726 |
728 peers->peer[0].name.len = len; | 727 peer->name.len = len; |
729 | 728 |
730 peers->peer[0].name.data = ngx_palloc(s->connection->pool, len); | 729 peer->name.data = ngx_palloc(s->connection->pool, len); |
731 if (peers->peer[0].name.data == NULL) { | 730 if (peer->name.data == NULL) { |
732 ngx_destroy_pool(ctx->pool); | 731 ngx_destroy_pool(ctx->pool); |
733 ngx_imap_session_internal_server_error(s); | 732 ngx_imap_session_internal_server_error(s); |
734 return; | 733 return; |
735 } | 734 } |
736 | 735 |
737 len = ctx->addr.len; | 736 len = ctx->addr.len; |
738 | 737 |
739 ngx_memcpy(peers->peer[0].name.data, ctx->addr.data, len); | 738 ngx_memcpy(peer->name.data, ctx->addr.data, len); |
740 | 739 |
741 peers->peer[0].name.data[len++] = ':'; | 740 peer->name.data[len++] = ':'; |
742 | 741 |
743 ngx_memcpy(peers->peer[0].name.data + len, | 742 ngx_memcpy(peer->name.data + len, ctx->port.data, ctx->port.len); |
744 ctx->port.data, ctx->port.len); | |
745 | |
746 peers->peer[0].uri_separator = ""; | |
747 | 743 |
748 ngx_destroy_pool(ctx->pool); | 744 ngx_destroy_pool(ctx->pool); |
749 ngx_imap_proxy_init(s, peers); | 745 ngx_imap_proxy_init(s, peer); |
750 | 746 |
751 return; | 747 return; |
752 } | 748 } |
753 | 749 |
754 if (rc == NGX_AGAIN ) { | 750 if (rc == NGX_AGAIN ) { |
757 | 753 |
758 /* rc == NGX_ERROR */ | 754 /* rc == NGX_ERROR */ |
759 | 755 |
760 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, | 756 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, |
761 "auth http server %V sent invalid header in response", | 757 "auth http server %V sent invalid header in response", |
762 &ctx->peer.peers->peer[0].name); | 758 ctx->peer.name); |
763 ngx_close_connection(ctx->peer.connection); | 759 ngx_close_connection(ctx->peer.connection); |
764 ngx_destroy_pool(ctx->pool); | 760 ngx_destroy_pool(ctx->pool); |
765 ngx_imap_session_internal_server_error(s); | 761 ngx_imap_session_internal_server_error(s); |
766 | 762 |
767 return; | 763 return; |
1240 u_char *p; | 1236 u_char *p; |
1241 size_t len; | 1237 size_t len; |
1242 ngx_uint_t i; | 1238 ngx_uint_t i; |
1243 ngx_table_elt_t *header; | 1239 ngx_table_elt_t *header; |
1244 | 1240 |
1245 if (conf->peers == NULL) { | 1241 if (conf->peer == NULL) { |
1246 conf->peers = prev->peers; | 1242 conf->peer = prev->peer; |
1247 conf->host_header = prev->host_header; | 1243 conf->host_header = prev->host_header; |
1248 conf->uri = prev->uri; | 1244 conf->uri = prev->uri; |
1249 } | 1245 } |
1250 | 1246 |
1251 ngx_conf_merge_msec_value(conf->timeout, prev->timeout, 60000); | 1247 ngx_conf_merge_msec_value(conf->timeout, prev->timeout, 60000); |
1295 ngx_memzero(&u, sizeof(ngx_url_t)); | 1291 ngx_memzero(&u, sizeof(ngx_url_t)); |
1296 | 1292 |
1297 u.url = value[1]; | 1293 u.url = value[1]; |
1298 u.default_portn = 80; | 1294 u.default_portn = 80; |
1299 u.uri_part = 1; | 1295 u.uri_part = 1; |
1296 u.one_addr = 1; | |
1300 | 1297 |
1301 if (ngx_parse_url(cf, &u) != NGX_OK) { | 1298 if (ngx_parse_url(cf, &u) != NGX_OK) { |
1302 if (u.err) { | 1299 if (u.err) { |
1303 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | 1300 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
1304 "%s in auth_http \"%V\"", u.err, &u.url); | 1301 "%s in auth_http \"%V\"", u.err, &u.url); |
1305 } | 1302 } |
1306 } | 1303 } |
1307 | 1304 |
1308 ahcf->peers = u.peers; | 1305 ahcf->peer = u.addrs; |
1309 ahcf->peers->number = 1; | |
1310 | 1306 |
1311 ahcf->host_header = u.host_header; | 1307 ahcf->host_header = u.host_header; |
1312 ahcf->uri = u.uri; | 1308 ahcf->uri = u.uri; |
1313 | 1309 |
1314 if (ahcf->uri.len == 0) { | 1310 if (ahcf->uri.len == 0) { |