 +    h3c = r->qstream->connection;
 +    c = h3c->connection;
 +
++    if (r->method == NGX_HTTP_HEAD) {
++        r->header_only = 1;
++    }
++
++    switch (r->headers_out.status) {
++
++    case NGX_HTTP_OK:
++        break;
++
++    case NGX_HTTP_NO_CONTENT:
++        r->header_only = 1;
++
++        ngx_str_null(&r->headers_out.content_type);
++
++        r->headers_out.content_length = NULL;
++        r->headers_out.content_length_n = -1;
++
++        r->headers_out.last_modified_time = -1;
++        r->headers_out.last_modified = NULL;
++        break;
++
++    case NGX_HTTP_PARTIAL_CONTENT:
++        break;
++
++    case NGX_HTTP_NOT_MODIFIED:
++        r->header_only = 1;
++        break;
++
++    default:
++        r->headers_out.last_modified_time = -1;
++        r->headers_out.last_modified = NULL;
++    }
++
 +    headers = ngx_array_create(r->pool, 1, sizeof(quiche_h3_header));
 +    if (headers == NULL) {
 +        return NGX_ERROR;

 src/http/ngx_http_request.h             |    3 +
 src/http/ngx_http_request_body.c        |   29 +
 src/http/ngx_http_upstream.c            |   13 +
 src/http/v3/ngx_http_v3.c               | 2123 +++++++++++++++++++++++
 src/http/v3/ngx_http_v3.h               |   77 +
 src/http/v3/ngx_http_v3_filter_module.c |   68 +
 src/http/v3/ngx_http_v3_module.c        |  286 +++
 src/http/v3/ngx_http_v3_module.h        |   34 +
 27 files changed, 3599 insertions(+), 11 deletions(-)
 create mode 100644 auto/lib/quiche/conf
 create mode 100644 auto/lib/quiche/make
 create mode 100644 src/event/ngx_event_quic.c

     if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {
diff --git a/src/http/v3/ngx_http_v3.c b/src/http/v3/ngx_http_v3.c
new file mode 100644
index 000000000..179ed614d
--- /dev/null
+++ b/src/http/v3/ngx_http_v3.c
@@ -0,0 +1,2156 @@
+
+/*
+ * Copyright (C) Cloudflare, Inc.
