comparison src/http/ngx_http_upstream_round_robin.c @ 318:fc223117327f NGINX_0_6_3

nginx 0.6.3 *) Feature: the "proxy_store" and "fastcgi_store" directives. *) Bugfix: a segmentation fault might occur in worker process if the "auth_http_header" directive was used. Thanks to Maxim Dounin. *) Bugfix: a segmentation fault occurred in worker process if the CRAM-MD5 authentication method was used, but it was not enabled. *) Bugfix: a segmentation fault might occur in worker process when the HTTPS protocol was used in the "proxy_pass" directive. *) Bugfix: a segmentation fault might occur in worker process if the eventport method was used. *) Bugfix: the "proxy_ignore_client_abort" and "fastcgi_ignore_client_abort" directives did not work; bug appeared in 0.5.13.
author Igor Sysoev <http://sysoev.ru>
date Thu, 12 Jul 2007 00:00:00 +0400
parents 9b7db0df50f0
children f7cd062ee035
comparison
equal deleted inserted replaced
317:fcdf0e42c859 318:fc223117327f
150 150
151 r->upstream->peer.get = ngx_http_upstream_get_round_robin_peer; 151 r->upstream->peer.get = ngx_http_upstream_get_round_robin_peer;
152 r->upstream->peer.free = ngx_http_upstream_free_round_robin_peer; 152 r->upstream->peer.free = ngx_http_upstream_free_round_robin_peer;
153 r->upstream->peer.tries = rrp->peers->number; 153 r->upstream->peer.tries = rrp->peers->number;
154 #if (NGX_HTTP_SSL) 154 #if (NGX_HTTP_SSL)
155 r->upstream->peer.save_session = ngx_http_upstream_save_round_robin_peer; 155 r->upstream->peer.set_session =
156 ngx_http_upstream_set_round_robin_peer_session;
157 r->upstream->peer.save_session =
158 ngx_http_upstream_save_round_robin_peer_session;
156 #endif 159 #endif
157 160
158 return NGX_OK; 161 return NGX_OK;
159 } 162 }
160 163
326 } 329 }
327 330
328 pc->sockaddr = peer->sockaddr; 331 pc->sockaddr = peer->sockaddr;
329 pc->socklen = peer->socklen; 332 pc->socklen = peer->socklen;
330 pc->name = &peer->name; 333 pc->name = &peer->name;
331 #if (NGX_SSL)
332 pc->ssl_session = peer->ssl_session;
333 #endif
334 334
335 /* ngx_unlock_mutex(rrp->peers->mutex); */ 335 /* ngx_unlock_mutex(rrp->peers->mutex); */
336 336
337 return NGX_OK; 337 return NGX_OK;
338 338
406 } 406 }
407 407
408 408
409 #if (NGX_HTTP_SSL) 409 #if (NGX_HTTP_SSL)
410 410
411 void 411 ngx_int_t
412 ngx_http_upstream_save_round_robin_peer(ngx_peer_connection_t *pc, void *data) 412 ngx_http_upstream_set_round_robin_peer_session(ngx_peer_connection_t *pc,
413 void *data)
413 { 414 {
414 ngx_http_upstream_rr_peer_data_t *rrp = data; 415 ngx_http_upstream_rr_peer_data_t *rrp = data;
415 416
417 ngx_int_t rc;
416 ngx_ssl_session_t *ssl_session; 418 ngx_ssl_session_t *ssl_session;
417 ngx_http_upstream_rr_peer_t *peer; 419 ngx_http_upstream_rr_peer_t *peer;
418 420
421 peer = &rrp->peers->peer[rrp->current];
422
423 /* TODO: threads only mutex */
424 /* ngx_lock_mutex(rrp->peers->mutex); */
425
426 ssl_session = peer->ssl_session;
427
428 rc = ngx_ssl_set_session(pc->connection, ssl_session);
429
430 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,
431 "set session: %p:%d",
432 ssl_session, ssl_session ? ssl_session->references : 0);
433
434 /* ngx_unlock_mutex(rrp->peers->mutex); */
435
436 return rc;
437 }
438
439
440 void
441 ngx_http_upstream_save_round_robin_peer_session(ngx_peer_connection_t *pc,
442 void *data)
443 {
444 ngx_http_upstream_rr_peer_data_t *rrp = data;
445
446 ngx_ssl_session_t *old_ssl_session, *ssl_session;
447 ngx_http_upstream_rr_peer_t *peer;
448
419 ssl_session = ngx_ssl_get_session(pc->connection); 449 ssl_session = ngx_ssl_get_session(pc->connection);
420 450
421 if (ssl_session == NULL) { 451 if (ssl_session == NULL) {
422 return; 452 return;
423 } 453 }
424 454
455 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,
456 "save session: %p:%d", ssl_session, ssl_session->references);
457
425 peer = &rrp->peers->peer[rrp->current]; 458 peer = &rrp->peers->peer[rrp->current];
426 459
460 /* TODO: threads only mutex */
427 /* ngx_lock_mutex(rrp->peers->mutex); */ 461 /* ngx_lock_mutex(rrp->peers->mutex); */
462
463 old_ssl_session = peer->ssl_session;
428 peer->ssl_session = ssl_session; 464 peer->ssl_session = ssl_session;
465
429 /* ngx_unlock_mutex(rrp->peers->mutex); */ 466 /* ngx_unlock_mutex(rrp->peers->mutex); */
430 467
431 if (pc->ssl_session) { 468 if (old_ssl_session) {
469
470 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,
471 "old session: %p:%d",
472 old_ssl_session, old_ssl_session->references);
473
432 /* TODO: may block */ 474 /* TODO: may block */
433 ngx_ssl_free_session(pc->ssl_session); 475
476 ngx_ssl_free_session(old_ssl_session);
434 } 477 }
435 } 478 }
436 479
437 #endif 480 #endif