summaryrefslogtreecommitdiffhomepage
path: root/src/event
diff options
context:
space:
mode:
authorRoman Arutyunyan <arut@nginx.com>2020-03-13 19:36:33 +0300
committerRoman Arutyunyan <arut@nginx.com>2020-03-13 19:36:33 +0300
commit7739b6073b11086d9a3dc4b9744418070e182c33 (patch)
tree7a16aeff28275722458173e83e2f6dd1889cc44a /src/event
parent365b77b58732a708168c995c7956f50d110fee33 (diff)
downloadnginx-7739b6073b11086d9a3dc4b9744418070e182c33.tar.gz
nginx-7739b6073b11086d9a3dc4b9744418070e182c33.tar.bz2
HTTP/3.
Diffstat (limited to 'src/event')
-rw-r--r--src/event/ngx_event.c36
-rw-r--r--src/event/ngx_event_quic.c23
-rw-r--r--src/event/ngx_event_quic.h1
3 files changed, 56 insertions, 4 deletions
diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c
index 402a7f5e2..f0ab73afe 100644
--- a/src/event/ngx_event.c
+++ b/src/event/ngx_event.c
@@ -268,6 +268,22 @@ ngx_process_events_and_timers(ngx_cycle_t *cycle)
ngx_int_t
ngx_handle_read_event(ngx_event_t *rev, ngx_uint_t flags)
{
+ ngx_connection_t *c;
+
+ c = rev->data;
+
+ if (c->qs) {
+
+ if (!rev->active && !rev->ready) {
+ rev->active = 1;
+
+ } else if (rev->active && (rev->ready || (flags & NGX_CLOSE_EVENT))) {
+ rev->active = 0;
+ }
+
+ return NGX_OK;
+ }
+
if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {
/* kqueue, epoll */
@@ -338,14 +354,26 @@ ngx_handle_write_event(ngx_event_t *wev, size_t lowat)
{
ngx_connection_t *c;
- if (lowat) {
- c = wev->data;
+ c = wev->data;
+ if (lowat) {
if (ngx_send_lowat(c, lowat) == NGX_ERROR) {
return NGX_ERROR;
}
}
+ if (c->qs) {
+
+ if (!wev->active && !wev->ready) {
+ wev->active = 1;
+
+ } else if (wev->active && wev->ready) {
+ wev->active = 0;
+ }
+
+ return NGX_OK;
+ }
+
if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {
/* kqueue, epoll */
@@ -916,6 +944,10 @@ ngx_send_lowat(ngx_connection_t *c, size_t lowat)
{
int sndlowat;
+ if (c->qs) {
+ return NGX_OK;
+ }
+
#if (NGX_HAVE_LOWAT_EVENT)
if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {
diff --git a/src/event/ngx_event_quic.c b/src/event/ngx_event_quic.c
index 880dda023..248cc9087 100644
--- a/src/event/ngx_event_quic.c
+++ b/src/event/ngx_event_quic.c
@@ -1909,6 +1909,7 @@ ngx_quic_stream_recv(ngx_connection_t *c, u_char *buf, size_t size)
b = sn->b;
if (b->last - b->pos == 0) {
+ c->read->ready = 0;
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
"quic recv() not ready");
return NGX_AGAIN; // ?
@@ -2029,6 +2030,7 @@ ngx_quic_payload_handler(ngx_connection_t *c, ngx_quic_header_t *pkt)
u_char *end, *p;
ssize_t len;
ngx_buf_t *b;
+ ngx_log_t *log;
ngx_uint_t ack_this;
ngx_pool_t *pool;
ngx_event_t *rev, *wev;
@@ -2129,21 +2131,38 @@ ngx_quic_payload_handler(ngx_connection_t *c, ngx_quic_header_t *pkt)
return NGX_ERROR;
}
+ sn->c = ngx_get_connection(-1, c->log); // TODO: free on connection termination
+ if (sn->c == NULL) {
+ return NGX_ERROR;
+ }
+
pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, c->log);
if (pool == NULL) {
+ /* XXX free connection */
return NGX_ERROR;
}
- sn->c = ngx_get_connection(-1, c->log); // TODO: free on connection termination
- if (sn->c == NULL) {
+ log = ngx_palloc(pool, sizeof(ngx_log_t));
+ if (log == NULL) {
+ /* XXX free pool and connection */
return NGX_ERROR;
}
+ *log = *c->log;
+ pool->log = log;
+
+ sn->c->log = log;
sn->c->pool = pool;
+ sn->c->listening = c->listening;
+ sn->c->sockaddr = c->sockaddr;
+ sn->c->local_sockaddr = c->local_sockaddr;
+
rev = sn->c->read;
wev = sn->c->write;
+ rev->ready = 1;
+
rev->log = c->log;
wev->log = c->log;
diff --git a/src/event/ngx_event_quic.h b/src/event/ngx_event_quic.h
index f3ff3da77..6a60c8703 100644
--- a/src/event/ngx_event_quic.h
+++ b/src/event/ngx_event_quic.h
@@ -14,6 +14,7 @@ struct ngx_quic_stream_s {
uint64_t id;
ngx_uint_t unidirectional:1;
ngx_connection_t *parent;
+ void *data;
};
/* TODO: get rid somehow of ssl argument? */