comparison src/event/ngx_event_quic.c @ 8279: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
comparison
equal deleted inserted replaced
8278:146687b1ab43 8279:5f223cdad40e
1077 b->last = ngx_cpymem(b->last, f->data, f->length); 1077 b->last = ngx_cpymem(b->last, f->data, f->length);
1078 1078
1079 rev = sn->c->read; 1079 rev = sn->c->read;
1080 rev->ready = 1; 1080 rev->ready = 1;
1081 1081
1082 if (f->fin) {
1083 rev->pending_eof = 1;
1084 }
1085
1082 if (rev->active) { 1086 if (rev->active) {
1083 rev->handler(rev); 1087 rev->handler(rev);
1084 } 1088 }
1085 1089
1086 return NGX_OK; 1090 return NGX_OK;
1544 static ssize_t 1548 static ssize_t
1545 ngx_quic_stream_recv(ngx_connection_t *c, u_char *buf, size_t size) 1549 ngx_quic_stream_recv(ngx_connection_t *c, u_char *buf, size_t size)
1546 { 1550 {
1547 ssize_t len; 1551 ssize_t len;
1548 ngx_buf_t *b; 1552 ngx_buf_t *b;
1553 ngx_event_t *rev;
1549 ngx_quic_stream_t *qs; 1554 ngx_quic_stream_t *qs;
1550 ngx_quic_connection_t *qc; 1555 ngx_quic_connection_t *qc;
1551 ngx_quic_stream_node_t *sn; 1556 ngx_quic_stream_node_t *sn;
1552 1557
1553 qs = c->qs; 1558 qs = c->qs;
1558 1563
1559 if (sn == NULL) { 1564 if (sn == NULL) {
1560 return NGX_ERROR; 1565 return NGX_ERROR;
1561 } 1566 }
1562 1567
1563 // XXX: how to return EOF? 1568 rev = c->read;
1564 1569
1565 b = sn->b; 1570 b = sn->b;
1566 1571
1572 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
1573 "quic recv: eof:%d, avail:%z",
1574 rev->pending_eof, b->last - b->pos);
1575
1567 if (b->pos == b->last) { 1576 if (b->pos == b->last) {
1568 c->read->ready = 0; 1577 rev->ready = 0;
1578
1579 if (rev->pending_eof) {
1580 rev->eof = 1;
1581 return 0;
1582 }
1583
1569 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic recv() not ready"); 1584 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic recv() not ready");
1570 return NGX_AGAIN; 1585 return NGX_AGAIN;
1571 } 1586 }
1572 1587
1573 len = ngx_min(b->last - b->pos, (ssize_t) size); 1588 len = ngx_min(b->last - b->pos, (ssize_t) size);
1577 b->pos += len; 1592 b->pos += len;
1578 1593
1579 if (b->pos == b->last) { 1594 if (b->pos == b->last) {
1580 b->pos = b->start; 1595 b->pos = b->start;
1581 b->last = b->start; 1596 b->last = b->start;
1597 rev->ready = 0;
1582 } 1598 }
1583 1599
1584 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, 1600 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
1585 "quic recv: %z of %uz", len, size); 1601 "quic recv: %z of %uz", len, size);
1586 1602
1587 return len; 1603 return len;
1588 } 1604 }
1589 1605
1590 1606