@@ -3354,6 +3354,142 @@ client.close(); |
3354 | 3354 | added: v8.4.0 |
3355 | 3355 | --> |
3356 | 3356 |
|
| 3357 | +#### Header name constants |
| 3358 | + |
| 3359 | +The `HTTP2_HEADER_*` constants provide names for HTTP/2 pseudo-headers and |
| 3360 | +known HTTP header names. Using these string constants is optional. For example, |
| 3361 | +`http2.constants.HTTP2_HEADER_CONTENT_TYPE` is equal to `'content-type'`. |
| 3362 | +For APIs that accept regular header names, |
| 3363 | +`http2.constants.HTTP2_HEADER_CONTENT_TYPE`, `'content-type'`, and |
| 3364 | +`'Content-Type'` have the same effect; Node.js serializes the name in |
| 3365 | +lower-case. |
| 3366 | + |
| 3367 | +Regular header constants can be used with the compatibility API wherever the |
| 3368 | +corresponding literal header name is accepted. In compatibility API request |
| 3369 | +handlers, prefer `request.method`, `request.authority`, `request.scheme`, and |
| 3370 | +`request.url` for the corresponding pseudo-headers. Other incoming |
| 3371 | +pseudo-headers remain available through `request.headers`. Set response status |
| 3372 | +through `response.statusCode` or the `statusCode` argument to |
| 3373 | +`response.writeHead()`. Passing `HTTP2_HEADER_STATUS` (`':status'`) to |
| 3374 | +`response.setHeader()` or in `response.writeHead()`'s headers object throws |
| 3375 | +`ERR_HTTP2_PSEUDOHEADER_NOT_ALLOWED`. `HTTP2_HEADER_PROTOCOL` is a request |
| 3376 | +pseudo-header and cannot be sent in a response. |
| 3377 | + |
| 3378 | +Incoming header object keys are lower-case, so use a constant or a lower-case |
| 3379 | +literal when accessing them as object properties. Using a constant does not |
| 3380 | +change header validation, and the availability of a constant does not imply |
| 3381 | +that the header is valid in every HTTP/2 context. See [HTTP/2 Headers Object][] |
| 3382 | +and [Invalid character handling in header names and values][] for details about |
| 3383 | +header casing and validation. |
| 3384 | + |
| 3385 | +##### Pseudo-header constants |
| 3386 | + |
| 3387 | +`HTTP2_HEADER_METHOD`, `HTTP2_HEADER_AUTHORITY`, `HTTP2_HEADER_SCHEME`, and |
| 3388 | +`HTTP2_HEADER_PATH` identify request pseudo-headers. `HTTP2_HEADER_STATUS` |
| 3389 | +identifies the response pseudo-header. `HTTP2_HEADER_PROTOCOL` identifies the |
| 3390 | +extended `CONNECT` request pseudo-header. Pseudo-headers are not permitted in |
| 3391 | +trailers. |
| 3392 | + |
| 3393 | +| Constant | Value | |
| 3394 | +| ---------------------------------------- | -------------- | |
| 3395 | +| `http2.constants.HTTP2_HEADER_STATUS` | `':status'` | |
| 3396 | +| `http2.constants.HTTP2_HEADER_METHOD` | `':method'` | |
| 3397 | +| `http2.constants.HTTP2_HEADER_AUTHORITY` | `':authority'` | |
| 3398 | +| `http2.constants.HTTP2_HEADER_SCHEME` | `':scheme'` | |
| 3399 | +| `http2.constants.HTTP2_HEADER_PATH` | `':path'` | |
| 3400 | +| `http2.constants.HTTP2_HEADER_PROTOCOL` | `':protocol'` | |
| 3401 | + |
| 3402 | +##### Regular header constants |
| 3403 | + |
| 3404 | +The `HTTP2_HEADER_CONNECTION`, `HTTP2_HEADER_UPGRADE`, |
| 3405 | +`HTTP2_HEADER_HTTP2_SETTINGS`, `HTTP2_HEADER_KEEP_ALIVE`, |
| 3406 | +`HTTP2_HEADER_PROXY_CONNECTION`, and `HTTP2_HEADER_TRANSFER_ENCODING` |
| 3407 | +constants identify connection-specific headers that HTTP/2 does not permit. |
| 3408 | +`HTTP2_HEADER_TE` is permitted only when its value is `'trailers'`. |
| 3409 | + |
| 3410 | +| Constant | Value | |
| 3411 | +| --------------------------------------------------------------- | ------------------------------------ | |
| 3412 | +| `http2.constants.HTTP2_HEADER_ACCEPT_ENCODING` | `'accept-encoding'` | |
| 3413 | +| `http2.constants.HTTP2_HEADER_ACCEPT_LANGUAGE` | `'accept-language'` | |
| 3414 | +| `http2.constants.HTTP2_HEADER_ACCEPT_RANGES` | `'accept-ranges'` | |
| 3415 | +| `http2.constants.HTTP2_HEADER_ACCEPT` | `'accept'` | |
| 3416 | +| `http2.constants.HTTP2_HEADER_ACCESS_CONTROL_ALLOW_CREDENTIALS` | `'access-control-allow-credentials'` | |
| 3417 | +| `http2.constants.HTTP2_HEADER_ACCESS_CONTROL_ALLOW_HEADERS` | `'access-control-allow-headers'` | |
| 3418 | +| `http2.constants.HTTP2_HEADER_ACCESS_CONTROL_ALLOW_METHODS` | `'access-control-allow-methods'` | |
| 3419 | +| `http2.constants.HTTP2_HEADER_ACCESS_CONTROL_ALLOW_ORIGIN` | `'access-control-allow-origin'` | |
| 3420 | +| `http2.constants.HTTP2_HEADER_ACCESS_CONTROL_EXPOSE_HEADERS` | `'access-control-expose-headers'` | |
| 3421 | +| `http2.constants.HTTP2_HEADER_ACCESS_CONTROL_REQUEST_HEADERS` | `'access-control-request-headers'` | |
| 3422 | +| `http2.constants.HTTP2_HEADER_ACCESS_CONTROL_REQUEST_METHOD` | `'access-control-request-method'` | |
| 3423 | +| `http2.constants.HTTP2_HEADER_AGE` | `'age'` | |
| 3424 | +| `http2.constants.HTTP2_HEADER_AUTHORIZATION` | `'authorization'` | |
| 3425 | +| `http2.constants.HTTP2_HEADER_CACHE_CONTROL` | `'cache-control'` | |
| 3426 | +| `http2.constants.HTTP2_HEADER_CONNECTION` | `'connection'` | |
| 3427 | +| `http2.constants.HTTP2_HEADER_CONTENT_DISPOSITION` | `'content-disposition'` | |
| 3428 | +| `http2.constants.HTTP2_HEADER_CONTENT_ENCODING` | `'content-encoding'` | |
| 3429 | +| `http2.constants.HTTP2_HEADER_CONTENT_LENGTH` | `'content-length'` | |
| 3430 | +| `http2.constants.HTTP2_HEADER_CONTENT_TYPE` | `'content-type'` | |
| 3431 | +| `http2.constants.HTTP2_HEADER_COOKIE` | `'cookie'` | |
| 3432 | +| `http2.constants.HTTP2_HEADER_DATE` | `'date'` | |
| 3433 | +| `http2.constants.HTTP2_HEADER_ETAG` | `'etag'` | |
| 3434 | +| `http2.constants.HTTP2_HEADER_FORWARDED` | `'forwarded'` | |
| 3435 | +| `http2.constants.HTTP2_HEADER_HOST` | `'host'` | |
| 3436 | +| `http2.constants.HTTP2_HEADER_IF_MODIFIED_SINCE` | `'if-modified-since'` | |
| 3437 | +| `http2.constants.HTTP2_HEADER_IF_NONE_MATCH` | `'if-none-match'` | |
| 3438 | +| `http2.constants.HTTP2_HEADER_IF_RANGE` | `'if-range'` | |
| 3439 | +| `http2.constants.HTTP2_HEADER_LAST_MODIFIED` | `'last-modified'` | |
| 3440 | +| `http2.constants.HTTP2_HEADER_LINK` | `'link'` | |
| 3441 | +| `http2.constants.HTTP2_HEADER_LOCATION` | `'location'` | |
| 3442 | +| `http2.constants.HTTP2_HEADER_RANGE` | `'range'` | |
| 3443 | +| `http2.constants.HTTP2_HEADER_REFERER` | `'referer'` | |
| 3444 | +| `http2.constants.HTTP2_HEADER_SERVER` | `'server'` | |
| 3445 | +| `http2.constants.HTTP2_HEADER_SET_COOKIE` | `'set-cookie'` | |
| 3446 | +| `http2.constants.HTTP2_HEADER_STRICT_TRANSPORT_SECURITY` | `'strict-transport-security'` | |
| 3447 | +| `http2.constants.HTTP2_HEADER_TRANSFER_ENCODING` | `'transfer-encoding'` | |
| 3448 | +| `http2.constants.HTTP2_HEADER_TE` | `'te'` | |
| 3449 | +| `http2.constants.HTTP2_HEADER_UPGRADE_INSECURE_REQUESTS` | `'upgrade-insecure-requests'` | |
| 3450 | +| `http2.constants.HTTP2_HEADER_UPGRADE` | `'upgrade'` | |
| 3451 | +| `http2.constants.HTTP2_HEADER_USER_AGENT` | `'user-agent'` | |
| 3452 | +| `http2.constants.HTTP2_HEADER_VARY` | `'vary'` | |
| 3453 | +| `http2.constants.HTTP2_HEADER_X_CONTENT_TYPE_OPTIONS` | `'x-content-type-options'` | |
| 3454 | +| `http2.constants.HTTP2_HEADER_X_FRAME_OPTIONS` | `'x-frame-options'` | |
| 3455 | +| `http2.constants.HTTP2_HEADER_KEEP_ALIVE` | `'keep-alive'` | |
| 3456 | +| `http2.constants.HTTP2_HEADER_PROXY_CONNECTION` | `'proxy-connection'` | |
| 3457 | +| `http2.constants.HTTP2_HEADER_X_XSS_PROTECTION` | `'x-xss-protection'` | |
| 3458 | +| `http2.constants.HTTP2_HEADER_ALT_SVC` | `'alt-svc'` | |
| 3459 | +| `http2.constants.HTTP2_HEADER_CONTENT_SECURITY_POLICY` | `'content-security-policy'` | |
| 3460 | +| `http2.constants.HTTP2_HEADER_EARLY_DATA` | `'early-data'` | |
| 3461 | +| `http2.constants.HTTP2_HEADER_EXPECT_CT` | `'expect-ct'` | |
| 3462 | +| `http2.constants.HTTP2_HEADER_ORIGIN` | `'origin'` | |
| 3463 | +| `http2.constants.HTTP2_HEADER_PURPOSE` | `'purpose'` | |
| 3464 | +| `http2.constants.HTTP2_HEADER_TIMING_ALLOW_ORIGIN` | `'timing-allow-origin'` | |
| 3465 | +| `http2.constants.HTTP2_HEADER_X_FORWARDED_FOR` | `'x-forwarded-for'` | |
| 3466 | +| `http2.constants.HTTP2_HEADER_PRIORITY` | `'priority'` | |
| 3467 | +| `http2.constants.HTTP2_HEADER_ACCEPT_CHARSET` | `'accept-charset'` | |
| 3468 | +| `http2.constants.HTTP2_HEADER_ACCESS_CONTROL_MAX_AGE` | `'access-control-max-age'` | |
| 3469 | +| `http2.constants.HTTP2_HEADER_ALLOW` | `'allow'` | |
| 3470 | +| `http2.constants.HTTP2_HEADER_CONTENT_LANGUAGE` | `'content-language'` | |
| 3471 | +| `http2.constants.HTTP2_HEADER_CONTENT_LOCATION` | `'content-location'` | |
| 3472 | +| `http2.constants.HTTP2_HEADER_CONTENT_MD5` | `'content-md5'` | |
| 3473 | +| `http2.constants.HTTP2_HEADER_CONTENT_RANGE` | `'content-range'` | |
| 3474 | +| `http2.constants.HTTP2_HEADER_DNT` | `'dnt'` | |
| 3475 | +| `http2.constants.HTTP2_HEADER_EXPECT` | `'expect'` | |
| 3476 | +| `http2.constants.HTTP2_HEADER_EXPIRES` | `'expires'` | |
| 3477 | +| `http2.constants.HTTP2_HEADER_FROM` | `'from'` | |
| 3478 | +| `http2.constants.HTTP2_HEADER_IF_MATCH` | `'if-match'` | |
| 3479 | +| `http2.constants.HTTP2_HEADER_IF_UNMODIFIED_SINCE` | `'if-unmodified-since'` | |
| 3480 | +| `http2.constants.HTTP2_HEADER_MAX_FORWARDS` | `'max-forwards'` | |
| 3481 | +| `http2.constants.HTTP2_HEADER_PREFER` | `'prefer'` | |
| 3482 | +| `http2.constants.HTTP2_HEADER_PROXY_AUTHENTICATE` | `'proxy-authenticate'` | |
| 3483 | +| `http2.constants.HTTP2_HEADER_PROXY_AUTHORIZATION` | `'proxy-authorization'` | |
| 3484 | +| `http2.constants.HTTP2_HEADER_REFRESH` | `'refresh'` | |
| 3485 | +| `http2.constants.HTTP2_HEADER_RETRY_AFTER` | `'retry-after'` | |
| 3486 | +| `http2.constants.HTTP2_HEADER_TRAILER` | `'trailer'` | |
| 3487 | +| `http2.constants.HTTP2_HEADER_TK` | `'tk'` | |
| 3488 | +| `http2.constants.HTTP2_HEADER_VIA` | `'via'` | |
| 3489 | +| `http2.constants.HTTP2_HEADER_WARNING` | `'warning'` | |
| 3490 | +| `http2.constants.HTTP2_HEADER_WWW_AUTHENTICATE` | `'www-authenticate'` | |
| 3491 | +| `http2.constants.HTTP2_HEADER_HTTP2_SETTINGS` | `'http2-settings'` | |
| 3492 | + |
3357 | 3493 | #### Error codes for `RST_STREAM` and `GOAWAY` |
3358 | 3494 |
|
3359 | 3495 | | Value | Name | Constant | |
@@ -3920,19 +4056,21 @@ API: |
3920 | 4056 | ```mjs |
3921 | 4057 | import { createServer } from 'node:http2'; |
3922 | 4058 | const server = createServer((req, res) => { |
3923 | | - res.setHeader('Content-Type', 'text/html'); |
3924 | | - res.setHeader('X-Foo', 'bar'); |
3925 | | - res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' }); |
| 4059 | + res.writeHead(200, { |
| 4060 | + 'Content-Type': 'text/plain; charset=utf-8', |
| 4061 | + 'X-Foo': 'bar', |
| 4062 | + }); |
3926 | 4063 | res.end('ok'); |
3927 | 4064 | }); |
3928 | 4065 | ``` |
3929 | 4066 |
|
3930 | 4067 | ```cjs |
3931 | 4068 | const http2 = require('node:http2'); |
3932 | 4069 | const server = http2.createServer((req, res) => { |
3933 | | - res.setHeader('Content-Type', 'text/html'); |
3934 | | - res.setHeader('X-Foo', 'bar'); |
3935 | | - res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' }); |
| 4070 | + res.writeHead(200, { |
| 4071 | + 'Content-Type': 'text/plain; charset=utf-8', |
| 4072 | + 'X-Foo': 'bar', |
| 4073 | + }); |
3936 | 4074 | res.end('ok'); |
3937 | 4075 | }); |
3938 | 4076 | ``` |
@@ -5023,6 +5161,7 @@ you need to implement any fall-back behavior yourself. |
5023 | 5161 | [HTTP/2 Settings Object]: #settings-object |
5024 | 5162 | [HTTP/2 Unencrypted]: https://http2.github.io/faq/#does-http2-require-encryption |
5025 | 5163 | [HTTPS]: https.md |
| 5164 | +[Invalid character handling in header names and values]: #invalid-character-handling-in-header-names-and-values |
5026 | 5165 | [Performance Observer]: perf_hooks.md |
5027 | 5166 | [RFC 7838]: https://tools.ietf.org/html/rfc7838 |
5028 | 5167 | [RFC 8336]: https://tools.ietf.org/html/rfc8336 |
|