MCPcopy Index your code
hub / github.com/nodejs/node / buildNgHeaderString

Function buildNgHeaderString

lib/internal/http2/util.js:766–851  ·  view source on GitHub ↗

* Builds an NgHeader string + header count value, validating the header key * format, rejecting illegal header configurations, and marking sensitive headers * that should not be indexed en route. This takes either a flat map of * raw headers ([k1, v1, k2, v2]) or a header object ({ k1: v1, k2: [v

(arrayOrMap,
                             validatePseudoHeaderValue,
                             strictSingleValueFields)

Source from the content-addressed store, hash-verified

764 * @returns {[string, number]}
765 */
766function buildNgHeaderString(arrayOrMap,
767 validatePseudoHeaderValue,
768 strictSingleValueFields) {
769 let headers = '';
770 let pseudoHeaders = '';
771 let count = 0;
772
773 const singles = new SafeSet();
774 const sensitiveHeaders = arrayOrMap[kSensitiveHeaders] || emptyArray;
775 const neverIndex = sensitiveHeaders.map((v) => v.toLowerCase());
776
777 function processHeader(key, value) {
778 key = key.toLowerCase();
779 const isStrictSingleValueField = strictSingleValueFields &&
780 kSingleValueFields.has(key);
781 let isArray = ArrayIsArray(value);
782 if (isArray) {
783 switch (value.length) {
784 case 0:
785 return;
786 case 1:
787 value = String(value[0]);
788 isArray = false;
789 break;
790 default:
791 if (isStrictSingleValueField)
792 throw new ERR_HTTP2_HEADER_SINGLE_VALUE(key);
793 }
794 } else {
795 value = String(value);
796 }
797 if (isStrictSingleValueField) {
798 if (singles.has(key))
799 throw new ERR_HTTP2_HEADER_SINGLE_VALUE(key);
800 singles.add(key);
801 }
802 const flags = neverIndex.includes(key) ?
803 kNeverIndexFlag :
804 kNoHeaderFlags;
805 if (key[0] === ':') {
806 const err = validatePseudoHeaderValue(key);
807 if (err !== undefined)
808 throw err;
809 pseudoHeaders += `${key}\0${value}\0${flags}`;
810 count++;
811 return;
812 }
813 if (!checkIsHttpToken(key)) {
814 throw new ERR_INVALID_HTTP_TOKEN('Header name', key);
815 }
816 if (isIllegalConnectionSpecificHeader(key, value)) {
817 throw new ERR_HTTP2_INVALID_CONNECTION_HEADERS(key);
818 }
819 if (isArray) {
820 for (let j = 0; j < value.length; ++j) {
821 const val = String(value[j]);
822 headers += `${key}\0${val}\0${flags}`;
823 }

Callers 12

sendHeadersMethod · 0.85
sendTrailersMethod · 0.85
[kSendHeaders]Method · 0.85
sendTrailersMethod · 0.85
prepareResponseHeadersFunction · 0.85
processRespondWithFDFunction · 0.85
pushStreamMethod · 0.85
additionalHeadersMethod · 0.85

Calls 2

processHeaderFunction · 0.70
mapMethod · 0.65

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…