createRequest() — astro Function Reference
Architecture documentation for the createRequest() function in node.ts from the astro codebase.
Entity Profile
Dependency Diagram
graph TD 859c2d6f_02be_836d_7e05_a64bead34fc2["createRequest()"] 1354a766_a33e_3a71_462c_58c895a2cb0b["NodeApp"] 859c2d6f_02be_836d_7e05_a64bead34fc2 -->|defined in| 1354a766_a33e_3a71_462c_58c895a2cb0b a5be4a1b_0322_df84_edf6_05ca3b1d2e1d["match()"] a5be4a1b_0322_df84_edf6_05ca3b1d2e1d -->|calls| 859c2d6f_02be_836d_7e05_a64bead34fc2 6e6caa7d_367e_071a_401e_c7855246ce6b["render()"] 6e6caa7d_367e_071a_401e_c7855246ce6b -->|calls| 859c2d6f_02be_836d_7e05_a64bead34fc2 b163737b_3a29_d74b_5366_82483039b590["getHostnamePort()"] 859c2d6f_02be_836d_7e05_a64bead34fc2 -->|calls| b163737b_3a29_d74b_5366_82483039b590 29c02ab8_f0b6_cc3f_2e9a_ff0e9d1e3ad9["makeRequestHeaders()"] 859c2d6f_02be_836d_7e05_a64bead34fc2 -->|calls| 29c02ab8_f0b6_cc3f_2e9a_ff0e9d1e3ad9 9cb69406_37f9_feaf_3969_5295fdd738f4["makeRequestBody()"] 859c2d6f_02be_836d_7e05_a64bead34fc2 -->|calls| 9cb69406_37f9_feaf_3969_5295fdd738f4 3c0be459_dc6c_03b0_a286_7074c61621a1["getRequestSocket()"] 859c2d6f_02be_836d_7e05_a64bead34fc2 -->|calls| 3c0be459_dc6c_03b0_a286_7074c61621a1 b7e80edf_e9eb_baf1_e4c5_9b378712743f["getAbortControllerCleanup()"] 859c2d6f_02be_836d_7e05_a64bead34fc2 -->|calls| b7e80edf_e9eb_baf1_e4c5_9b378712743f style 859c2d6f_02be_836d_7e05_a64bead34fc2 fill:#6366f1,stroke:#818cf8,color:#fff
Relationship Graph
Source Code
packages/astro/src/core/app/node.ts lines 61–171
static createRequest(
req: NodeRequest,
{
skipBody = false,
allowedDomains = [],
}: { skipBody?: boolean; allowedDomains?: Partial<RemotePattern>[] } = {},
): Request {
const controller = new AbortController();
const isEncrypted = 'encrypted' in req.socket && req.socket.encrypted;
// Parses multiple header and returns first value if available.
const getFirstForwardedValue = (multiValueHeader?: string | string[]) => {
return multiValueHeader
?.toString()
?.split(',')
.map((e) => e.trim())?.[0];
};
const providedProtocol = isEncrypted ? 'https' : 'http';
const providedHostname = req.headers.host ?? req.headers[':authority'];
// Validate forwarded headers
// NOTE: Header values may have commas/spaces from proxy chains, extract first value
const validated = validateForwardedHeaders(
getFirstForwardedValue(req.headers['x-forwarded-proto']),
getFirstForwardedValue(req.headers['x-forwarded-host']),
getFirstForwardedValue(req.headers['x-forwarded-port']),
allowedDomains,
);
const protocol = validated.protocol ?? providedProtocol;
// validated.host is already sanitized, only sanitize providedHostname
const sanitizedProvidedHostname = sanitizeHost(
typeof providedHostname === 'string' ? providedHostname : undefined,
);
const hostname = validated.host ?? sanitizedProvidedHostname;
const port = validated.port;
let url: URL;
try {
const hostnamePort = getHostnamePort(hostname, port);
url = new URL(`${protocol}://${hostnamePort}${req.url}`);
} catch {
// Fallback to the provided hostname and port
const hostnamePort = getHostnamePort(providedHostname, port);
url = new URL(`${providedProtocol}://${hostnamePort}`);
}
const options: RequestInit = {
method: req.method || 'GET',
headers: makeRequestHeaders(req),
signal: controller.signal,
};
const bodyAllowed = options.method !== 'HEAD' && options.method !== 'GET' && skipBody === false;
if (bodyAllowed) {
Object.assign(options, makeRequestBody(req));
}
const request = new Request(url, options);
const socket = getRequestSocket(req);
if (socket && typeof socket.on === 'function') {
const existingCleanup = getAbortControllerCleanup(req);
if (existingCleanup) {
existingCleanup();
}
let cleanedUp = false;
const removeSocketListener = () => {
if (typeof socket.off === 'function') {
socket.off('close', onSocketClose);
} else if (typeof socket.removeListener === 'function') {
socket.removeListener('close', onSocketClose);
}
};
const cleanup = () => {
if (cleanedUp) return;
cleanedUp = true;
removeSocketListener();
Domain
Subdomains
Defined In
Calls
Source
Frequently Asked Questions
What does createRequest() do?
createRequest() is a function in the astro codebase, defined in packages/astro/src/core/app/node.ts.
Where is createRequest() defined?
createRequest() is defined in packages/astro/src/core/app/node.ts at line 61.
What does createRequest() call?
createRequest() calls 5 function(s): getAbortControllerCleanup, getHostnamePort, getRequestSocket, makeRequestBody, makeRequestHeaders.
What calls createRequest()?
createRequest() is called by 2 function(s): match, render.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free