Mercurial > hg > nginx-quic
comparison src/event/ngx_event_openssl.c @ 1426:adbafd129d06
do not set read->eof, ready, and error prematurely
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 27 Aug 2007 19:44:35 +0000 |
parents | 24778e7450af |
children | 36548ad85be1 |
comparison
equal
deleted
inserted
replaced
1425:debd1ba60d3f | 1426:adbafd129d06 |
---|---|
591 ngx_ssl_recv(ngx_connection_t *c, u_char *buf, size_t size) | 591 ngx_ssl_recv(ngx_connection_t *c, u_char *buf, size_t size) |
592 { | 592 { |
593 int n, bytes; | 593 int n, bytes; |
594 | 594 |
595 if (c->ssl->last == NGX_ERROR) { | 595 if (c->ssl->last == NGX_ERROR) { |
596 c->read->error = 1; | |
596 return NGX_ERROR; | 597 return NGX_ERROR; |
597 } | 598 } |
598 | 599 |
599 if (c->ssl->last == NGX_DONE) { | 600 if (c->ssl->last == NGX_DONE) { |
601 c->read->ready = 0; | |
602 c->read->eof = 1; | |
600 return 0; | 603 return 0; |
601 } | 604 } |
602 | 605 |
603 bytes = 0; | 606 bytes = 0; |
604 | 607 |
617 bytes += n; | 620 bytes += n; |
618 } | 621 } |
619 | 622 |
620 c->ssl->last = ngx_ssl_handle_recv(c, n); | 623 c->ssl->last = ngx_ssl_handle_recv(c, n); |
621 | 624 |
622 if (c->ssl->last != NGX_OK) { | 625 if (c->ssl->last == NGX_OK) { |
623 | 626 |
624 if (bytes) { | 627 size -= n; |
628 | |
629 if (size == 0) { | |
625 return bytes; | 630 return bytes; |
626 } | 631 } |
627 | 632 |
628 if (c->ssl->last == NGX_DONE) { | 633 buf += n; |
629 return 0; | 634 |
630 } | 635 continue; |
631 | 636 } |
637 | |
638 if (bytes) { | |
639 return bytes; | |
640 } | |
641 | |
642 switch (c->ssl->last) { | |
643 | |
644 case NGX_DONE: | |
645 c->read->ready = 0; | |
646 c->read->eof = 1; | |
647 return 0; | |
648 | |
649 case NGX_ERROR: | |
650 c->read->error = 1; | |
651 | |
652 /* fall thruogh */ | |
653 | |
654 case NGX_AGAIN: | |
632 return c->ssl->last; | 655 return c->ssl->last; |
633 } | 656 } |
634 | |
635 size -= n; | |
636 | |
637 if (size == 0) { | |
638 return bytes; | |
639 } | |
640 | |
641 buf += n; | |
642 } | 657 } |
643 } | 658 } |
644 | 659 |
645 | 660 |
646 static ngx_int_t | 661 static ngx_int_t |
701 return NGX_AGAIN; | 716 return NGX_AGAIN; |
702 } | 717 } |
703 | 718 |
704 c->ssl->no_wait_shutdown = 1; | 719 c->ssl->no_wait_shutdown = 1; |
705 c->ssl->no_send_shutdown = 1; | 720 c->ssl->no_send_shutdown = 1; |
706 c->read->ready = 0; | |
707 c->read->eof = 1; | |
708 | 721 |
709 if (sslerr == SSL_ERROR_ZERO_RETURN || ERR_peek_error() == 0) { | 722 if (sslerr == SSL_ERROR_ZERO_RETURN || ERR_peek_error() == 0) { |
710 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, | 723 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, |
711 "peer shutdown SSL cleanly"); | 724 "peer shutdown SSL cleanly"); |
712 return NGX_DONE; | 725 return NGX_DONE; |
713 } | 726 } |
714 | 727 |
715 c->read->error = 1; | |
716 ngx_ssl_connection_error(c, sslerr, err, "SSL_read() failed"); | 728 ngx_ssl_connection_error(c, sslerr, err, "SSL_read() failed"); |
717 | 729 |
718 return NGX_ERROR; | 730 return NGX_ERROR; |
719 } | 731 } |
720 | 732 |