* 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)
| 764 | * @returns {[string, number]} |
| 765 | */ |
| 766 | function 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 | } |
no test coverage detected
searching dependent graphs…