comparison src/http/modules/proxy/ngx_http_proxy_handler.c @ 306:6b91bfbc4123

nginx-0.0.3-2004-04-05-00:32:09 import
author Igor Sysoev <igor@sysoev.ru>
date Sun, 04 Apr 2004 20:32:09 +0000
parents 4b1a3a4acc60
children f5431a4bbc7d
comparison
equal deleted inserted replaced
305:4b1a3a4acc60 306:6b91bfbc4123
367 } 367 }
368 368
369 369
370 void ngx_http_proxy_check_broken_connection(ngx_event_t *ev) 370 void ngx_http_proxy_check_broken_connection(ngx_event_t *ev)
371 { 371 {
372 int n;
373 char buf[1];
374 ngx_err_t err;
372 ngx_connection_t *c; 375 ngx_connection_t *c;
373 ngx_http_request_t *r; 376 ngx_http_request_t *r;
374 ngx_http_proxy_ctx_t *p; 377 ngx_http_proxy_ctx_t *p;
375 378
376 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ev->log, 0, 379 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ev->log, 0,
377 "http proxy check client, write event:%d", ev->write); 380 "http proxy check client, write event:%d", ev->write);
378 381
379 c = ev->data;
380 r = c->data;
381 p = ngx_http_get_module_ctx(r, ngx_http_proxy_module);
382
383 #if (HAVE_KQUEUE) 382 #if (HAVE_KQUEUE)
384 383
385 /* TODO: KEVENT_EVENT */ 384 if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) {
386 385
387 if (ev->kq_eof) { 386 if (!ev->kq_eof) {
387 return;
388 }
389
390 c = ev->data;
391 r = c->data;
392 p = ngx_http_get_module_ctx(r, ngx_http_proxy_module);
393
388 ev->eof = 1; 394 ev->eof = 1;
389 395
390 if (ev->kq_errno) { 396 if (ev->kq_errno) {
391 ev->error = 1; 397 ev->error = 1;
392 } 398 }
405 "prematurely connection"); 411 "prematurely connection");
406 412
407 if (p->upstream == NULL || p->upstream->peer.connection == NULL) { 413 if (p->upstream == NULL || p->upstream->peer.connection == NULL) {
408 ngx_http_proxy_finalize_request(p, NGX_HTTP_CLIENT_CLOSED_REQUEST); 414 ngx_http_proxy_finalize_request(p, NGX_HTTP_CLIENT_CLOSED_REQUEST);
409 } 415 }
410 } 416
411 417 return;
412 #else 418 }
419
420 #endif
421
422 c = ev->data;
423 r = c->data;
424 p = ngx_http_get_module_ctx(r, ngx_http_proxy_module);
413 425
414 n = recv(c->fd, buf, 1, MSG_PEEK); 426 n = recv(c->fd, buf, 1, MSG_PEEK);
415 427
416 if (n > 0) { 428 if (n > 0) {
417 /* TODO: delete level */ 429 if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && ev->active) {
430 if (ngx_del_event(ev, NGX_READ_EVENT, 0) == NGX_ERROR) {
431 ngx_http_proxy_finalize_request(p,
432 NGX_HTTP_INTERNAL_SERVER_ERROR);
433 }
434 }
435
418 return; 436 return;
419 } 437 }
438
439 ev->eof = 1;
420 440
421 if (n == -1) { 441 if (n == -1) {
422 err = ngx_socket_errno; 442 err = ngx_socket_errno;
423 if (err == NGX_EAGAIN) { 443 if (err == NGX_EAGAIN) {
424 return; 444 return;
425 } 445 }
426 446
427 ev->error = 1; 447 ev->error = 1;
428 448
429 } else if (n == 0) { 449 } else {
450 /* n == 0 */
430 err = 0; 451 err = 0;
431 ev->eof = 1;
432 } 452 }
433 453
434 if (!p->cachable && p->upstream->peer.connection) { 454 if (!p->cachable && p->upstream->peer.connection) {
435 ngx_log_error(NGX_LOG_INFO, ev->log, err, 455 ngx_log_error(NGX_LOG_INFO, ev->log, err,
436 "client have closed prematurely connection, " 456 "client have closed prematurely connection, "
437 "so upstream connection is closed too"); 457 "so upstream connection is closed too");
438 ngx_http_proxy_finalize_request(p, NGX_HTTP_CLIENT_CLOSED_REQUEST); 458 ngx_http_proxy_finalize_request(p, NGX_HTTP_CLIENT_CLOSED_REQUEST);
439 return; 459 return;
440 } 460 }
441 461
442 ngx_log_error(NGX_LOG_INFO, ev->log, ev->err, 462 ngx_log_error(NGX_LOG_INFO, ev->log, err,
443 "client have closed prematurely connection"); 463 "client have closed prematurely connection");
444 464
445 if (p->upstream == NULL || p->upstream->peer.connection == NULL) { 465 if (p->upstream == NULL || p->upstream->peer.connection == NULL) {
446 ngx_http_proxy_finalize_request(p, NGX_HTTP_CLIENT_CLOSED_REQUEST); 466 ngx_http_proxy_finalize_request(p, NGX_HTTP_CLIENT_CLOSED_REQUEST);
447 } 467 }
448
449 #endif
450 } 468 }
451 469
452 470
453 void ngx_http_proxy_busy_lock_handler(ngx_event_t *rev) 471 void ngx_http_proxy_busy_lock_handler(ngx_event_t *rev)
454 { 472 {
868 886
869 ngx_conf_merge_msec_value(conf->read_timeout, prev->read_timeout, 30000); 887 ngx_conf_merge_msec_value(conf->read_timeout, prev->read_timeout, 30000);
870 888
871 ngx_conf_merge_size_value(conf->header_buffer_size, 889 ngx_conf_merge_size_value(conf->header_buffer_size,
872 prev->header_buffer_size, 4096); 890 prev->header_buffer_size, 4096);
891
873 ngx_conf_merge_bufs_value(conf->bufs, prev->bufs, 8, 4096); 892 ngx_conf_merge_bufs_value(conf->bufs, prev->bufs, 8, 4096);
893
894 if (conf->bufs.num < 2) {
895 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
896 "there must be at least 2 \"proxy_buffers\"");
897 return NGX_CONF_ERROR;
898 }
874 899
875 size = conf->header_buffer_size; 900 size = conf->header_buffer_size;
876 if (size < conf->bufs.size) { 901 if (size < conf->bufs.size) {
877 size = conf->bufs.size; 902 size = conf->bufs.size;
878 } 903 }
887 } else if (conf->busy_buffers_size < size) { 912 } else if (conf->busy_buffers_size < size) {
888 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, 913 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
889 "\"proxy_busy_buffers_size\" must be equal or bigger than " 914 "\"proxy_busy_buffers_size\" must be equal or bigger than "
890 "maximum of the value of \"proxy_header_buffer_size\" and " 915 "maximum of the value of \"proxy_header_buffer_size\" and "
891 "one of the \"proxy_buffers\""); 916 "one of the \"proxy_buffers\"");
917
918 return NGX_CONF_ERROR;
919
920 } else if (conf->busy_buffers_size > (conf->bufs.num - 1) * conf->bufs.size)
921 {
922 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
923 "\"proxy_busy_buffers_size\" must be less than "
924 "the size of all \"proxy_buffers\" minus one buffer");
892 925
893 return NGX_CONF_ERROR; 926 return NGX_CONF_ERROR;
894 } 927 }
895 928
896 929