Home / Function/ createRequest() — astro Function Reference

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

Called By

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