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) {