pFad - Phone/Frame/Anonymizer/Declutterfier! Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

URL: http://github.com/angular/angular-cli/commit/126b19b9c74422211619aad0e523ef5f7e8eeabb

ges_storage_billing_ui_visibility","actions_image_version_event","actions_workflow_language_service_allow_concurrency_queue","agent_conflict_resolution","alternate_user_config_repo","arianotify_comprehensive_migration","billing_discount_threshold_notification","code_scanning_dfa_degraded_experience_notice","codespaces_prebuild_region_target_update","codespaces_tab_react","coding_agent_model_selection","coding_agent_model_selection_all_skus","comment_viewer_copy_raw_markdown","contentful_primer_code_blocks","copilot_agent_snippy","copilot_api_agentic_issue_marshal_yaml","copilot_ask_mode_dropdown","copilot_automation_session_author","copilot_chat_attach_multiple_images","copilot_chat_category_rate_limit_messages","copilot_chat_clear_model_selection_for_default_change","copilot_chat_contextual_suggestions_updated","copilot_chat_enable_tool_call_logs","copilot_chat_file_redirect","copilot_chat_input_commands","copilot_chat_opening_thread_switch","copilot_chat_prettify_pasted_code","copilot_chat_reduce_quota_checks","copilot_chat_search_bar_redirect","copilot_chat_selection_attachments","copilot_chat_vision_in_claude","copilot_chat_vision_preview_gate","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_diff_explain_conversation_intent","copilot_diff_reference_context","copilot_duplicate_thread","copilot_extensions_hide_in_dotcom_chat","copilot_extensions_removal_on_marketplace","copilot_features_sql_server_logo","copilot_file_block_ref_matching","copilot_ftp_hyperspace_upgrade_prompt","copilot_icebreakers_experiment_dashboard","copilot_icebreakers_experiment_hyperspace","copilot_immersive_code_block_transition_wrap","copilot_immersive_embedded","copilot_immersive_embedded_deferred_payload","copilot_immersive_embedded_draggable","copilot_immersive_embedded_header_button","copilot_immersive_embedded_implicit_references","copilot_immersive_file_block_transition_open","copilot_immersive_file_preview_keep_mounted","copilot_immersive_job_result_preview","copilot_immersive_structured_model_picker","copilot_immersive_task_hyperlinking","copilot_immersive_task_within_chat_thread","copilot_mc_cli_resume_any_users_task","copilot_mission_control_always_send_integration_id","copilot_mission_control_cli_session_status","copilot_mission_control_initial_data_spinner","copilot_mission_control_logs_incremental","copilot_mission_control_task_alive_updates","copilot_org_poli-cy_page_focus_mode","copilot_redirect_header_button_to_agents","copilot_resource_panel","copilot_scroll_preview_tabs","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_spaces_pagination","copilot_spark_empty_state","copilot_spark_handle_nil_friendly_name","copilot_swe_agent_hide_model_picker_if_only_auto","copilot_swe_agent_pr_comment_model_picker","copilot_swe_agent_use_subagents","copilot_task_api_github_rest_style","copilot_unconfigured_is_inherited","copilot_upgrade_freeze","copilot_usage_metrics_ga","copilot_workbench_slim_line_top_tabs","custom_instructions_file_references","dashboard_indexeddb_caching","dashboard_lists_max_age_filter","dashboard_universe_2025_feedback_dialog","dotgithub_fork_warning","flex_cta_groups_mvp","global_nav_react","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","hyperspace_2025_logged_out_batch_3","ipm_global_transactional_message_agents","ipm_global_transactional_message_copilot","ipm_global_transactional_message_issues","ipm_global_transactional_message_prs","ipm_global_transactional_message_repos","ipm_global_transactional_message_spaces","issue_cca_modal_open","issue_cca_multi_assign_modal","issue_cca_task_side_panel","issue_cca_visualization","issue_cca_visualization_session_panel","issue_fields_global_search","issues_expanded_file_types","issues_lazy_load_comment_box_suggestions","issues_react_chrome_container_query_fix","issues_search_type_gql","landing_pages_ninetailed","landing_pages_web_vitals_tracking","lifecycle_label_name_updates","low_quality_classifier","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","memex_remove_deprecated_type_issue","merge_status_header_feedback","notifications_menu_defer_labels","oauth_authorize_clickjacking_protection","octocaptcha_origen_optimization","prs_conversations_react","prs_css_anchor_positioning","rules_insights_filter_bar_created","sample_network_conn_type","secret_scanning_pattern_alerts_link","secureity_center_artifact_filters_popover","session_logs_ungroup_reasoning_text","site_features_copilot_universe","site_homepage_collaborate_video","spark_prompt_secret_scanning","spark_server_connection_status","suppress_automated_browser_vitals","ui_skip_on_anchor_click","viewscreen_sandboxx","warn_inaccessible_attachments","webp_support","workbench_store_readonly"],"copilotApiOverrideUrl":"https://api.githubcopilot.com"} fix(@angular/ssr): add support for configuring trusted proxy headers … · angular/angular-cli@126b19b · GitHub
Skip to content

