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