## The HTTP2 Upgrade Protocol

### Table of Contents

- Introduction
- Attributes
  1. Common Attributes
  2. Standard Implementation
- Nested Components
- Special Features

### Introduction

The HTTP Upgrade Protocol element represents an Upgrade Protocol component that supports the HTTP/2 protocol. An instance of this component must be associated with an existing HTTP/1.1 Connector.

HTTP/2 connectors use non-blocking I/O, only utilising a container thread from the thread pool when there is data to read and write. However, because the Servlet API is fundamentally blocking, each HTTP/2 stream requires a dedicated container thread for the duration of that stream.

### Attributes

#### Common Attributes

All implementations of Upgrade Protocol support the following attributes:

Attribute | Description
--- | ---
`className` | This must be `org.apache.coyote.http2.Http2Protocol`.

#### Standard Implementation

The HTTP/2 Upgrade Protocol implementation supports the following attributes in addition to the common attributes listed above.

Attribute | Description
--- | ---
`allowedTrailerHeaders` | By default Tomcat will ignore all trailer headers when processing HTTP/2 connections. For a header to be processed, it must be added to this comma-separated list of header names.
`initialWindowSize` | Controls the initial size of the flow control window for streams that Tomcat advertises to clients. If not specified, the default value of `65535` is used.
`keepAliveTimeout` | The time, in milliseconds, that Tomcat will wait between HTTP/2 frames before closing the connection. Negative values will be treated as an infinite timeout. If not specified, a default value of `-1` will be used.
`maxConcurrentStreamExecution` | The controls the maximum number of streams for any one connection that can be allocated threads from the container thread pool. If more streams are active than threads are available, those streams will have to wait for a stream to become available. If not specified, the default value of `200` will be used.
`maxConcurrentStreams` | The controls the maximum number of active streams permitted for any one connection. If a client attempts to open more active streams than this limit, the stream will be reset with a `STREAM_REFUSED` error. If not specified, the default value of `200` will be used.
`maxHeaderCount` | The maximum number of headers in a request that is allowed by the container. A request that contains more headers than the specified limit will be rejected. A value of less than 0 means no limit. If not specified, a default of 100 is used.

`maxHeaderSize`

The maximum total size for all headers in a request that is allowed by the container. Total size for a header is calculated as the uncompressed size of the header name in bytes, plus the uncompressed size of the header value in bytes plus an HTTP/2 overhead of 3 bytes per header. A request that contains a set of headers that requires more than the specified limit will be rejected. A value of less than 0 means no limit. If not specified, a default of 8192 is used.

`maxTrailerCount` | The maximum number of trailer headers in a request that is allowed by the container. A request that contains more trailer headers than the specified limit will be rejected. A value of less than 0 means no limit. If not specified, a default of 100 is used.

`maxTrailerSize`

The maximum total size for all trailer headers in a request that is allowed by the container. Total size for a header is calculated as the uncompressed size of the header name in bytes, plus the uncompressed size of the header value in bytes plus an HTTP/2 overhead of 3 bytes per header. A request that contains a set of trailer headers that requires more than the specified limit will be rejected. A value of less than 0 means no limit. If not specified, a default of 8192 is used.

`readTimeout` | The time, in milliseconds, that Tomcat will wait for additional data when a partial HTTP/2 frame has been received. Negative values will be treated as an infinite timeout. If not specified, a default value of `10000` will be used.
`useSendfile` | Use this boolean attribute to enable or disable sendfile capability. The default value is `true`.
`writeTimeout` | The time, in milliseconds, that Tomcat will wait to write additional data when an HTTP/2 frame has been partially written. Negative values will be treated as an infinite timeout. If not specified, a default value of `10000` will be used.

The HTTP/2 upgrade protocol will also inherit the following limits from the HTTP Connector it is nested with:

- maxCookieCount
- maxParameterCount
- maxPostSize
- maxSavePostSize

### Nested Components

This component does not support any nested components.

### Special Features

This component does not support any special features.

### Comments

Notice: This comments section collects your suggestions on improving documentation for Apache Tomcat.
If you have trouble and need help, read Find Help page and ask your question on the tomcat-users mailing list. Do not ask such questions here. This is not a Q&A section.
The Apache Comments System is explained here. Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.