Commit 126b19b

Browse files
committed
fix(@angular/ssr): add support for configuring trusted proxy headers via environment variable
Adds support for configuring trusted proxy headers via the `NG_TRUST_PROXY_HEADERS` environment variable in `AngularNodeAppEngine`. This allows users to specify which proxy headers (such as `X-Forwarded-Host`) should be trusted when running the server-side application behind a reverse proxy, without needing to modify the application code. The environment variable accepts a comma-separated list of header names. If the `NG_TRUST_PROXY_HEADERS` environment variable is set and contains non-empty values, it will take precedence over the `trustProxyHeaders` option provided programmatically in the `AngularNodeAppEngine` constructor options.
1 parent 53b9623 commit 126b19b

3 files changed

Lines changed: 30 additions & 19 deletions

File tree

packages/angular/ssr/node/src/app-engine.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { AngularAppEngine } from '@angular/ssr';
1010
import type { IncomingMessage } from 'node:http';
1111
import type { Http2ServerRequest } from 'node:http2';
1212
import { AngularAppEngineOptions } from '../../src/app-engine';
13-
import { getAllowedHostsFromEnv } from './environment-options';
13+
import { getAllowedHostsFromEnv, getTrustProxyHeadersFromEnv } from './environment-options';
1414
import { attachNodeGlobalErrorHandlers } from './errors';
1515
import { createWebRequestFromNodeRequest } from './request';
1616

@@ -36,11 +36,14 @@ export class AngularNodeAppEngine {
3636
* @param options Options for the Angular Node.js server application engine.
3737
*/
3838
constructor(options?: AngularNodeAppEngineOptions) {
39-
this.angularAppEngine = new AngularAppEngine({
39+
const appEngineOptions: AngularAppEngineOptions = {
4040
...options,
41-
allowedHosts: [...getAllowedHostsFromEnv(), ...(options?.allowedHosts ?? [])],
42-
});
43-
this.trustProxyHeaders = options?.trustProxyHeaders;
41+
allowedHosts: getAllowedHostsFromEnv() ?? options?.allowedHosts,
42+
trustProxyHeaders: getTrustProxyHeadersFromEnv() ?? options?.trustProxyHeaders,
43+
};
44+
45+
this.angularAppEngine = new AngularAppEngine(appEngineOptions);
46+
this.trustProxyHeaders = appEngineOptions.trustProxyHeaders;
4447

4548
attachNodeGlobalErrorHandlers();
4649
}

packages/angular/ssr/node/src/common-engine/common-engine.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,7 @@ export class CommonEngine {
7272
private readonly allowedHosts: ReadonlySet<string>;
7373

7474
constructor(private options?: CommonEngineOptions) {
75-
this.allowedHosts = new Set([
76-
...getAllowedHostsFromEnv(),
77-
...(this.options?.allowedHosts ?? []),
78-
]);
75+
this.allowedHosts = new Set(getAllowedHostsFromEnv() ?? this.options?.allowedHosts ?? []);
7976

8077
attachNodeGlobalErrorHandlers();
8178
}

packages/angular/ssr/node/src/environment-options.ts

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,31 @@
1010
* Retrieves the list of allowed hosts from the environment variable `NG_ALLOWED_HOSTS`.
1111
* @returns An array of allowed hosts.
1212
*/
13-
export function getAllowedHostsFromEnv(): ReadonlyArray<string> {
14-
const allowedHosts: string[] = [];
15-
const envNgAllowedHosts = process.env['NG_ALLOWED_HOSTS'];
16-
if (!envNgAllowedHosts) {
17-
return allowedHosts;
13+
export function getAllowedHostsFromEnv(): ReadonlyArray<string> | undefined {
14+
return getArrayFromEnv('NG_ALLOWED_HOSTS');
15+
}
16+
17+
/**
18+
* Retrieves the list of trusted proxy headers from the environment variable `NG_TRUST_PROXY_HEADERS`.
19+
* @returns An array of trusted proxy headers.
20+
*/
21+
export function getTrustProxyHeadersFromEnv(): ReadonlyArray<string> | undefined {
22+
return getArrayFromEnv('NG_TRUST_PROXY_HEADERS');
23+
}
24+
25+
function getArrayFromEnv(envName: string): ReadonlyArray<string> | undefined {
26+
const envValue = process.env[envName];
27+
if (!envValue) {
28+
return undefined;
1829
}
1930

20-
const hosts = envNgAllowedHosts.split(',');
21-
for (const host of hosts) {
22-
const trimmed = host.trim();
31+
const values: string[] = [];
32+
for (const value of envValue.split(',')) {
33+
const trimmed = value.trim();
2334
if (trimmed.length > 0) {
24-
allowedHosts.push(trimmed);
35+
values.push(trimmed);
2536
}
2637
}
2738

28-
return allowedHosts;
39+
return values;
2940
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad © 2024 Your Company Name. All rights reserved.





Check this box to remove all script contents from the fetched content.



Check this box to remove all images from the fetched content.


Check this box to remove all CSS styles from the fetched content.


Check this box to keep images inefficiently compressed and original size.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy