summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorRoman Arutyunyan <arut@nginx.com>2020-03-24 13:49:42 +0300
committerRoman Arutyunyan <arut@nginx.com>2020-03-24 13:49:42 +0300
commit061a42d9664aa7bdcc6d3af1b79486a9d7a82c89 (patch)
tree4d9dfe6b47df2543165363b0445853b1b99e2bfc /src
parentc5505648d7ed963e30723698bfb50026cbca8a73 (diff)
downloadnginx-061a42d9664aa7bdcc6d3af1b79486a9d7a82c89.tar.gz
nginx-061a42d9664aa7bdcc6d3af1b79486a9d7a82c89.tar.bz2
Implemented eof in QUIC streams.
Diffstat (limited to 'src')
-rw-r--r--src/event/ngx_event_quic.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/src/event/ngx_event_quic.c b/src/event/ngx_event_quic.c
index 6cba52766..c5eb11c5c 100644
--- a/src/event/ngx_event_quic.c
+++ b/src/event/ngx_event_quic.c
@@ -1079,6 +1079,10 @@ ngx_quic_handle_stream_frame(ngx_connection_t *c,
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, u_char *buf, size_t size)
{
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, u_char *buf, size_t size)
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, u_char *buf, size_t size)
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;
}