• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Flags: --expose-internals
2'use strict';
3
4const common = require('../common');
5if (!common.hasCrypto)
6  common.skip('missing crypto');
7const assert = require('assert');
8const { internalBinding } = require('internal/test/binding');
9
10const binding = internalBinding('http2');
11const http2 = require('http2');
12
13assert(binding.Http2Session);
14assert.strictEqual(typeof binding.Http2Session, 'function');
15
16const settings = http2.getDefaultSettings();
17assert.strictEqual(settings.headerTableSize, 4096);
18assert.strictEqual(settings.enablePush, true);
19assert.strictEqual(settings.maxConcurrentStreams, 4294967295);
20assert.strictEqual(settings.initialWindowSize, 65535);
21assert.strictEqual(settings.maxFrameSize, 16384);
22
23assert.strictEqual(binding.nghttp2ErrorString(-517),
24                   'GOAWAY has already been sent');
25
26// Assert constants are present
27assert(binding.constants);
28assert.strictEqual(typeof binding.constants, 'object');
29const constants = binding.constants;
30
31const expectedStatusCodes = {
32  HTTP_STATUS_CONTINUE: 100,
33  HTTP_STATUS_SWITCHING_PROTOCOLS: 101,
34  HTTP_STATUS_PROCESSING: 102,
35  HTTP_STATUS_EARLY_HINTS: 103,
36  HTTP_STATUS_OK: 200,
37  HTTP_STATUS_CREATED: 201,
38  HTTP_STATUS_ACCEPTED: 202,
39  HTTP_STATUS_NON_AUTHORITATIVE_INFORMATION: 203,
40  HTTP_STATUS_NO_CONTENT: 204,
41  HTTP_STATUS_RESET_CONTENT: 205,
42  HTTP_STATUS_PARTIAL_CONTENT: 206,
43  HTTP_STATUS_MULTI_STATUS: 207,
44  HTTP_STATUS_ALREADY_REPORTED: 208,
45  HTTP_STATUS_IM_USED: 226,
46  HTTP_STATUS_MULTIPLE_CHOICES: 300,
47  HTTP_STATUS_MOVED_PERMANENTLY: 301,
48  HTTP_STATUS_FOUND: 302,
49  HTTP_STATUS_SEE_OTHER: 303,
50  HTTP_STATUS_NOT_MODIFIED: 304,
51  HTTP_STATUS_USE_PROXY: 305,
52  HTTP_STATUS_TEMPORARY_REDIRECT: 307,
53  HTTP_STATUS_PERMANENT_REDIRECT: 308,
54  HTTP_STATUS_BAD_REQUEST: 400,
55  HTTP_STATUS_UNAUTHORIZED: 401,
56  HTTP_STATUS_PAYMENT_REQUIRED: 402,
57  HTTP_STATUS_FORBIDDEN: 403,
58  HTTP_STATUS_NOT_FOUND: 404,
59  HTTP_STATUS_METHOD_NOT_ALLOWED: 405,
60  HTTP_STATUS_NOT_ACCEPTABLE: 406,
61  HTTP_STATUS_PROXY_AUTHENTICATION_REQUIRED: 407,
62  HTTP_STATUS_REQUEST_TIMEOUT: 408,
63  HTTP_STATUS_CONFLICT: 409,
64  HTTP_STATUS_GONE: 410,
65  HTTP_STATUS_LENGTH_REQUIRED: 411,
66  HTTP_STATUS_PRECONDITION_FAILED: 412,
67  HTTP_STATUS_PAYLOAD_TOO_LARGE: 413,
68  HTTP_STATUS_URI_TOO_LONG: 414,
69  HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE: 415,
70  HTTP_STATUS_RANGE_NOT_SATISFIABLE: 416,
71  HTTP_STATUS_EXPECTATION_FAILED: 417,
72  HTTP_STATUS_TEAPOT: 418,
73  HTTP_STATUS_MISDIRECTED_REQUEST: 421,
74  HTTP_STATUS_UNPROCESSABLE_ENTITY: 422,
75  HTTP_STATUS_LOCKED: 423,
76  HTTP_STATUS_FAILED_DEPENDENCY: 424,
77  HTTP_STATUS_TOO_EARLY: 425,
78  HTTP_STATUS_UPGRADE_REQUIRED: 426,
79  HTTP_STATUS_PRECONDITION_REQUIRED: 428,
80  HTTP_STATUS_TOO_MANY_REQUESTS: 429,
81  HTTP_STATUS_REQUEST_HEADER_FIELDS_TOO_LARGE: 431,
82  HTTP_STATUS_UNAVAILABLE_FOR_LEGAL_REASONS: 451,
83  HTTP_STATUS_INTERNAL_SERVER_ERROR: 500,
84  HTTP_STATUS_NOT_IMPLEMENTED: 501,
85  HTTP_STATUS_BAD_GATEWAY: 502,
86  HTTP_STATUS_SERVICE_UNAVAILABLE: 503,
87  HTTP_STATUS_GATEWAY_TIMEOUT: 504,
88  HTTP_STATUS_HTTP_VERSION_NOT_SUPPORTED: 505,
89  HTTP_STATUS_VARIANT_ALSO_NEGOTIATES: 506,
90  HTTP_STATUS_INSUFFICIENT_STORAGE: 507,
91  HTTP_STATUS_LOOP_DETECTED: 508,
92  HTTP_STATUS_BANDWIDTH_LIMIT_EXCEEDED: 509,
93  HTTP_STATUS_NOT_EXTENDED: 510,
94  HTTP_STATUS_NETWORK_AUTHENTICATION_REQUIRED: 511
95};
96
97const expectedHeaderNames = {
98  HTTP2_HEADER_STATUS: ':status',
99  HTTP2_HEADER_METHOD: ':method',
100  HTTP2_HEADER_AUTHORITY: ':authority',
101  HTTP2_HEADER_SCHEME: ':scheme',
102  HTTP2_HEADER_PATH: ':path',
103  HTTP2_HEADER_PROTOCOL: ':protocol',
104  HTTP2_HEADER_DATE: 'date',
105  HTTP2_HEADER_ACCEPT_CHARSET: 'accept-charset',
106  HTTP2_HEADER_ACCEPT_ENCODING: 'accept-encoding',
107  HTTP2_HEADER_ACCEPT_LANGUAGE: 'accept-language',
108  HTTP2_HEADER_ACCEPT_RANGES: 'accept-ranges',
109  HTTP2_HEADER_ACCEPT: 'accept',
110  HTTP2_HEADER_ACCESS_CONTROL_ALLOW_CREDENTIALS: 'access-control-allow-credentials', // eslint-disable-line max-len
111  HTTP2_HEADER_ACCESS_CONTROL_ALLOW_HEADERS: 'access-control-allow-headers',
112  HTTP2_HEADER_ACCESS_CONTROL_ALLOW_METHODS: 'access-control-allow-methods',
113  HTTP2_HEADER_ACCESS_CONTROL_ALLOW_ORIGIN: 'access-control-allow-origin',
114  HTTP2_HEADER_ACCESS_CONTROL_EXPOSE_HEADERS: 'access-control-expose-headers',
115  HTTP2_HEADER_ACCESS_CONTROL_MAX_AGE: 'access-control-max-age',
116  HTTP2_HEADER_ACCESS_CONTROL_REQUEST_HEADERS: 'access-control-request-headers',
117  HTTP2_HEADER_ACCESS_CONTROL_REQUEST_METHOD: 'access-control-request-method',
118  HTTP2_HEADER_AGE: 'age',
119  HTTP2_HEADER_ALLOW: 'allow',
120  HTTP2_HEADER_AUTHORIZATION: 'authorization',
121  HTTP2_HEADER_CACHE_CONTROL: 'cache-control',
122  HTTP2_HEADER_CONTENT_DISPOSITION: 'content-disposition',
123  HTTP2_HEADER_CONTENT_ENCODING: 'content-encoding',
124  HTTP2_HEADER_CONTENT_LANGUAGE: 'content-language',
125  HTTP2_HEADER_CONTENT_LENGTH: 'content-length',
126  HTTP2_HEADER_CONTENT_LOCATION: 'content-location',
127  HTTP2_HEADER_CONTENT_RANGE: 'content-range',
128  HTTP2_HEADER_CONTENT_TYPE: 'content-type',
129  HTTP2_HEADER_COOKIE: 'cookie',
130  HTTP2_HEADER_CONNECTION: 'connection',
131  HTTP2_HEADER_DNT: 'dnt',
132  HTTP2_HEADER_ETAG: 'etag',
133  HTTP2_HEADER_EXPECT: 'expect',
134  HTTP2_HEADER_EXPIRES: 'expires',
135  HTTP2_HEADER_FORWARDED: 'forwarded',
136  HTTP2_HEADER_FROM: 'from',
137  HTTP2_HEADER_HOST: 'host',
138  HTTP2_HEADER_IF_MATCH: 'if-match',
139  HTTP2_HEADER_IF_MODIFIED_SINCE: 'if-modified-since',
140  HTTP2_HEADER_IF_NONE_MATCH: 'if-none-match',
141  HTTP2_HEADER_IF_RANGE: 'if-range',
142  HTTP2_HEADER_IF_UNMODIFIED_SINCE: 'if-unmodified-since',
143  HTTP2_HEADER_LAST_MODIFIED: 'last-modified',
144  HTTP2_HEADER_LINK: 'link',
145  HTTP2_HEADER_LOCATION: 'location',
146  HTTP2_HEADER_MAX_FORWARDS: 'max-forwards',
147  HTTP2_HEADER_PREFER: 'prefer',
148  HTTP2_HEADER_PROXY_AUTHENTICATE: 'proxy-authenticate',
149  HTTP2_HEADER_PROXY_AUTHORIZATION: 'proxy-authorization',
150  HTTP2_HEADER_PROXY_CONNECTION: 'proxy-connection',
151  HTTP2_HEADER_RANGE: 'range',
152  HTTP2_HEADER_REFERER: 'referer',
153  HTTP2_HEADER_REFRESH: 'refresh',
154  HTTP2_HEADER_RETRY_AFTER: 'retry-after',
155  HTTP2_HEADER_SERVER: 'server',
156  HTTP2_HEADER_SET_COOKIE: 'set-cookie',
157  HTTP2_HEADER_STRICT_TRANSPORT_SECURITY: 'strict-transport-security',
158  HTTP2_HEADER_TRAILER: 'trailer',
159  HTTP2_HEADER_TRANSFER_ENCODING: 'transfer-encoding',
160  HTTP2_HEADER_TK: 'tk',
161  HTTP2_HEADER_UPGRADE_INSECURE_REQUESTS: 'upgrade-insecure-requests',
162  HTTP2_HEADER_USER_AGENT: 'user-agent',
163  HTTP2_HEADER_VARY: 'vary',
164  HTTP2_HEADER_VIA: 'via',
165  HTTP2_HEADER_WARNING: 'warning',
166  HTTP2_HEADER_WWW_AUTHENTICATE: 'www-authenticate',
167  HTTP2_HEADER_X_CONTENT_TYPE_OPTIONS: 'x-content-type-options',
168  HTTP2_HEADER_X_FRAME_OPTIONS: 'x-frame-options',
169  HTTP2_HEADER_KEEP_ALIVE: 'keep-alive',
170  HTTP2_HEADER_CONTENT_MD5: 'content-md5',
171  HTTP2_HEADER_TE: 'te',
172  HTTP2_HEADER_UPGRADE: 'upgrade',
173  HTTP2_HEADER_HTTP2_SETTINGS: 'http2-settings',
174  HTTP2_HEADER_X_XSS_PROTECTION: 'x-xss-protection',
175  HTTP2_HEADER_ALT_SVC: 'alt-svc',
176  HTTP2_HEADER_CONTENT_SECURITY_POLICY: 'content-security-policy',
177  HTTP2_HEADER_EARLY_DATA: 'early-data',
178  HTTP2_HEADER_EXPECT_CT: 'expect-ct',
179  HTTP2_HEADER_ORIGIN: 'origin',
180  HTTP2_HEADER_PURPOSE: 'purpose',
181  HTTP2_HEADER_TIMING_ALLOW_ORIGIN: 'timing-allow-origin',
182  HTTP2_HEADER_X_FORWARDED_FOR: 'x-forwarded-for',
183};
184
185const expectedNGConstants = {
186  NGHTTP2_SESSION_SERVER: 0,
187  NGHTTP2_SESSION_CLIENT: 1,
188  NGHTTP2_STREAM_STATE_IDLE: 1,
189  NGHTTP2_STREAM_STATE_OPEN: 2,
190  NGHTTP2_STREAM_STATE_RESERVED_LOCAL: 3,
191  NGHTTP2_STREAM_STATE_RESERVED_REMOTE: 4,
192  NGHTTP2_STREAM_STATE_HALF_CLOSED_LOCAL: 5,
193  NGHTTP2_STREAM_STATE_HALF_CLOSED_REMOTE: 6,
194  NGHTTP2_STREAM_STATE_CLOSED: 7,
195  NGHTTP2_HCAT_REQUEST: 0,
196  NGHTTP2_HCAT_RESPONSE: 1,
197  NGHTTP2_HCAT_PUSH_RESPONSE: 2,
198  NGHTTP2_HCAT_HEADERS: 3,
199  NGHTTP2_NO_ERROR: 0,
200  NGHTTP2_PROTOCOL_ERROR: 1,
201  NGHTTP2_INTERNAL_ERROR: 2,
202  NGHTTP2_FLOW_CONTROL_ERROR: 3,
203  NGHTTP2_SETTINGS_TIMEOUT: 4,
204  NGHTTP2_STREAM_CLOSED: 5,
205  NGHTTP2_FRAME_SIZE_ERROR: 6,
206  NGHTTP2_REFUSED_STREAM: 7,
207  NGHTTP2_CANCEL: 8,
208  NGHTTP2_COMPRESSION_ERROR: 9,
209  NGHTTP2_CONNECT_ERROR: 10,
210  NGHTTP2_ENHANCE_YOUR_CALM: 11,
211  NGHTTP2_INADEQUATE_SECURITY: 12,
212  NGHTTP2_HTTP_1_1_REQUIRED: 13,
213  NGHTTP2_NV_FLAG_NONE: 0,
214  NGHTTP2_NV_FLAG_NO_INDEX: 1,
215  NGHTTP2_ERR_DEFERRED: -508,
216  NGHTTP2_ERR_NOMEM: -901,
217  NGHTTP2_ERR_STREAM_ID_NOT_AVAILABLE: -509,
218  NGHTTP2_ERR_INVALID_ARGUMENT: -501,
219  NGHTTP2_ERR_STREAM_CLOSED: -510,
220  NGHTTP2_ERR_FRAME_SIZE_ERROR: -522,
221  NGHTTP2_FLAG_NONE: 0,
222  NGHTTP2_FLAG_END_STREAM: 1,
223  NGHTTP2_FLAG_END_HEADERS: 4,
224  NGHTTP2_FLAG_ACK: 1,
225  NGHTTP2_FLAG_PADDED: 8,
226  NGHTTP2_FLAG_PRIORITY: 32,
227  NGHTTP2_DEFAULT_WEIGHT: 16,
228  NGHTTP2_SETTINGS_HEADER_TABLE_SIZE: 1,
229  NGHTTP2_SETTINGS_ENABLE_PUSH: 2,
230  NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS: 3,
231  NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE: 4,
232  NGHTTP2_SETTINGS_MAX_FRAME_SIZE: 5,
233  NGHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE: 6,
234  NGHTTP2_SETTINGS_ENABLE_CONNECT_PROTOCOL: 8
235};
236
237const defaultSettings = {
238  DEFAULT_SETTINGS_HEADER_TABLE_SIZE: 4096,
239  DEFAULT_SETTINGS_ENABLE_PUSH: 1,
240  DEFAULT_SETTINGS_MAX_CONCURRENT_STREAMS: 4294967295,
241  DEFAULT_SETTINGS_INITIAL_WINDOW_SIZE: 65535,
242  DEFAULT_SETTINGS_MAX_FRAME_SIZE: 16384,
243  DEFAULT_SETTINGS_MAX_HEADER_LIST_SIZE: 65535,
244  DEFAULT_SETTINGS_ENABLE_CONNECT_PROTOCOL: 0
245};
246
247for (const name of Object.keys(constants)) {
248  if (name.startsWith('HTTP_STATUS_')) {
249    assert.strictEqual(constants[name], expectedStatusCodes[name],
250                       `Expected status code match for ${name}`);
251  } else if (name.startsWith('HTTP2_HEADER_')) {
252    assert.strictEqual(constants[name], expectedHeaderNames[name],
253                       `Expected header name match for ${name}`);
254  } else if (name.startsWith('NGHTTP2_')) {
255    assert.strictEqual(constants[name], expectedNGConstants[name],
256                       `Expected ng constant match for ${name}`);
257  } else if (name.startsWith('DEFAULT_SETTINGS_')) {
258    assert.strictEqual(constants[name], defaultSettings[name],
259                       `Expected default setting match for ${name}`);
260  }
261}
262