MCPcopy
hub / github.com/vercel/next.js / parse

Function parse

packages/next/src/server/accept-header.ts:13–128  ·  view source on GitHub ↗
(
  raw: string,
  preferences: readonly string[] | undefined,
  options: Options
)

Source from the content-addressed store, hash-verified

11}
12
13function parse(
14 raw: string,
15 preferences: readonly string[] | undefined,
16 options: Options
17) {
18 const lowers = new Map<string, { orig: string; pos: number }>()
19 const header = raw.replace(/[ \t]/g, '')
20
21 if (preferences) {
22 let pos = 0
23 for (const preference of preferences) {
24 const lower = preference.toLowerCase()
25 lowers.set(lower, { orig: preference, pos: pos++ })
26 if (options.prefixMatch) {
27 const parts = lower.split('-')
28 while ((parts.pop(), parts.length > 0)) {
29 const joined = parts.join('-')
30 if (!lowers.has(joined)) {
31 lowers.set(joined, { orig: preference, pos: pos++ })
32 }
33 }
34 }
35 }
36 }
37
38 const parts = header.split(',')
39 const selections: Selection[] = []
40 const map = new Set<string>()
41
42 for (let i = 0; i < parts.length; ++i) {
43 const part = parts[i]
44 if (!part) {
45 continue
46 }
47
48 const params = part.split(';')
49 if (params.length > 2) {
50 throw new Error(`Invalid ${options.type} header`)
51 }
52
53 let token = params[0].toLowerCase()
54 if (!token) {
55 throw new Error(`Invalid ${options.type} header`)
56 }
57
58 const selection: Selection = { token, pos: i, q: 1 }
59 if (preferences && lowers.has(token)) {
60 selection.pref = lowers.get(token)!.pos
61 }
62
63 map.add(selection.token)
64
65 if (params.length === 2) {
66 const q = params[1]
67 const [key, value] = q.split('=')
68
69 if (!value || (key !== 'q' && key !== 'Q')) {
70 throw new Error(`Invalid ${options.type} header`)

Callers 1

acceptLanguageFunction · 0.70

Calls 13

toLowerCaseMethod · 0.80
splitMethod · 0.80
isFiniteMethod · 0.80
replaceMethod · 0.65
setMethod · 0.65
getMethod · 0.65
pushMethod · 0.65
popMethod · 0.45
joinMethod · 0.45
hasMethod · 0.45
addMethod · 0.45
sortMethod · 0.45

Tested by

no test coverage detected