| 206 | } |
| 207 | |
| 208 | private applyUpdate(update: Update): void { |
| 209 | const key = update.name.toLowerCase(); |
| 210 | switch (update.op) { |
| 211 | case 'a': |
| 212 | case 's': |
| 213 | let value = update.value!; |
| 214 | if (typeof value === 'string') { |
| 215 | value = [value]; |
| 216 | } |
| 217 | if (value.length === 0) { |
| 218 | return; |
| 219 | } |
| 220 | this.maybeSetNormalizedName(update.name, key); |
| 221 | const base = update.op === 'a' ? (this.headers.get(key) || []).slice() : []; |
| 222 | base.push(...value); |
| 223 | this.headers.set(key, base); |
| 224 | break; |
| 225 | case 'd': |
| 226 | const toDelete = update.value; |
| 227 | if (toDelete === undefined) { |
| 228 | this.headers.delete(key); |
| 229 | this.normalizedNames.delete(key); |
| 230 | } else { |
| 231 | const valuesToDelete = Array.isArray(toDelete) ? toDelete : [toDelete]; |
| 232 | let existing = this.headers.get(key); |
| 233 | if (!existing) { |
| 234 | return; |
| 235 | } |
| 236 | existing = existing.filter((value) => valuesToDelete.indexOf(value) === -1); |
| 237 | if (existing.length === 0) { |
| 238 | this.headers.delete(key); |
| 239 | this.normalizedNames.delete(key); |
| 240 | } else { |
| 241 | this.headers.set(key, existing); |
| 242 | } |
| 243 | } |
| 244 | break; |
| 245 | } |
| 246 | } |
| 247 | |
| 248 | private addHeaderEntry(name: string, value: string) { |
| 249 | const key = name.toLowerCase(); |