annotate src/mail/ngx_mail_proxy_module.c @ 7690:8253424d1aff

Added size check to ngx_http_alloc_large_header_buffer(). This ensures that copying won't write more than the buffer size even if the buffer comes from hc->free and it is smaller than the large client header buffer size in the virtual host configuration. This might happen if size of large client header buffers is different in name-based virtual hosts, similarly to the problem with number of buffers fixed in 6926:e662cbf1b932.
author Maxim Dounin <mdounin@mdounin.ru>
date Thu, 06 Aug 2020 05:02:22 +0300
parents 9c29644f6d03
children d63c5373b5ba
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 426
diff changeset
1
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 426
diff changeset
2 /*
444
42d11f017717 nginx-0.1.0-2004-09-29-20:00:49 import; remove years from copyright
Igor Sysoev <igor@sysoev.ru>
parents: 441
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 4273
diff changeset
4 * Copyright (C) Nginx, Inc.
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 426
diff changeset
5 */
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 426
diff changeset
6
418
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10 #include <ngx_event.h>
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
11 #include <ngx_event_connect.h>
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
12 #include <ngx_mail.h>
418
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
13
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
14
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
15 typedef struct {
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
16 ngx_flag_t enable;
857
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
17 ngx_flag_t pass_error_message;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
18 ngx_flag_t xclient;
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
19 size_t buffer_size;
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
20 ngx_msec_t timeout;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
21 } ngx_mail_proxy_conf_t;
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
22
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
23
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
24 static void ngx_mail_proxy_block_read(ngx_event_t *rev);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
25 static void ngx_mail_proxy_pop3_handler(ngx_event_t *rev);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
26 static void ngx_mail_proxy_imap_handler(ngx_event_t *rev);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
27 static void ngx_mail_proxy_smtp_handler(ngx_event_t *rev);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
28 static void ngx_mail_proxy_dummy_handler(ngx_event_t *ev);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
29 static ngx_int_t ngx_mail_proxy_read_response(ngx_mail_session_t *s,
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
30 ngx_uint_t state);
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
31 static void ngx_mail_proxy_handler(ngx_event_t *ev);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
32 static void ngx_mail_proxy_upstream_error(ngx_mail_session_t *s);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
33 static void ngx_mail_proxy_internal_server_error(ngx_mail_session_t *s);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
34 static void ngx_mail_proxy_close_session(ngx_mail_session_t *s);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
35 static void *ngx_mail_proxy_create_conf(ngx_conf_t *cf);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
36 static char *ngx_mail_proxy_merge_conf(ngx_conf_t *cf, void *parent,
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
37 void *child);
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
38
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
39
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
40 static ngx_command_t ngx_mail_proxy_commands[] = {
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
41
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
42 { ngx_string("proxy"),
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
43 NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG,
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
44 ngx_conf_set_flag_slot,
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
45 NGX_MAIL_SRV_CONF_OFFSET,
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
46 offsetof(ngx_mail_proxy_conf_t, enable),
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
47 NULL },
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
48
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
49 { ngx_string("proxy_buffer"),
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
50 NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
51 ngx_conf_set_size_slot,
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
52 NGX_MAIL_SRV_CONF_OFFSET,
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
53 offsetof(ngx_mail_proxy_conf_t, buffer_size),
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
54 NULL },
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
55
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
56 { ngx_string("proxy_timeout"),
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
57 NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
58 ngx_conf_set_msec_slot,
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
59 NGX_MAIL_SRV_CONF_OFFSET,
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
60 offsetof(ngx_mail_proxy_conf_t, timeout),
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
61 NULL },
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
62
857
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
63 { ngx_string("proxy_pass_error_message"),
4273
e444e8f6538b Fixed NGX_CONF_TAKE1/NGX_CONF_FLAG misuse.
Sergey Budnevitch <sb@waeme.net>
parents: 3516
diff changeset
64 NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG,
857
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
65 ngx_conf_set_flag_slot,
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
66 NGX_MAIL_SRV_CONF_OFFSET,
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
67 offsetof(ngx_mail_proxy_conf_t, pass_error_message),
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
68 NULL },
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
69
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
70 { ngx_string("xclient"),
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
71 NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG,
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
72 ngx_conf_set_flag_slot,
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
73 NGX_MAIL_SRV_CONF_OFFSET,
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
74 offsetof(ngx_mail_proxy_conf_t, xclient),
857
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
75 NULL },
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
76
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
77 ngx_null_command
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
78 };
418
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
79
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
81 static ngx_mail_module_t ngx_mail_proxy_module_ctx = {
1487
f69493e8faab ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents: 1342
diff changeset
82 NULL, /* protocol */
f69493e8faab ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents: 1342
diff changeset
83
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
84 NULL, /* create main configuration */
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
85 NULL, /* init main configuration */
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
86
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
87 ngx_mail_proxy_create_conf, /* create server configuration */
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
88 ngx_mail_proxy_merge_conf /* merge server configuration */
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
89 };
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
90
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
91
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
92 ngx_module_t ngx_mail_proxy_module = {
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
93 NGX_MODULE_V1,
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
94 &ngx_mail_proxy_module_ctx, /* module context */
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
95 ngx_mail_proxy_commands, /* module directives */
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
96 NGX_MAIL_MODULE, /* module type */
541
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
97 NULL, /* init master */
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
98 NULL, /* init module */
541
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
99 NULL, /* init process */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
100 NULL, /* init thread */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
101 NULL, /* exit thread */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
102 NULL, /* exit process */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
103 NULL, /* exit master */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
104 NGX_MODULE_V1_PADDING
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
105 };
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
106
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
107
2440
939b40aa9ab4 update r2439: make clear name
Igor Sysoev <igor@sysoev.ru>
parents: 2438
diff changeset
108 static u_char smtp_auth_ok[] = "235 2.0.0 OK" CRLF;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
109
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
110
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
111 void
3269
f0d596e84634 rename ngx_peer_addr_t to ngx_addr_t
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
112 ngx_mail_proxy_init(ngx_mail_session_t *s, ngx_addr_t *peer)
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
113 {
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
114 ngx_int_t rc;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
115 ngx_mail_proxy_ctx_t *p;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
116 ngx_mail_proxy_conf_t *pcf;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
117 ngx_mail_core_srv_conf_t *cscf;
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
118
587
284cc140593b nginx-0.3.15-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
119 s->connection->log->action = "connecting to upstream";
284cc140593b nginx-0.3.15-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
120
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
121 cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);
587
284cc140593b nginx-0.3.15-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
122
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
123 p = ngx_pcalloc(s->connection->pool, sizeof(ngx_mail_proxy_ctx_t));
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
124 if (p == NULL) {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
125 ngx_mail_session_internal_server_error(s);
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
126 return;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
127 }
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
128
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
129 s->proxy = p;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
130
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 857
diff changeset
131 p->upstream.sockaddr = peer->sockaddr;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 857
diff changeset
132 p->upstream.socklen = peer->socklen;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 857
diff changeset
133 p->upstream.name = &peer->name;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 857
diff changeset
134 p->upstream.get = ngx_event_get_peer;
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
135 p->upstream.log = s->connection->log;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
136 p->upstream.log_error = NGX_ERROR_ERR;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
137
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
138 rc = ngx_event_connect_peer(&p->upstream);
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
139
543
511a89da35ad nginx-0.2.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
140 if (rc == NGX_ERROR || rc == NGX_BUSY || rc == NGX_DECLINED) {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
141 ngx_mail_proxy_internal_server_error(s);
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
142 return;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
143 }
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
144
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
145 ngx_add_timer(p->upstream.connection->read, cscf->timeout);
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
146
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
147 p->upstream.connection->data = s;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
148 p->upstream.connection->pool = s->connection->pool;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
149
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
150 s->connection->read->handler = ngx_mail_proxy_block_read;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
151 p->upstream.connection->write->handler = ngx_mail_proxy_dummy_handler;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
152
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
153 pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
154
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
155 s->proxy->buffer = ngx_create_temp_buf(s->connection->pool,
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
156 pcf->buffer_size);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
157 if (s->proxy->buffer == NULL) {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
158 ngx_mail_proxy_internal_server_error(s);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
159 return;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
160 }
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
161
1981
65581f79e81b reset message
Igor Sysoev <igor@sysoev.ru>
parents: 1892
diff changeset
162 s->out.len = 0;
65581f79e81b reset message
Igor Sysoev <igor@sysoev.ru>
parents: 1892
diff changeset
163
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
164 switch (s->protocol) {
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
165
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
166 case NGX_MAIL_POP3_PROTOCOL:
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
167 p->upstream.connection->read->handler = ngx_mail_proxy_pop3_handler;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
168 s->mail_state = ngx_pop3_start;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
169 break;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
170
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
171 case NGX_MAIL_IMAP_PROTOCOL:
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
172 p->upstream.connection->read->handler = ngx_mail_proxy_imap_handler;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
173 s->mail_state = ngx_imap_start;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
174 break;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
175
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
176 default: /* NGX_MAIL_SMTP_PROTOCOL */
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
177 p->upstream.connection->read->handler = ngx_mail_proxy_smtp_handler;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
178 s->mail_state = ngx_smtp_start;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
179 break;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
180 }
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
181 }
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
182
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
183
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
184 static void
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
185 ngx_mail_proxy_block_read(ngx_event_t *rev)
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
186 {
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
187 ngx_connection_t *c;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
188 ngx_mail_session_t *s;
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
189
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
190 ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, "mail proxy block read");
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
191
2388
722b5aff05ae use "!= NGX_OK" instead of "== NGX_ERROR"
Igor Sysoev <igor@sysoev.ru>
parents: 2311
diff changeset
192 if (ngx_handle_read_event(rev, 0) != NGX_OK) {
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
193 c = rev->data;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
194 s = c->data;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
195
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
196 ngx_mail_proxy_close_session(s);
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
197 }
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
198 }
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
199
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
200
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
201 static void
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
202 ngx_mail_proxy_pop3_handler(ngx_event_t *rev)
418
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
203 {
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
204 u_char *p;
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
205 ngx_int_t rc;
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
206 ngx_str_t line;
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
207 ngx_connection_t *c;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
208 ngx_mail_session_t *s;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
209 ngx_mail_proxy_conf_t *pcf;
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
210
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
211 ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0,
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
212 "mail proxy pop3 auth handler");
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
213
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
214 c = rev->data;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
215 s = c->data;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
216
423
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
217 if (rev->timedout) {
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
218 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT,
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
219 "upstream timed out");
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 571
diff changeset
220 c->timedout = 1;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
221 ngx_mail_proxy_internal_server_error(s);
423
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
222 return;
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
223 }
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
224
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
225 rc = ngx_mail_proxy_read_response(s, 0);
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
226
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
227 if (rc == NGX_AGAIN) {
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
228 return;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
229 }
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
230
571
458b6c3fea65 nginx-0.3.7-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 547
diff changeset
231 if (rc == NGX_ERROR) {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
232 ngx_mail_proxy_upstream_error(s);
422
edaefb2a20fc nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents: 419
diff changeset
233 return;
edaefb2a20fc nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents: 419
diff changeset
234 }
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
235
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
236 switch (s->mail_state) {
587
284cc140593b nginx-0.3.15-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
237
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
238 case ngx_pop3_start:
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
239 ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, "mail proxy send user");
422
edaefb2a20fc nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents: 419
diff changeset
240
587
284cc140593b nginx-0.3.15-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
241 s->connection->log->action = "sending user name to upstream";
284cc140593b nginx-0.3.15-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
242
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
243 line.len = sizeof("USER ") - 1 + s->login.len + 2;
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 1981
diff changeset
244 line.data = ngx_pnalloc(c->pool, line.len);
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
245 if (line.data == NULL) {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
246 ngx_mail_proxy_internal_server_error(s);
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
247 return;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
248 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
249
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
250 p = ngx_cpymem(line.data, "USER ", sizeof("USER ") - 1);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
251 p = ngx_cpymem(p, s->login.data, s->login.len);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
252 *p++ = CR; *p = LF;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
253
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
254 s->mail_state = ngx_pop3_user;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
255 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
256
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
257 case ngx_pop3_user:
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
258 ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, "mail proxy send pass");
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
259
587
284cc140593b nginx-0.3.15-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
260 s->connection->log->action = "sending password to upstream";
284cc140593b nginx-0.3.15-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
261
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
262 line.len = sizeof("PASS ") - 1 + s->passwd.len + 2;
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 1981
diff changeset
263 line.data = ngx_pnalloc(c->pool, line.len);
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
264 if (line.data == NULL) {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
265 ngx_mail_proxy_internal_server_error(s);
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
266 return;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
267 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
268
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
269 p = ngx_cpymem(line.data, "PASS ", sizeof("PASS ") - 1);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
270 p = ngx_cpymem(p, s->passwd.data, s->passwd.len);
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
271 *p++ = CR; *p = LF;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
272
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
273 s->mail_state = ngx_pop3_passwd;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
274 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
275
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
276 case ngx_pop3_passwd:
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
277 s->connection->read->handler = ngx_mail_proxy_handler;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
278 s->connection->write->handler = ngx_mail_proxy_handler;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
279 rev->handler = ngx_mail_proxy_handler;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
280 c->write->handler = ngx_mail_proxy_handler;
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
281
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
282 pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module);
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
283 ngx_add_timer(s->connection->read, pcf->timeout);
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
284 ngx_del_timer(c->read);
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
285
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
286 c->log->action = NULL;
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
287 ngx_log_error(NGX_LOG_INFO, c->log, 0, "client logged in");
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
288
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
289 ngx_mail_proxy_handler(s->connection->write);
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
290
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
291 return;
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
292
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
293 default:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
294 #if (NGX_SUPPRESS_WARN)
3516
dd1570b6f237 ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents: 3505
diff changeset
295 ngx_str_null(&line);
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
296 #endif
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
297 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
298 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
299
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
300 if (c->send(c, line.data, line.len) < (ssize_t) line.len) {
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
301 /*
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
302 * we treat the incomplete sending as NGX_ERROR
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
303 * because it is very strange here
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
304 */
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
305 ngx_mail_proxy_internal_server_error(s);
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
306 return;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
307 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
308
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
309 s->proxy->buffer->pos = s->proxy->buffer->start;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
310 s->proxy->buffer->last = s->proxy->buffer->start;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
311 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
312
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
313
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
314 static void
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
315 ngx_mail_proxy_imap_handler(ngx_event_t *rev)
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
316 {
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
317 u_char *p;
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
318 ngx_int_t rc;
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
319 ngx_str_t line;
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
320 ngx_connection_t *c;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
321 ngx_mail_session_t *s;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
322 ngx_mail_proxy_conf_t *pcf;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
323
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
324 ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0,
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
325 "mail proxy imap auth handler");
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
326
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
327 c = rev->data;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
328 s = c->data;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
329
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
330 if (rev->timedout) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
331 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT,
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
332 "upstream timed out");
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 571
diff changeset
333 c->timedout = 1;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
334 ngx_mail_proxy_internal_server_error(s);
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
335 return;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
336 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
337
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
338 rc = ngx_mail_proxy_read_response(s, s->mail_state);
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
339
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
340 if (rc == NGX_AGAIN) {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
341 return;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
342 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
343
571
458b6c3fea65 nginx-0.3.7-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 547
diff changeset
344 if (rc == NGX_ERROR) {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
345 ngx_mail_proxy_upstream_error(s);
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
346 return;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
347 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
348
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
349 switch (s->mail_state) {
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
350
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
351 case ngx_imap_start:
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
352 ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0,
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
353 "mail proxy send login");
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
354
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
355 s->connection->log->action = "sending LOGIN command to upstream";
587
284cc140593b nginx-0.3.15-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
356
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
357 line.len = s->tag.len + sizeof("LOGIN ") - 1
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
358 + 1 + NGX_SIZE_T_LEN + 1 + 2;
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 1981
diff changeset
359 line.data = ngx_pnalloc(c->pool, line.len);
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
360 if (line.data == NULL) {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
361 ngx_mail_proxy_internal_server_error(s);
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
362 return;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
363 }
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
364
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
365 line.len = ngx_sprintf(line.data, "%VLOGIN {%uz}" CRLF,
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
366 &s->tag, s->login.len)
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
367 - line.data;
422
edaefb2a20fc nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents: 419
diff changeset
368
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
369 s->mail_state = ngx_imap_login;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
370 break;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
371
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
372 case ngx_imap_login:
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
373 ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, "mail proxy send user");
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
374
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
375 s->connection->log->action = "sending user name to upstream";
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
376
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
377 line.len = s->login.len + 1 + 1 + NGX_SIZE_T_LEN + 1 + 2;
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 1981
diff changeset
378 line.data = ngx_pnalloc(c->pool, line.len);
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
379 if (line.data == NULL) {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
380 ngx_mail_proxy_internal_server_error(s);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
381 return;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
382 }
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
383
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
384 line.len = ngx_sprintf(line.data, "%V {%uz}" CRLF,
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
385 &s->login, s->passwd.len)
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
386 - line.data;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
387
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
388 s->mail_state = ngx_imap_user;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
389 break;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
390
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
391 case ngx_imap_user:
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
392 ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0,
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
393 "mail proxy send passwd");
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
394
587
284cc140593b nginx-0.3.15-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
395 s->connection->log->action = "sending password to upstream";
284cc140593b nginx-0.3.15-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
396
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
397 line.len = s->passwd.len + 2;
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 1981
diff changeset
398 line.data = ngx_pnalloc(c->pool, line.len);
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
399 if (line.data == NULL) {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
400 ngx_mail_proxy_internal_server_error(s);
422
edaefb2a20fc nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents: 419
diff changeset
401 return;
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
402 }
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
403
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
404 p = ngx_cpymem(line.data, s->passwd.data, s->passwd.len);
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
405 *p++ = CR; *p = LF;
422
edaefb2a20fc nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents: 419
diff changeset
406
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
407 s->mail_state = ngx_imap_passwd;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
408 break;
422
edaefb2a20fc nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents: 419
diff changeset
409
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
410 case ngx_imap_passwd:
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
411 s->connection->read->handler = ngx_mail_proxy_handler;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
412 s->connection->write->handler = ngx_mail_proxy_handler;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
413 rev->handler = ngx_mail_proxy_handler;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
414 c->write->handler = ngx_mail_proxy_handler;
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
415
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
416 pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module);
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
417 ngx_add_timer(s->connection->read, pcf->timeout);
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
418 ngx_del_timer(c->read);
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
419
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
420 c->log->action = NULL;
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
421 ngx_log_error(NGX_LOG_INFO, c->log, 0, "client logged in");
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
422
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
423 ngx_mail_proxy_handler(s->connection->write);
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
424
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
425 return;
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
426
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
427 default:
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
428 #if (NGX_SUPPRESS_WARN)
3516
dd1570b6f237 ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents: 3505
diff changeset
429 ngx_str_null(&line);
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
430 #endif
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
431 break;
422
edaefb2a20fc nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents: 419
diff changeset
432 }
edaefb2a20fc nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents: 419
diff changeset
433
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
434 if (c->send(c, line.data, line.len) < (ssize_t) line.len) {
422
edaefb2a20fc nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents: 419
diff changeset
435 /*
edaefb2a20fc nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents: 419
diff changeset
436 * we treat the incomplete sending as NGX_ERROR
edaefb2a20fc nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents: 419
diff changeset
437 * because it is very strange here
edaefb2a20fc nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents: 419
diff changeset
438 */
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
439 ngx_mail_proxy_internal_server_error(s);
422
edaefb2a20fc nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents: 419
diff changeset
440 return;
edaefb2a20fc nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents: 419
diff changeset
441 }
edaefb2a20fc nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents: 419
diff changeset
442
edaefb2a20fc nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents: 419
diff changeset
443 s->proxy->buffer->pos = s->proxy->buffer->start;
edaefb2a20fc nginx-0.0.10-2004-09-12-00:22:11 import
Igor Sysoev <igor@sysoev.ru>
parents: 419
diff changeset
444 s->proxy->buffer->last = s->proxy->buffer->start;
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
445 }
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
446
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
447
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
448 static void
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
449 ngx_mail_proxy_smtp_handler(ngx_event_t *rev)
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
450 {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
451 u_char *p;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
452 ngx_int_t rc;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
453 ngx_str_t line;
2309
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
454 ngx_buf_t *b;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
455 ngx_connection_t *c;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
456 ngx_mail_session_t *s;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
457 ngx_mail_proxy_conf_t *pcf;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
458 ngx_mail_core_srv_conf_t *cscf;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
459
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
460 ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0,
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
461 "mail proxy smtp auth handler");
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
462
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
463 c = rev->data;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
464 s = c->data;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
465
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
466 if (rev->timedout) {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
467 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT,
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
468 "upstream timed out");
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
469 c->timedout = 1;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
470 ngx_mail_proxy_internal_server_error(s);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
471 return;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
472 }
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
473
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
474 rc = ngx_mail_proxy_read_response(s, s->mail_state);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
475
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
476 if (rc == NGX_AGAIN) {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
477 return;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
478 }
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
479
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
480 if (rc == NGX_ERROR) {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
481 ngx_mail_proxy_upstream_error(s);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
482 return;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
483 }
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
484
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
485 switch (s->mail_state) {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
486
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
487 case ngx_smtp_start:
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
488 ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, "mail proxy send ehlo");
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
489
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
490 s->connection->log->action = "sending HELO/EHLO to upstream";
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
491
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
492 cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
493
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
494 line.len = sizeof("HELO ") - 1 + cscf->server_name.len + 2;
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 1981
diff changeset
495 line.data = ngx_pnalloc(c->pool, line.len);
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
496 if (line.data == NULL) {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
497 ngx_mail_proxy_internal_server_error(s);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
498 return;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
499 }
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
500
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
501 pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
502
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
503 p = ngx_cpymem(line.data,
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
504 ((s->esmtp || pcf->xclient) ? "EHLO " : "HELO "),
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
505 sizeof("HELO ") - 1);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
506
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
507 p = ngx_cpymem(p, cscf->server_name.data, cscf->server_name.len);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
508 *p++ = CR; *p = LF;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
509
2309
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
510 if (pcf->xclient) {
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
511 s->mail_state = ngx_smtp_helo_xclient;
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
512
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
513 } else if (s->auth_method == NGX_MAIL_AUTH_NONE) {
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
514 s->mail_state = ngx_smtp_helo_from;
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
515
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
516 } else {
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
517 s->mail_state = ngx_smtp_helo;
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
518 }
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
519
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
520 break;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
521
2309
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
522 case ngx_smtp_helo_xclient:
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
523 ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0,
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
524 "mail proxy send xclient");
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
525
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
526 s->connection->log->action = "sending XCLIENT to upstream";
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
527
2497
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
528 line.len = sizeof("XCLIENT ADDR= LOGIN= NAME="
1892
057d362ee50e resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents: 1487
diff changeset
529 CRLF) - 1
057d362ee50e resolver in smtp proxy module
Igor Sysoev <igor@sysoev.ru>
parents: 1487
diff changeset
530 + s->connection->addr_text.len + s->login.len + s->host.len;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
531
5522
bb3dc21c89ef Mail: fixed passing of IPv6 client address in XCLIENT.
Ruslan Ermilov <ru@nginx.com>
parents: 5399
diff changeset
532 #if (NGX_HAVE_INET6)
bb3dc21c89ef Mail: fixed passing of IPv6 client address in XCLIENT.
Ruslan Ermilov <ru@nginx.com>
parents: 5399
diff changeset
533 if (s->connection->sockaddr->sa_family == AF_INET6) {
bb3dc21c89ef Mail: fixed passing of IPv6 client address in XCLIENT.
Ruslan Ermilov <ru@nginx.com>
parents: 5399
diff changeset
534 line.len += sizeof("IPV6:") - 1;
bb3dc21c89ef Mail: fixed passing of IPv6 client address in XCLIENT.
Ruslan Ermilov <ru@nginx.com>
parents: 5399
diff changeset
535 }
bb3dc21c89ef Mail: fixed passing of IPv6 client address in XCLIENT.
Ruslan Ermilov <ru@nginx.com>
parents: 5399
diff changeset
536 #endif
bb3dc21c89ef Mail: fixed passing of IPv6 client address in XCLIENT.
Ruslan Ermilov <ru@nginx.com>
parents: 5399
diff changeset
537
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 1981
diff changeset
538 line.data = ngx_pnalloc(c->pool, line.len);
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
539 if (line.data == NULL) {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
540 ngx_mail_proxy_internal_server_error(s);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
541 return;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
542 }
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
543
5522
bb3dc21c89ef Mail: fixed passing of IPv6 client address in XCLIENT.
Ruslan Ermilov <ru@nginx.com>
parents: 5399
diff changeset
544 p = ngx_cpymem(line.data, "XCLIENT ADDR=", sizeof("XCLIENT ADDR=") - 1);
bb3dc21c89ef Mail: fixed passing of IPv6 client address in XCLIENT.
Ruslan Ermilov <ru@nginx.com>
parents: 5399
diff changeset
545
bb3dc21c89ef Mail: fixed passing of IPv6 client address in XCLIENT.
Ruslan Ermilov <ru@nginx.com>
parents: 5399
diff changeset
546 #if (NGX_HAVE_INET6)
bb3dc21c89ef Mail: fixed passing of IPv6 client address in XCLIENT.
Ruslan Ermilov <ru@nginx.com>
parents: 5399
diff changeset
547 if (s->connection->sockaddr->sa_family == AF_INET6) {
bb3dc21c89ef Mail: fixed passing of IPv6 client address in XCLIENT.
Ruslan Ermilov <ru@nginx.com>
parents: 5399
diff changeset
548 p = ngx_cpymem(p, "IPV6:", sizeof("IPV6:") - 1);
bb3dc21c89ef Mail: fixed passing of IPv6 client address in XCLIENT.
Ruslan Ermilov <ru@nginx.com>
parents: 5399
diff changeset
549 }
bb3dc21c89ef Mail: fixed passing of IPv6 client address in XCLIENT.
Ruslan Ermilov <ru@nginx.com>
parents: 5399
diff changeset
550 #endif
bb3dc21c89ef Mail: fixed passing of IPv6 client address in XCLIENT.
Ruslan Ermilov <ru@nginx.com>
parents: 5399
diff changeset
551
bb3dc21c89ef Mail: fixed passing of IPv6 client address in XCLIENT.
Ruslan Ermilov <ru@nginx.com>
parents: 5399
diff changeset
552 p = ngx_copy(p, s->connection->addr_text.data,
bb3dc21c89ef Mail: fixed passing of IPv6 client address in XCLIENT.
Ruslan Ermilov <ru@nginx.com>
parents: 5399
diff changeset
553 s->connection->addr_text.len);
bb3dc21c89ef Mail: fixed passing of IPv6 client address in XCLIENT.
Ruslan Ermilov <ru@nginx.com>
parents: 5399
diff changeset
554
bb3dc21c89ef Mail: fixed passing of IPv6 client address in XCLIENT.
Ruslan Ermilov <ru@nginx.com>
parents: 5399
diff changeset
555 if (s->login.len) {
bb3dc21c89ef Mail: fixed passing of IPv6 client address in XCLIENT.
Ruslan Ermilov <ru@nginx.com>
parents: 5399
diff changeset
556 p = ngx_cpymem(p, " LOGIN=", sizeof(" LOGIN=") - 1);
bb3dc21c89ef Mail: fixed passing of IPv6 client address in XCLIENT.
Ruslan Ermilov <ru@nginx.com>
parents: 5399
diff changeset
557 p = ngx_copy(p, s->login.data, s->login.len);
bb3dc21c89ef Mail: fixed passing of IPv6 client address in XCLIENT.
Ruslan Ermilov <ru@nginx.com>
parents: 5399
diff changeset
558 }
bb3dc21c89ef Mail: fixed passing of IPv6 client address in XCLIENT.
Ruslan Ermilov <ru@nginx.com>
parents: 5399
diff changeset
559
bb3dc21c89ef Mail: fixed passing of IPv6 client address in XCLIENT.
Ruslan Ermilov <ru@nginx.com>
parents: 5399
diff changeset
560 p = ngx_cpymem(p, " NAME=", sizeof(" NAME=") - 1);
bb3dc21c89ef Mail: fixed passing of IPv6 client address in XCLIENT.
Ruslan Ermilov <ru@nginx.com>
parents: 5399
diff changeset
561 p = ngx_copy(p, s->host.data, s->host.len);
bb3dc21c89ef Mail: fixed passing of IPv6 client address in XCLIENT.
Ruslan Ermilov <ru@nginx.com>
parents: 5399
diff changeset
562
bb3dc21c89ef Mail: fixed passing of IPv6 client address in XCLIENT.
Ruslan Ermilov <ru@nginx.com>
parents: 5399
diff changeset
563 *p++ = CR; *p++ = LF;
bb3dc21c89ef Mail: fixed passing of IPv6 client address in XCLIENT.
Ruslan Ermilov <ru@nginx.com>
parents: 5399
diff changeset
564
bb3dc21c89ef Mail: fixed passing of IPv6 client address in XCLIENT.
Ruslan Ermilov <ru@nginx.com>
parents: 5399
diff changeset
565 line.len = p - line.data;
2309
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
566
2497
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
567 if (s->smtp_helo.len) {
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
568 s->mail_state = ngx_smtp_xclient_helo;
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
569
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
570 } else if (s->auth_method == NGX_MAIL_AUTH_NONE) {
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
571 s->mail_state = ngx_smtp_xclient_from;
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
572
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
573 } else {
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
574 s->mail_state = ngx_smtp_xclient;
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
575 }
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
576
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
577 break;
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
578
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
579 case ngx_smtp_xclient_helo:
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
580 ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0,
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
581 "mail proxy send client ehlo");
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
582
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
583 s->connection->log->action = "sending client HELO/EHLO to upstream";
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
584
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
585 line.len = sizeof("HELO " CRLF) - 1 + s->smtp_helo.len;
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
586
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
587 line.data = ngx_pnalloc(c->pool, line.len);
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
588 if (line.data == NULL) {
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
589 ngx_mail_proxy_internal_server_error(s);
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
590 return;
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
591 }
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
592
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
593 line.len = ngx_sprintf(line.data,
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
594 ((s->esmtp) ? "EHLO %V" CRLF : "HELO %V" CRLF),
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
595 &s->smtp_helo)
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
596 - line.data;
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
597
2309
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
598 s->mail_state = (s->auth_method == NGX_MAIL_AUTH_NONE) ?
2497
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
599 ngx_smtp_helo_from : ngx_smtp_helo;
2309
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
600
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
601 break;
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
602
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
603 case ngx_smtp_helo_from:
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
604 case ngx_smtp_xclient_from:
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
605 ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0,
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
606 "mail proxy send mail from");
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
607
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
608 s->connection->log->action = "sending MAIL FROM to upstream";
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
609
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
610 line.len = s->smtp_from.len + sizeof(CRLF) - 1;
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
611 line.data = ngx_pnalloc(c->pool, line.len);
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
612 if (line.data == NULL) {
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
613 ngx_mail_proxy_internal_server_error(s);
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
614 return;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
615 }
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
616
2309
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
617 p = ngx_cpymem(line.data, s->smtp_from.data, s->smtp_from.len);
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
618 *p++ = CR; *p = LF;
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
619
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
620 s->mail_state = ngx_smtp_from;
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
621
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
622 break;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
623
2309
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
624 case ngx_smtp_from:
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
625 ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0,
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
626 "mail proxy send rcpt to");
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
627
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
628 s->connection->log->action = "sending RCPT TO to upstream";
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
629
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
630 line.len = s->smtp_to.len + sizeof(CRLF) - 1;
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
631 line.data = ngx_pnalloc(c->pool, line.len);
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
632 if (line.data == NULL) {
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
633 ngx_mail_proxy_internal_server_error(s);
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
634 return;
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
635 }
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
636
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
637 p = ngx_cpymem(line.data, s->smtp_to.data, s->smtp_to.len);
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
638 *p++ = CR; *p = LF;
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
639
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
640 s->mail_state = ngx_smtp_to;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
641
2309
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
642 break;
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
643
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
644 case ngx_smtp_helo:
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
645 case ngx_smtp_xclient:
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
646 case ngx_smtp_to:
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
647
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
648 b = s->proxy->buffer;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
649
2309
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
650 if (s->auth_method == NGX_MAIL_AUTH_NONE) {
2311
6bad42a41dd8 do not close session if SMTP backend returned an error on RCPT TO
Igor Sysoev <igor@sysoev.ru>
parents: 2309
diff changeset
651 b->pos = b->start;
2309
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
652
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
653 } else {
2440
939b40aa9ab4 update r2439: make clear name
Igor Sysoev <igor@sysoev.ru>
parents: 2438
diff changeset
654 ngx_memcpy(b->start, smtp_auth_ok, sizeof(smtp_auth_ok) - 1);
939b40aa9ab4 update r2439: make clear name
Igor Sysoev <igor@sysoev.ru>
parents: 2438
diff changeset
655 b->last = b->start + sizeof(smtp_auth_ok) - 1;
2309
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
656 }
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
657
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
658 s->connection->read->handler = ngx_mail_proxy_handler;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
659 s->connection->write->handler = ngx_mail_proxy_handler;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
660 rev->handler = ngx_mail_proxy_handler;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
661 c->write->handler = ngx_mail_proxy_handler;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
662
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
663 pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
664 ngx_add_timer(s->connection->read, pcf->timeout);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
665 ngx_del_timer(c->read);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
666
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
667 c->log->action = NULL;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
668 ngx_log_error(NGX_LOG_INFO, c->log, 0, "client logged in");
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
669
5398
04e43d03e153 Mail: smtp pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
670 if (s->buffer->pos == s->buffer->last) {
04e43d03e153 Mail: smtp pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
671 ngx_mail_proxy_handler(s->connection->write);
04e43d03e153 Mail: smtp pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
672
04e43d03e153 Mail: smtp pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
673 } else {
04e43d03e153 Mail: smtp pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
674 ngx_mail_proxy_handler(c->write);
04e43d03e153 Mail: smtp pipelining support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
675 }
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
676
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
677 return;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
678
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
679 default:
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
680 #if (NGX_SUPPRESS_WARN)
3516
dd1570b6f237 ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents: 3505
diff changeset
681 ngx_str_null(&line);
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
682 #endif
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
683 break;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
684 }
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
685
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
686 if (c->send(c, line.data, line.len) < (ssize_t) line.len) {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
687 /*
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
688 * we treat the incomplete sending as NGX_ERROR
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
689 * because it is very strange here
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
690 */
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
691 ngx_mail_proxy_internal_server_error(s);
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
692 return;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
693 }
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
694
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
695 s->proxy->buffer->pos = s->proxy->buffer->start;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
696 s->proxy->buffer->last = s->proxy->buffer->start;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
697 }
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
698
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
699
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
700 static void
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
701 ngx_mail_proxy_dummy_handler(ngx_event_t *wev)
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
702 {
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
703 ngx_connection_t *c;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
704 ngx_mail_session_t *s;
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
705
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
706 ngx_log_debug0(NGX_LOG_DEBUG_MAIL, wev->log, 0, "mail proxy dummy handler");
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
707
2388
722b5aff05ae use "!= NGX_OK" instead of "== NGX_ERROR"
Igor Sysoev <igor@sysoev.ru>
parents: 2311
diff changeset
708 if (ngx_handle_write_event(wev, 0) != NGX_OK) {
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
709 c = wev->data;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
710 s = c->data;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
711
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
712 ngx_mail_proxy_close_session(s);
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
713 }
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
714 }
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
715
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
716
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
717 static ngx_int_t
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
718 ngx_mail_proxy_read_response(ngx_mail_session_t *s, ngx_uint_t state)
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
719 {
5399
d3e09aa03a7a Mail: handle smtp multiline replies.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5398
diff changeset
720 u_char *p, *m;
857
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
721 ssize_t n;
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
722 ngx_buf_t *b;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
723 ngx_mail_proxy_conf_t *pcf;
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
724
587
284cc140593b nginx-0.3.15-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
725 s->connection->log->action = "reading response from upstream";
284cc140593b nginx-0.3.15-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
726
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
727 b = s->proxy->buffer;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
728
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
729 n = s->proxy->upstream.connection->recv(s->proxy->upstream.connection,
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
730 b->last, b->end - b->last);
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
731
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
732 if (n == NGX_ERROR || n == 0) {
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
733 return NGX_ERROR;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
734 }
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
735
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
736 if (n == NGX_AGAIN) {
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
737 return NGX_AGAIN;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
738 }
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
739
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
740 b->last += n;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
741
3505
c631ef8beaaa Zimbra IMAP server may return only 4 bytes: "+ \r\n"
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
742 if (b->last - b->pos < 4) {
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
743 return NGX_AGAIN;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
744 }
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
745
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
746 if (*(b->last - 2) != CR || *(b->last - 1) != LF) {
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
747 if (b->last == b->end) {
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
748 *(b->last - 1) = '\0';
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
749 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
750 "upstream sent too long response line: \"%s\"",
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
751 b->pos);
571
458b6c3fea65 nginx-0.3.7-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 547
diff changeset
752 return NGX_ERROR;
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
753 }
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
754
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
755 return NGX_AGAIN;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
756 }
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
757
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
758 p = b->pos;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
759
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
760 switch (s->protocol) {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
761
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
762 case NGX_MAIL_POP3_PROTOCOL:
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
763 if (p[0] == '+' && p[1] == 'O' && p[2] == 'K') {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
764 return NGX_OK;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
765 }
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
766 break;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
767
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
768 case NGX_MAIL_IMAP_PROTOCOL:
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
769 switch (state) {
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
770
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
771 case ngx_imap_start:
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
772 if (p[0] == '*' && p[1] == ' ' && p[2] == 'O' && p[3] == 'K') {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
773 return NGX_OK;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
774 }
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
775 break;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
776
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
777 case ngx_imap_login:
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
778 case ngx_imap_user:
529
e5d7d0334fdb nginx-0.1.39-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
779 if (p[0] == '+') {
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
780 return NGX_OK;
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
781 }
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
782 break;
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
783
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
784 case ngx_imap_passwd:
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
785 if (ngx_strncmp(p, s->tag.data, s->tag.len) == 0) {
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
786 p += s->tag.len;
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
787 if (p[0] == 'O' && p[1] == 'K') {
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
788 return NGX_OK;
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
789 }
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
790 }
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 589
diff changeset
791 break;
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
792 }
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
793
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
794 break;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
795
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
796 default: /* NGX_MAIL_SMTP_PROTOCOL */
5399
d3e09aa03a7a Mail: handle smtp multiline replies.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5398
diff changeset
797
d3e09aa03a7a Mail: handle smtp multiline replies.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5398
diff changeset
798 if (p[3] == '-') {
d3e09aa03a7a Mail: handle smtp multiline replies.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5398
diff changeset
799 /* multiline reply, check if we got last line */
d3e09aa03a7a Mail: handle smtp multiline replies.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5398
diff changeset
800
d3e09aa03a7a Mail: handle smtp multiline replies.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5398
diff changeset
801 m = b->last - (sizeof(CRLF "200" CRLF) - 1);
d3e09aa03a7a Mail: handle smtp multiline replies.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5398
diff changeset
802
d3e09aa03a7a Mail: handle smtp multiline replies.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5398
diff changeset
803 while (m > p) {
d3e09aa03a7a Mail: handle smtp multiline replies.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5398
diff changeset
804 if (m[0] == CR && m[1] == LF) {
d3e09aa03a7a Mail: handle smtp multiline replies.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5398
diff changeset
805 break;
d3e09aa03a7a Mail: handle smtp multiline replies.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5398
diff changeset
806 }
d3e09aa03a7a Mail: handle smtp multiline replies.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5398
diff changeset
807
d3e09aa03a7a Mail: handle smtp multiline replies.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5398
diff changeset
808 m--;
d3e09aa03a7a Mail: handle smtp multiline replies.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5398
diff changeset
809 }
d3e09aa03a7a Mail: handle smtp multiline replies.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5398
diff changeset
810
d3e09aa03a7a Mail: handle smtp multiline replies.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5398
diff changeset
811 if (m <= p || m[5] == '-') {
d3e09aa03a7a Mail: handle smtp multiline replies.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5398
diff changeset
812 return NGX_AGAIN;
d3e09aa03a7a Mail: handle smtp multiline replies.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5398
diff changeset
813 }
d3e09aa03a7a Mail: handle smtp multiline replies.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5398
diff changeset
814 }
d3e09aa03a7a Mail: handle smtp multiline replies.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5398
diff changeset
815
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
816 switch (state) {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
817
2311
6bad42a41dd8 do not close session if SMTP backend returned an error on RCPT TO
Igor Sysoev <igor@sysoev.ru>
parents: 2309
diff changeset
818 case ngx_smtp_start:
6bad42a41dd8 do not close session if SMTP backend returned an error on RCPT TO
Igor Sysoev <igor@sysoev.ru>
parents: 2309
diff changeset
819 if (p[0] == '2' && p[1] == '2' && p[2] == '0') {
1166
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
820 return NGX_OK;
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
821 }
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
822 break;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
823
2311
6bad42a41dd8 do not close session if SMTP backend returned an error on RCPT TO
Igor Sysoev <igor@sysoev.ru>
parents: 2309
diff changeset
824 case ngx_smtp_helo:
6bad42a41dd8 do not close session if SMTP backend returned an error on RCPT TO
Igor Sysoev <igor@sysoev.ru>
parents: 2309
diff changeset
825 case ngx_smtp_helo_xclient:
6bad42a41dd8 do not close session if SMTP backend returned an error on RCPT TO
Igor Sysoev <igor@sysoev.ru>
parents: 2309
diff changeset
826 case ngx_smtp_helo_from:
6bad42a41dd8 do not close session if SMTP backend returned an error on RCPT TO
Igor Sysoev <igor@sysoev.ru>
parents: 2309
diff changeset
827 case ngx_smtp_from:
6bad42a41dd8 do not close session if SMTP backend returned an error on RCPT TO
Igor Sysoev <igor@sysoev.ru>
parents: 2309
diff changeset
828 if (p[0] == '2' && p[1] == '5' && p[2] == '0') {
2309
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
829 return NGX_OK;
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
830 }
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
831 break;
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
832
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
833 case ngx_smtp_xclient:
2309
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
834 case ngx_smtp_xclient_from:
2497
1ab9cef4ff6c send HELO/EHLO after XCLIENT
Igor Sysoev <igor@sysoev.ru>
parents: 2440
diff changeset
835 case ngx_smtp_xclient_helo:
2309
8156bc03982a smtp_auth none
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
836 if (p[0] == '2' && (p[1] == '2' || p[1] == '5') && p[2] == '0') {
1166
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
837 return NGX_OK;
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
838 }
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
839 break;
2311
6bad42a41dd8 do not close session if SMTP backend returned an error on RCPT TO
Igor Sysoev <igor@sysoev.ru>
parents: 2309
diff changeset
840
6bad42a41dd8 do not close session if SMTP backend returned an error on RCPT TO
Igor Sysoev <igor@sysoev.ru>
parents: 2309
diff changeset
841 case ngx_smtp_to:
6bad42a41dd8 do not close session if SMTP backend returned an error on RCPT TO
Igor Sysoev <igor@sysoev.ru>
parents: 2309
diff changeset
842 return NGX_OK;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
843 }
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
844
1166
bde5e4134759 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 1136
diff changeset
845 break;
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
846 }
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
847
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
848 pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module);
857
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
849
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
850 if (pcf->pass_error_message == 0) {
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
851 *(b->last - 2) = '\0';
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
852 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
853 "upstream sent invalid response: \"%s\"", p);
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
854 return NGX_ERROR;
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
855 }
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
856
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
857 s->out.len = b->last - p - 2;
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
858 s->out.data = p;
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
859
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
860 ngx_log_error(NGX_LOG_INFO, s->connection->log, 0,
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
861 "upstream sent invalid response: \"%V\"", &s->out);
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
862
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
863 s->out.len = b->last - b->pos;
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
864 s->out.data = b->pos;
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
865
571
458b6c3fea65 nginx-0.3.7-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 547
diff changeset
866 return NGX_ERROR;
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
867 }
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
868
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
869
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
870 static void
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
871 ngx_mail_proxy_handler(ngx_event_t *ev)
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
872 {
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
873 char *action, *recv_action, *send_action;
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
874 size_t size;
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
875 ssize_t n;
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
876 ngx_buf_t *b;
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
877 ngx_uint_t do_write;
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
878 ngx_connection_t *c, *src, *dst;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
879 ngx_mail_session_t *s;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
880 ngx_mail_proxy_conf_t *pcf;
418
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
881
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
882 c = ev->data;
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
883 s = c->data;
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
884
7156
9c29644f6d03 Fixed worker_shutdown_timeout in various cases.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
885 if (ev->timedout || c->close) {
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
886 c->log->action = "proxying";
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
887
7156
9c29644f6d03 Fixed worker_shutdown_timeout in various cases.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
888 if (c->close) {
9c29644f6d03 Fixed worker_shutdown_timeout in various cases.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
889 ngx_log_error(NGX_LOG_INFO, c->log, 0, "shutdown timeout");
9c29644f6d03 Fixed worker_shutdown_timeout in various cases.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
890
9c29644f6d03 Fixed worker_shutdown_timeout in various cases.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
891 } else if (c == s->connection) {
423
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
892 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT,
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
893 "client timed out");
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 571
diff changeset
894 c->timedout = 1;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 571
diff changeset
895
423
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
896 } else {
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
897 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT,
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
898 "upstream timed out");
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
899 }
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
900
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
901 ngx_mail_proxy_close_session(s);
423
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
902 return;
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
903 }
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
904
418
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
905 if (c == s->connection) {
423
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
906 if (ev->write) {
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
907 recv_action = "proxying and reading from upstream";
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
908 send_action = "proxying and sending to client";
423
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
909 src = s->proxy->upstream.connection;
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
910 dst = c;
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
911 b = s->proxy->buffer;
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
912
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
913 } else {
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
914 recv_action = "proxying and reading from client";
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
915 send_action = "proxying and sending to upstream";
423
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
916 src = c;
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
917 dst = s->proxy->upstream.connection;
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
918 b = s->buffer;
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
919 }
418
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
920
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
921 } else {
423
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
922 if (ev->write) {
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 587
diff changeset
923 recv_action = "proxying and reading from client";
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 587
diff changeset
924 send_action = "proxying and sending to upstream";
423
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
925 src = s->connection;
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
926 dst = c;
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
927 b = s->buffer;
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
928
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
929 } else {
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 587
diff changeset
930 recv_action = "proxying and reading from upstream";
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 587
diff changeset
931 send_action = "proxying and sending to client";
423
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
932 src = c;
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
933 dst = s->connection;
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
934 b = s->proxy->buffer;
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
935 }
418
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
936 }
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
937
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
938 do_write = ev->write ? 1 : 0;
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
939
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
940 ngx_log_debug3(NGX_LOG_DEBUG_MAIL, ev->log, 0,
6480
f01ab2dbcfdc Fixed logging.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6141
diff changeset
941 "mail proxy handler: %ui, #%d > #%d",
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
942 do_write, src->fd, dst->fd);
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
943
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
944 for ( ;; ) {
418
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
945
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
946 if (do_write) {
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
947
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
948 size = b->last - b->pos;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
949
423
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
950 if (size && dst->write->ready) {
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
951 c->log->action = send_action;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
952
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
953 n = dst->send(dst, b->pos, size);
418
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
954
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
955 if (n == NGX_ERROR) {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
956 ngx_mail_proxy_close_session(s);
418
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
957 return;
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
958 }
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
959
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
960 if (n > 0) {
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
961 b->pos += n;
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
962
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
963 if (b->pos == b->last) {
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
964 b->pos = b->start;
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
965 b->last = b->start;
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
966 }
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
967 }
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
968 }
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
969 }
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
970
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
971 size = b->end - b->last;
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
972
423
fda5987b188d nginx-0.0.10-2004-09-13-20:18:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 422
diff changeset
973 if (size && src->read->ready) {
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
974 c->log->action = recv_action;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
975
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
976 n = src->recv(src, b->last, size);
418
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
977
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
978 if (n == NGX_AGAIN || n == 0) {
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
979 break;
418
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
980 }
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
981
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
982 if (n > 0) {
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
983 do_write = 1;
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
984 b->last += n;
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
985
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
986 continue;
418
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
987 }
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
988
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
989 if (n == NGX_ERROR) {
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
990 src->read->eof = 1;
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
991 }
418
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
992 }
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
993
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
994 break;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
995 }
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
996
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
997 c->log->action = "proxying";
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
998
1342
be2e13691c60 fix case when client has closed connection but upstream buffer is not empty
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
999 if ((s->connection->read->eof && s->buffer->pos == s->buffer->last)
be2e13691c60 fix case when client has closed connection but upstream buffer is not empty
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
1000 || (s->proxy->upstream.connection->read->eof
be2e13691c60 fix case when client has closed connection but upstream buffer is not empty
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
1001 && s->proxy->buffer->pos == s->proxy->buffer->last)
be2e13691c60 fix case when client has closed connection but upstream buffer is not empty
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
1002 || (s->connection->read->eof
be2e13691c60 fix case when client has closed connection but upstream buffer is not empty
Igor Sysoev <igor@sysoev.ru>
parents: 1166
diff changeset
1003 && s->proxy->upstream.connection->read->eof))
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1004 {
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1005 action = c->log->action;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1006 c->log->action = NULL;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1007 ngx_log_error(NGX_LOG_INFO, c->log, 0, "proxied session done");
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1008 c->log->action = action;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1009
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
1010 ngx_mail_proxy_close_session(s);
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1011 return;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1012 }
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1013
2388
722b5aff05ae use "!= NGX_OK" instead of "== NGX_ERROR"
Igor Sysoev <igor@sysoev.ru>
parents: 2311
diff changeset
1014 if (ngx_handle_write_event(dst->write, 0) != NGX_OK) {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
1015 ngx_mail_proxy_close_session(s);
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1016 return;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1017 }
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1018
2388
722b5aff05ae use "!= NGX_OK" instead of "== NGX_ERROR"
Igor Sysoev <igor@sysoev.ru>
parents: 2311
diff changeset
1019 if (ngx_handle_read_event(dst->read, 0) != NGX_OK) {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
1020 ngx_mail_proxy_close_session(s);
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1021 return;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1022 }
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1023
2388
722b5aff05ae use "!= NGX_OK" instead of "== NGX_ERROR"
Igor Sysoev <igor@sysoev.ru>
parents: 2311
diff changeset
1024 if (ngx_handle_write_event(src->write, 0) != NGX_OK) {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
1025 ngx_mail_proxy_close_session(s);
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1026 return;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1027 }
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1028
2388
722b5aff05ae use "!= NGX_OK" instead of "== NGX_ERROR"
Igor Sysoev <igor@sysoev.ru>
parents: 2311
diff changeset
1029 if (ngx_handle_read_event(src->read, 0) != NGX_OK) {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
1030 ngx_mail_proxy_close_session(s);
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1031 return;
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1032 }
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1033
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1034 if (c == s->connection) {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
1035 pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module);
583
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1036 ngx_add_timer(c->read, pcf->timeout);
4e296b7d25bf nginx-0.3.13-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
1037 }
418
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1038 }
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1039
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1040
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
1041 static void
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
1042 ngx_mail_proxy_upstream_error(ngx_mail_session_t *s)
857
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1043 {
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1044 if (s->proxy->upstream.connection) {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
1045 ngx_log_debug1(NGX_LOG_DEBUG_MAIL, s->connection->log, 0,
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
1046 "close mail proxy connection: %d",
857
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1047 s->proxy->upstream.connection->fd);
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1048
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1049 ngx_close_connection(s->proxy->upstream.connection);
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1050 }
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1051
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1052 if (s->out.len == 0) {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
1053 ngx_mail_session_internal_server_error(s);
857
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1054 return;
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1055 }
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1056
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1057 s->quit = 1;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
1058 ngx_mail_send(s->connection->write);
857
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1059 }
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1060
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1061
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1062 static void
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
1063 ngx_mail_proxy_internal_server_error(ngx_mail_session_t *s)
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1064 {
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1065 if (s->proxy->upstream.connection) {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
1066 ngx_log_debug1(NGX_LOG_DEBUG_MAIL, s->connection->log, 0,
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
1067 "close mail proxy connection: %d",
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1068 s->proxy->upstream.connection->fd);
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1069
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1070 ngx_close_connection(s->proxy->upstream.connection);
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1071 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1072
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
1073 ngx_mail_session_internal_server_error(s);
527
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1074 }
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1075
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1076
7fa11e5c6e96 nginx-0.1.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
1077 static void
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
1078 ngx_mail_proxy_close_session(ngx_mail_session_t *s)
418
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1079 {
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
1080 if (s->proxy->upstream.connection) {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
1081 ngx_log_debug1(NGX_LOG_DEBUG_MAIL, s->connection->log, 0,
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
1082 "close mail proxy connection: %d",
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
1083 s->proxy->upstream.connection->fd);
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
1084
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
1085 ngx_close_connection(s->proxy->upstream.connection);
419
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
1086 }
47709bff4468 nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents: 418
diff changeset
1087
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
1088 ngx_mail_close_connection(s->connection);
418
cf072d26d6d6 nginx-0.0.10-2004-09-08-09:18:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1089 }
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
1090
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
1091
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
1092 static void *
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
1093 ngx_mail_proxy_create_conf(ngx_conf_t *cf)
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 571
diff changeset
1094 {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
1095 ngx_mail_proxy_conf_t *pcf;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 571
diff changeset
1096
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
1097 pcf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_proxy_conf_t));
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
1098 if (pcf == NULL) {
2912
c7d57b539248 return NULL instead of NGX_CONF_ERROR on a create conf failure
Igor Sysoev <igor@sysoev.ru>
parents: 2497
diff changeset
1099 return NULL;
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
1100 }
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
1101
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
1102 pcf->enable = NGX_CONF_UNSET;
857
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1103 pcf->pass_error_message = NGX_CONF_UNSET;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
1104 pcf->xclient = NGX_CONF_UNSET;
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
1105 pcf->buffer_size = NGX_CONF_UNSET_SIZE;
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
1106 pcf->timeout = NGX_CONF_UNSET_MSEC;
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
1107
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
1108 return pcf;
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
1109 }
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
1110
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
1111
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
1112 static char *
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
1113 ngx_mail_proxy_merge_conf(ngx_conf_t *cf, void *parent, void *child)
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
1114 {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
1115 ngx_mail_proxy_conf_t *prev = parent;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
1116 ngx_mail_proxy_conf_t *conf = child;
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
1117
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
1118 ngx_conf_merge_value(conf->enable, prev->enable, 0);
857
739b997da512 proxy_pass_error_message
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
1119 ngx_conf_merge_value(conf->pass_error_message, prev->pass_error_message, 0);
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 884
diff changeset
1120 ngx_conf_merge_value(conf->xclient, prev->xclient, 1);
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
1121 ngx_conf_merge_size_value(conf->buffer_size, prev->buffer_size,
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
1122 (size_t) ngx_pagesize);
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 531
diff changeset
1123 ngx_conf_merge_msec_value(conf->timeout, prev->timeout, 24 * 60 * 60000);
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
1124
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
1125 return NGX_CONF_OK;
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
1126 }