Mercurial > hg > nginx
comparison src/event/ngx_event_openssl.c @ 396:6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Sun, 18 Jul 2004 19:11:20 +0000 |
parents | f8f0f1834266 |
children | de797f3b4c27 |
comparison
equal
deleted
inserted
replaced
395:f8f0f1834266 | 396:6f3b20c1ac50 |
---|---|
62 return n; | 62 return n; |
63 } | 63 } |
64 | 64 |
65 sslerr = SSL_get_error(c->ssl->ssl, n); | 65 sslerr = SSL_get_error(c->ssl->ssl, n); |
66 | 66 |
67 err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_errno : 0; | |
68 | |
67 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d", sslerr); | 69 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d", sslerr); |
68 | |
69 err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_errno : 0; | |
70 | 70 |
71 if (sslerr == SSL_ERROR_WANT_READ) { | 71 if (sslerr == SSL_ERROR_WANT_READ) { |
72 return NGX_AGAIN; | 72 return NGX_AGAIN; |
73 } | 73 } |
74 | 74 |
83 | 83 |
84 } else { | 84 } else { |
85 handshake = ""; | 85 handshake = ""; |
86 } | 86 } |
87 | 87 |
88 c->ssl->no_rcv_shut = 1; | |
89 | |
88 if (sslerr == SSL_ERROR_ZERO_RETURN || ERR_peek_error() == 0) { | 90 if (sslerr == SSL_ERROR_ZERO_RETURN || ERR_peek_error() == 0) { |
89 ngx_log_error(NGX_LOG_INFO, c->log, err, | 91 ngx_log_error(NGX_LOG_INFO, c->log, err, |
90 "client closed connection%s", handshake); | 92 "client closed connection%s", handshake); |
91 | 93 |
92 SSL_set_shutdown(c->ssl->ssl, SSL_RECEIVED_SHUTDOWN); | |
93 | |
94 return NGX_ERROR; | 94 return NGX_ERROR; |
95 } | 95 } |
96 | 96 |
97 ngx_ssl_error(NGX_LOG_ALERT, c->log, err, | 97 ngx_ssl_error(NGX_LOG_ALERT, c->log, err, |
98 "SSL_read() failed%s", handshake); | 98 "SSL_read() failed%s", handshake); |
99 | |
100 SSL_set_shutdown(c->ssl->ssl, SSL_RECEIVED_SHUTDOWN); | |
101 | 99 |
102 return NGX_ERROR; | 100 return NGX_ERROR; |
103 } | 101 } |
104 | 102 |
105 | 103 |
106 ngx_chain_t *ngx_ssl_send_chain(ngx_connection_t *c, ngx_chain_t *in, | 104 ngx_chain_t *ngx_ssl_send_chain(ngx_connection_t *c, ngx_chain_t *in, |
107 off_t limit) | 105 off_t limit) |
108 { | 106 { |
109 int n; | 107 int n, sslerr; |
108 ngx_err_t err; | |
110 ssize_t send, size; | 109 ssize_t send, size; |
111 ngx_buf_t *buf; | 110 ngx_buf_t *buf; |
112 | 111 |
113 send = 0; | 112 send = 0; |
114 | 113 |
155 "SSL_write: %d", n); | 154 "SSL_write: %d", n); |
156 | 155 |
157 if (n > 0) { | 156 if (n > 0) { |
158 buf->pos += n; | 157 buf->pos += n; |
159 send += n; | 158 send += n; |
159 c->sent += n; | |
160 | 160 |
161 if (n < size) { | 161 if (n < size) { |
162 break; | 162 break; |
163 } | 163 } |
164 | 164 |
231 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_write: %d", n); | 231 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_write: %d", n); |
232 | 232 |
233 if (n > 0) { | 233 if (n > 0) { |
234 in->buf->pos += n; | 234 in->buf->pos += n; |
235 send += n; | 235 send += n; |
236 c->sent += n; | |
236 | 237 |
237 if (n == size) { | 238 if (n == size) { |
238 if (send < limit) { | 239 if (send < limit) { |
239 continue; | 240 continue; |
240 } | 241 } |
244 | 245 |
245 c->write->ready = 0; | 246 c->write->ready = 0; |
246 return in; | 247 return in; |
247 } | 248 } |
248 | 249 |
249 n = SSL_get_error(c->ssl->ssl, n); | 250 sslerr = SSL_get_error(c->ssl->ssl, n); |
250 | 251 |
251 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d", n); | 252 err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_errno : 0; |
252 | 253 |
253 if (n == SSL_ERROR_WANT_WRITE) { | 254 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
255 "SSL_get_error: %d", sslerr); | |
256 | |
257 if (sslerr == SSL_ERROR_WANT_WRITE) { | |
254 c->write->ready = 0; | 258 c->write->ready = 0; |
255 return in; | 259 return in; |
256 } | 260 } |
257 | 261 |
258 #if 0 | 262 #if 0 |
259 if (n == SSL_ERROR_WANT_READ) { | 263 if (sslerr == SSL_ERROR_WANT_READ) { |
260 return NGX_AGAIN; | 264 return NGX_AGAIN; |
261 } | 265 } |
262 #endif | 266 #endif |
267 | |
268 c->ssl->no_rcv_shut = 1; | |
263 | 269 |
264 ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "SSL_write() failed"); | 270 ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "SSL_write() failed"); |
265 | 271 |
266 return NGX_CHAIN_ERROR; | 272 return NGX_CHAIN_ERROR; |
267 } | 273 } |
270 } | 276 } |
271 | 277 |
272 | 278 |
273 ngx_int_t ngx_ssl_shutdown(ngx_connection_t *c) | 279 ngx_int_t ngx_ssl_shutdown(ngx_connection_t *c) |
274 { | 280 { |
275 int n; | 281 int n, sslerr; |
276 ngx_uint_t again; | 282 ngx_uint_t again; |
277 | 283 |
278 #if 0 | 284 if (c->timedout) { |
279 if (c->read->timedout || c->write->timedout) { | 285 SSL_set_shutdown(c->ssl->ssl, SSL_RECEIVED_SHUTDOWN|SSL_SENT_SHUTDOWN); |
280 SSL_set_shutdown(c->ssl, SSL_RECEIVED_SHUTDOWN); | 286 |
281 SSL_set_shutdown(c->ssl, SSL_RECEIVED_SHUTDOWN|SSL_SENT_SHUTDOWN); | 287 } else { |
282 } | 288 if (c->ssl->no_rcv_shut) { |
283 #endif | 289 SSL_set_shutdown(c->ssl->ssl, SSL_RECEIVED_SHUTDOWN); |
284 | 290 } |
285 #if 0 | 291 |
286 SSL_set_shutdown(c->ssl->ssl, SSL_RECEIVED_SHUTDOWN); | 292 if (c->ssl->no_send_shut) { |
287 #endif | 293 SSL_set_shutdown(c->ssl->ssl, SSL_SENT_SHUTDOWN); |
294 } | |
295 } | |
288 | 296 |
289 again = 0; | 297 again = 0; |
290 | 298 |
291 for ( ;; ) { | 299 for ( ;; ) { |
292 n = SSL_shutdown(c->ssl->ssl); | 300 n = SSL_shutdown(c->ssl->ssl); |
306 | 314 |
307 break; | 315 break; |
308 } | 316 } |
309 | 317 |
310 if (!again) { | 318 if (!again) { |
311 n = SSL_get_error(c->ssl->ssl, n); | 319 sslerr = SSL_get_error(c->ssl->ssl, n); |
312 | 320 |
313 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d", n); | 321 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
314 } | 322 "SSL_get_error: %d", sslerr); |
315 | 323 } |
316 if (again || n == SSL_ERROR_WANT_READ) { | 324 |
325 if (again || sslerr == SSL_ERROR_WANT_READ) { | |
317 | 326 |
318 ngx_add_timer(c->read, 10000); | 327 ngx_add_timer(c->read, 10000); |
319 | 328 |
320 if (ngx_handle_read_event(c->read, 0) == NGX_ERROR) { | 329 if (ngx_handle_read_event(c->read, 0) == NGX_ERROR) { |
321 return NGX_ERROR; | 330 return NGX_ERROR; |
322 } | 331 } |
323 | 332 |
324 return NGX_AGAIN; | 333 return NGX_AGAIN; |
325 } | 334 } |
326 | 335 |
327 if (n == SSL_ERROR_WANT_WRITE) { | 336 if (sslerr == SSL_ERROR_WANT_WRITE) { |
328 | 337 |
329 if (ngx_handle_write_event(c->write, 0) == NGX_ERROR) { | 338 if (ngx_handle_write_event(c->write, 0) == NGX_ERROR) { |
330 return NGX_ERROR; | 339 return NGX_ERROR; |
331 } | 340 } |
332 | 341 |