Mercurial > hg > nginx-quic
changeset 7745:5f223cdad40e quic
Implemented eof in QUIC streams.
author | Roman Arutyunyan <arut@nginx.com> |
---|---|
date | Tue, 24 Mar 2020 13:49:42 +0300 |
parents | 146687b1ab43 |
children | b364af7f9f3f |
files | src/event/ngx_event_quic.c |
diffstat | 1 files changed, 19 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- 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; }