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

nginx-0.1.45-RELEASE import *) Change: the "ssl_engine" directive was canceled in the ngx_http_ssl_module and now is introduced at global level. *) Bugfix: the responses with SSI subrequests did not transferred via SSL connection. *) Various bug fixes in the IMAP/POP3 proxy.
author Igor Sysoev <igor@sysoev.ru>
date Thu, 08 Sep 2005 14:36:09 +0000
parents 371c1cee100d
children 511a89da35ad
comparison
equal deleted inserted replaced
540:983c48ab79bb 541:b09ee85d0ac8
9 #include <ngx_event.h> 9 #include <ngx_event.h>
10 #include <ngx_imap.h> 10 #include <ngx_imap.h>
11 11
12 12
13 static void ngx_imap_init_session(ngx_event_t *rev); 13 static void ngx_imap_init_session(ngx_event_t *rev);
14 static void ngx_imap_init_protocol(ngx_event_t *rev);
14 static ngx_int_t ngx_imap_read_command(ngx_imap_session_t *s); 15 static ngx_int_t ngx_imap_read_command(ngx_imap_session_t *s);
16 static u_char *ngx_imap_log_error(ngx_log_t *log, u_char *buf, size_t len);
15 17
16 #if (NGX_IMAP_SSL) 18 #if (NGX_IMAP_SSL)
17 static void ngx_imap_ssl_close_handler(ngx_event_t *ev); 19 static void ngx_imap_ssl_close_handler(ngx_event_t *ev);
18 #endif 20 #endif
19 21
38 40
39 41
40 void 42 void
41 ngx_imap_init_connection(ngx_connection_t *c) 43 ngx_imap_init_connection(ngx_connection_t *c)
42 { 44 {
45 ngx_imap_log_ctx_t *ctx;
46
47 ngx_log_debug0(NGX_LOG_DEBUG_IMAP, c->log, 0, "imap init connection");
48
49 ctx = ngx_palloc(c->pool, sizeof(ngx_imap_log_ctx_t));
50 if (ctx == NULL) {
51 ngx_imap_close_connection(c);
52 return;
53 }
54
55 ctx->client = &c->addr_text;
56 ctx->session = NULL;
57
58 c->log->connection = c->number;
59 c->log->handler = ngx_imap_log_error;
60 c->log->data = ctx;
61 c->log->action = "sending client greeting line";
62
63 c->log_error = NGX_ERROR_INFO;
64
65 ngx_imap_init_session(c->read);
66 }
67
68
69 static void
70 ngx_imap_init_session(ngx_event_t *rev)
71 {
72 ngx_connection_t *c;
43 ngx_imap_session_t *s; 73 ngx_imap_session_t *s;
74 ngx_imap_log_ctx_t *lctx;
44 ngx_imap_conf_ctx_t *ctx; 75 ngx_imap_conf_ctx_t *ctx;
76 ngx_imap_core_srv_conf_t *cscf;
45 #if (NGX_IMAP_SSL) 77 #if (NGX_IMAP_SSL)
46 ngx_int_t rc; 78 ngx_int_t rc;
47 ngx_imap_ssl_conf_t *sslcf; 79 ngx_imap_ssl_conf_t *sslcf;
48 #endif 80 #endif
49 ngx_imap_core_srv_conf_t *cscf; 81
50 82 c = rev->data;
51 ngx_log_debug0(NGX_LOG_DEBUG_IMAP, c->log, 0, "imap init connection");
52
53 c->log_error = NGX_ERROR_INFO;
54 83
55 ctx = c->ctx; 84 ctx = c->ctx;
85
86 cscf = ngx_imap_get_module_srv_conf(ctx, ngx_imap_core_module);
56 87
57 #if (NGX_IMAP_SSL) 88 #if (NGX_IMAP_SSL)
58 89
59 sslcf = ngx_imap_get_module_srv_conf(ctx, ngx_imap_ssl_module); 90 sslcf = ngx_imap_get_module_srv_conf(ctx, ngx_imap_ssl_module);
60 91
72 if (rc == NGX_ERROR) { 103 if (rc == NGX_ERROR) {
73 ngx_imap_close_connection(c); 104 ngx_imap_close_connection(c);
74 return; 105 return;
75 } 106 }
76 107
108 if (rc == NGX_AGAIN) {
109 ngx_add_timer(rev, cscf->timeout);
110 c->read->handler = ngx_imap_init_session;
111
112 if (ngx_handle_read_event(rev, 0) == NGX_ERROR) {
113 ngx_imap_close_connection(c);
114 }
115
116 return;
117 }
118
77 c->recv = ngx_ssl_recv; 119 c->recv = ngx_ssl_recv;
78 c->send = ngx_ssl_write; 120 c->send = ngx_ssl_write;
79 c->send_chain = ngx_ssl_send_chain; 121 c->send_chain = ngx_ssl_send_chain;
80 } 122 }
81 123
88 } 130 }
89 131
90 c->data = s; 132 c->data = s;
91 s->connection = c; 133 s->connection = c;
92 134
93 cscf = ngx_imap_get_module_srv_conf(ctx, ngx_imap_core_module);
94 s->protocol = cscf->protocol; 135 s->protocol = cscf->protocol;
95 136
96 s->ctx = ngx_pcalloc(c->pool, sizeof(void *) * ngx_imap_max_module); 137 s->ctx = ngx_pcalloc(c->pool, sizeof(void *) * ngx_imap_max_module);
97 if (s->ctx == NULL) { 138 if (s->ctx == NULL) {
98 ngx_imap_session_internal_server_error(s); 139 ngx_imap_session_internal_server_error(s);
102 s->main_conf = ctx->main_conf; 143 s->main_conf = ctx->main_conf;
103 s->srv_conf = ctx->srv_conf; 144 s->srv_conf = ctx->srv_conf;
104 145
105 s->out = greetings[s->protocol]; 146 s->out = greetings[s->protocol];
106 147
107 c->read->handler = ngx_imap_init_session; 148 lctx = c->log->data;
149 lctx->session = s;
150
151 c->read->handler = ngx_imap_init_protocol;
108 c->write->handler = ngx_imap_send; 152 c->write->handler = ngx_imap_send;
109 153
110 ngx_add_timer(c->write, cscf->timeout); 154 ngx_add_timer(rev, cscf->timeout);
111 ngx_add_timer(c->read, cscf->timeout); 155
112 156 if (ngx_handle_read_event(rev, 0) == NGX_ERROR) {
113 if (ngx_handle_read_event(c->read, 0) == NGX_ERROR) {
114 ngx_imap_close_connection(c); 157 ngx_imap_close_connection(c);
115 } 158 }
116 159
117 ngx_imap_send(c->write); 160 ngx_imap_send(c->write);
118 } 161 }
119 162
120 163
121 void 164 void
122 ngx_imap_send(ngx_event_t *wev) 165 ngx_imap_send(ngx_event_t *wev)
123 { 166 {
124 ngx_int_t n; 167 ngx_int_t n;
125 ngx_connection_t *c; 168 ngx_connection_t *c;
126 ngx_imap_session_t *s; 169 ngx_imap_session_t *s;
170 ngx_imap_core_srv_conf_t *cscf;
127 171
128 c = wev->data; 172 c = wev->data;
129 s = c->data; 173 s = c->data;
130 174
131 if (wev->timedout) { 175 if (wev->timedout) {
145 n = c->send(c, s->out.data, s->out.len); 189 n = c->send(c, s->out.data, s->out.len);
146 190
147 if (n > 0) { 191 if (n > 0) {
148 s->out.len -= n; 192 s->out.len -= n;
149 193
194 if (wev->timer_set) {
195 ngx_del_timer(wev);
196 }
197
150 if (s->quit) { 198 if (s->quit) {
151 ngx_imap_close_connection(c); 199 ngx_imap_close_connection(c);
152 return; 200 return;
153 } 201 }
154 202
164 return; 212 return;
165 } 213 }
166 214
167 /* n == NGX_AGAIN */ 215 /* n == NGX_AGAIN */
168 216
217 cscf = ngx_imap_get_module_srv_conf(s, ngx_imap_core_module);
218
219 ngx_add_timer(c->write, cscf->timeout);
220
169 if (ngx_handle_write_event(c->write, 0) == NGX_ERROR) { 221 if (ngx_handle_write_event(c->write, 0) == NGX_ERROR) {
170 ngx_imap_close_connection(c); 222 ngx_imap_close_connection(c);
171 return; 223 return;
172 } 224 }
173 } 225 }
174 226
175 227
176 static void 228 static void
177 ngx_imap_init_session(ngx_event_t *rev) 229 ngx_imap_init_protocol(ngx_event_t *rev)
178 { 230 {
179 size_t size; 231 size_t size;
180 ngx_connection_t *c; 232 ngx_connection_t *c;
181 ngx_imap_session_t *s; 233 ngx_imap_session_t *s;
182 ngx_imap_core_srv_conf_t *cscf; 234 ngx_imap_core_srv_conf_t *cscf;
183 235
184 c = rev->data; 236 c = rev->data;
237
238 c->log->action = "in auth state";
185 239
186 if (rev->timedout) { 240 if (rev->timedout) {
187 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); 241 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");
188 ngx_imap_close_connection(c); 242 ngx_imap_close_connection(c);
189 return; 243 return;
664 718
665 ngx_imap_close_connection(c); 719 ngx_imap_close_connection(c);
666 } 720 }
667 721
668 #endif 722 #endif
723
724
725 static u_char *
726 ngx_imap_log_error(ngx_log_t *log, u_char *buf, size_t len)
727 {
728 u_char *p;
729 ngx_imap_session_t *s;
730 ngx_imap_log_ctx_t *ctx;
731
732 if (log->action) {
733 p = ngx_snprintf(buf, len, " while %s", log->action);
734 len -= p - buf;
735 buf = p;
736 }
737
738 ctx = log->data;
739
740 p = ngx_snprintf(buf, len, ", client: %V", ctx->client);
741 len -= p - buf;
742 buf = p;
743
744 s = ctx->session;
745
746 if (s == NULL) {
747 return p;
748 }
749
750 p = ngx_snprintf(buf, len, ", server: %V",
751 &s->connection->listening->addr_text);
752 len -= p - buf;
753 buf = p;
754
755 if (s->login.len == 0) {
756 return p;
757 }
758
759 p = ngx_snprintf(buf, len, ", login: \"%V\"", &s->login);
760 len -= p - buf;
761 buf = p;
762
763 if (s->proxy == NULL) {
764 return p;
765 }
766
767 p = ngx_snprintf(buf, len, ", upstream: %V",
768 &s->proxy->upstream.peers->peer[0].name);
769
770 return p;
771 }