{"record":{"id":"59324efa24d430fc","repo":"denoland/deno","slug":"err-http2-invalid-setting-value-59324e","errorCode":"ERR_HTTP2_INVALID_SETTING_VALUE","errorMessage":"Invalid value for setting \"Range Error\": ${nsetting}","messagePattern":"Invalid value for setting \"Range Error\": (.+?)","errorType":"validation","errorClass":"NodeRangeError","httpStatus":null,"severity":"error","filePath":"ext/node/polyfills/internal/http2/util.ts","lineNumber":402,"sourceCode":"function updateSettingsBuffer(settings) {\n  ensureHttpStateBuffers();\n  let flags = 0;\n  let numCustomSettings = 0;\n\n  if (typeof settings.customSettings === \"object\") {\n    const customSettings = settings.customSettings;\n    for (const setting in customSettings) {\n      const val = customSettings[setting];\n      if (typeof val === \"number\") {\n        let set = false;\n        const nsetting = Number(setting);\n        if (\n          NumberIsNaN(nsetting) ||\n          typeof nsetting !== \"number\" ||\n          0 >= nsetting ||\n          nsetting > 0xffff\n        ) {\n          throw new ERR_HTTP2_INVALID_SETTING_VALUE.RangeError(\n            \"Range Error\",\n            nsetting,\n            0,\n            0xffff,\n          );\n        }\n        if (\n          NumberIsNaN(val) ||\n          typeof val !== \"number\" ||\n          0 >= val ||\n          val > 0xffffffff\n        ) {\n          throw new ERR_HTTP2_INVALID_SETTING_VALUE.RangeError(\n            \"Range Error\",\n            val,\n            0,\n            0xffffffff,\n          );","sourceCodeStart":384,"sourceCodeEnd":420,"githubUrl":"https://github.com/denoland/deno/blob/9ad36f7a2cce60488e6ec52283efb32efddaf93a/ext/node/polyfills/internal/http2/util.ts#L384-L420","documentation":"While packing session settings, http2/util.ts validates each customSettings entry: the setting identifier (the object key, coerced with Number()) must be a numeric value in 1..0xffff. A key that is not numeric, NaN, <= 0, or > 0xffff throws ERR_HTTP2_INVALID_SETTING_VALUE (RangeError variant) with the offending identifier in the message. customSettings keys are numeric HTTP/2 setting IDs, never names.","triggerScenarios":"http2.connect(url, { settings: { customSettings: { enableFoo: 1 } } }) — key 'enableFoo' coerces to NaN; { '0': 1 } (zero rejected); { '70000': 1 } (> 0xffff); float keys like '1.5'.","commonSituations":"Copied snippets using descriptive string names for experimental settings; porting nghttp2 numeric constants as strings that overflow; assuming any object key works because TypeScript types it as Record<string, number>.","solutions":["Use numeric keys in 1-65535: customSettings: { 0xff02: 1 } — write them as numbers, not names","Use http2.constants / documented IDs for known experimental settings","Validate keys before connect: Number(key) is an integer within 1..65535"],"exampleFix":"// before\nhttp2.connect(\"https://example.com\", {\n  settings: { customSettings: { enableFoo: 1 } }, // key -> NaN -> throw\n});\n\n// after\nhttp2.connect(\"https://example.com\", {\n  settings: { customSettings: { 65278: 1 } }, // numeric setting id\n});","handlingStrategy":"validation","validationCode":"function validCustomSettingIds(cs = {}) {\n  return Object.keys(cs).every((k) => {\n    const id = Number(k);\n    return Number.isInteger(id) && id >= 1 && id <= 0xffff;\n  });\n}\nif (validCustomSettingIds(settings.customSettings)) {\n  session = http2.connect(url, { settings });\n}","typeGuard":"function isCustomSettingsMap(\n  cs: unknown,\n): cs is Record<number, number> {\n  if (cs == null) return true;\n  return Object.entries(cs).every(([k, v]) => {\n    const id = Number(k);\n    return Number.isInteger(id) && id >= 1 && id <= 0xffff &&\n      Number.isFinite(v as number) && (v as number) >= 1 &&\n      (v as number) <= 0xffffffff;\n  });\n}","tryCatchPattern":"try {\n  session = http2.connect(url, { settings });\n} catch (err) {\n  if (err.code === \"ERR_HTTP2_INVALID_SETTING_VALUE\") {\n    delete settings.customSettings; // drop bad ids and retry with standard settings\n    session = http2.connect(url, { settings });\n  } else throw err;\n}","preventionTips":["Remember customSettings keys are numeric HTTP/2 setting IDs, never names","Range-check ids (1-65535) and values (1-4294967295) in one helper before connect"],"tags":["http2","settings","range-error","validation"],"backgroundTag":"http2-settings-validation","analyzedSha":"9ad36f7a2cce60488e6ec52283efb32efddaf93a","analyzedAt":"2026-08-20T13:07:44.778Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}