# HG changeset patch # User Roman Arutyunyan # Date 1585046982 -10800 # Node ID 5f223cdad40ea6679b556b1d0eb49f5db9fad721 # Parent 146687b1ab43a93f8bc60610b386492eedaf9e15 Implemented eof in QUIC streams. diff --git a/src/event/ngx_event_quic.c b/src/event/ngx_event_quic.c --- a/src/event/ngx_event_quic.c +++ b/src/event/ngx_event_quic.c @@ -1079,6 +1079,10 @@ ngx_quic_handle_stream_frame(ngx_connect rev = sn->c->read; rev->ready = 1; + if (f->fin) { + rev->pending_eof = 1; + } + if (rev->active) { rev->handler(rev); } @@ -1546,6 +1550,7 @@ ngx_quic_stream_recv(ngx_connection_t *c { ssize_t len; ngx_buf_t *b; + ngx_event_t *rev; ngx_quic_stream_t *qs; ngx_quic_connection_t *qc; ngx_quic_stream_node_t *sn; @@ -1560,12 +1565,22 @@ ngx_quic_stream_recv(ngx_connection_t *c return NGX_ERROR; } - // XXX: how to return EOF? + rev = c->read; b = sn->b; + ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, + "quic recv: eof:%d, avail:%z", + rev->pending_eof, b->last - b->pos); + if (b->pos == b->last) { - c->read->ready = 0; + rev->ready = 0; + + if (rev->pending_eof) { + rev->eof = 1; + return 0; + } + ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic recv() not ready"); return NGX_AGAIN; } @@ -1579,10 +1594,11 @@ ngx_quic_stream_recv(ngx_connection_t *c if (b->pos == b->last) { b->pos = b->start; b->last = b->start; + rev->ready = 0; } ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic recv: %z of %uz", len, size); + "quic recv: %z of %uz", len, size); return len; }