diff --git a/docs/dfx-json-schema.json b/docs/dfx-json-schema.json index 65b8712b8f..a92cf8939a 100644 --- a/docs/dfx-json-schema.json +++ b/docs/dfx-json-schema.json @@ -730,15 +730,15 @@ "ConfigDefaultsProxy": { "description": "Configuration for the HTTP gateway.", "type": "object", - "required": [ - "domain" - ], "properties": { "domain": { "description": "A list of domains that can be served. These are used for canister resolution [default: localhost]", - "allOf": [ + "anyOf": [ { "$ref": "#/definitions/SerdeVec_for_String" + }, + { + "type": "null" } ] } diff --git a/docs/networks-json-schema.json b/docs/networks-json-schema.json index 1f675c3f0e..0a8b1bf8eb 100644 --- a/docs/networks-json-schema.json +++ b/docs/networks-json-schema.json @@ -107,15 +107,15 @@ "ConfigDefaultsProxy": { "description": "Configuration for the HTTP gateway.", "type": "object", - "required": [ - "domain" - ], "properties": { "domain": { "description": "A list of domains that can be served. These are used for canister resolution [default: localhost]", - "allOf": [ + "anyOf": [ { "$ref": "#/definitions/SerdeVec_for_String" + }, + { + "type": "null" } ] } diff --git a/e2e/tests-dfx/frontend.bash b/e2e/tests-dfx/frontend.bash index b27b73d1fc..e6288b00fd 100644 --- a/e2e/tests-dfx/frontend.bash +++ b/e2e/tests-dfx/frontend.bash @@ -65,6 +65,15 @@ teardown() { assert_match "Connection refused" } +@test "dfx routes frontend based on subdomain" { + dfx_start + PORT=$(get_webserver_port) + dfx deploy + ID=$(dfx canister id e2e_project_frontend) + assert_command curl "http://$ID.localhost:$PORT/" + assert_match "" +} + @test "dfx uses .ic-assets.json file provided in src/__project_name__frontend/assets" { echo '[{"match": "*", "headers": {"x-key": "x-value"}}]' > src/e2e_project_frontend/assets/.ic-assets.json5 diff --git a/src/dfx-core/src/config/model/dfinity.rs b/src/dfx-core/src/config/model/dfinity.rs index a3ac91b59a..b468dd1510 100644 --- a/src/dfx-core/src/config/model/dfinity.rs +++ b/src/dfx-core/src/config/model/dfinity.rs @@ -673,7 +673,7 @@ pub struct ConfigDefaultsReplica { #[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] pub struct ConfigDefaultsProxy { /// A list of domains that can be served. These are used for canister resolution [default: localhost] - pub domain: SerdeVec, + pub domain: Option>, } // Schemars doesn't add the enum value's docstrings. Therefore the explanations have to be up here. diff --git a/src/dfx-core/src/config/model/local_server_descriptor.rs b/src/dfx-core/src/config/model/local_server_descriptor.rs index 7fe770720c..e14afa4727 100644 --- a/src/dfx-core/src/config/model/local_server_descriptor.rs +++ b/src/dfx-core/src/config/model/local_server_descriptor.rs @@ -265,7 +265,7 @@ impl LocalServerDescriptor { pub fn with_proxy_domains(self, domains: Vec) -> LocalServerDescriptor { let proxy = ConfigDefaultsProxy { - domain: SerdeVec::Many(domains), + domain: Some(SerdeVec::Many(domains)), }; Self { proxy, ..self } } diff --git a/src/dfx/src/actors/pocketic_proxy.rs b/src/dfx/src/actors/pocketic_proxy.rs index bfbee09e05..91e4793bff 100644 --- a/src/dfx/src/actors/pocketic_proxy.rs +++ b/src/dfx/src/actors/pocketic_proxy.rs @@ -48,7 +48,7 @@ pub struct PocketIcProxyConfig { pub verbose: bool, /// list of domains that can be served (localhost if none specified) - pub domains: Vec, + pub domains: Option>, } /// The configuration for the pocketic_proxy actor. @@ -226,7 +226,7 @@ fn pocketic_proxy_start_thread( pocketic_proxy_port_path: PathBuf, receiver: Receiver<()>, verbose: bool, - domains: Vec, + domains: Option>, ) -> DfxResult> { let thread_handler = move || { loop { @@ -328,7 +328,7 @@ fn pocketic_proxy_start_thread( fn block_on_initialize_gateway( pocketic_url: Url, replica_url: Url, - domains: Vec, + domains: Option>, addr: SocketAddr, logger: Logger, ) -> DfxResult { @@ -349,7 +349,7 @@ fn block_on_initialize_gateway( async fn initialize_gateway( pocketic_url: Url, replica_url: Url, - domains: Vec, + domains: Option>, addr: SocketAddr, logger: Logger, ) -> DfxResult { @@ -365,7 +365,7 @@ async fn initialize_gateway( forward_to: HttpGatewayBackend::Replica(replica_url.to_string()), ip_addr: Some(addr.ip().to_string()), port: Some(addr.port()), - domains: Some(domains), + domains, https_config: None, }) .send() @@ -380,6 +380,12 @@ async fn initialize_gateway( } #[cfg(not(unix))] -async fn initialize_gateway(_: Url, _: Url, _: Vec, _: SocketAddr, _: Logger) -> DfxResult { +async fn initialize_gateway( + _: Url, + _: Url, + _: Option>, + _: SocketAddr, + _: Logger, +) -> DfxResult { bail!("PocketIC gateway not supported on this platform") } diff --git a/src/dfx/src/commands/start.rs b/src/dfx/src/commands/start.rs index fa9d491925..595f5f7ee3 100644 --- a/src/dfx/src/commands/start.rs +++ b/src/dfx/src/commands/start.rs @@ -293,7 +293,11 @@ pub fn exec( .log_level .unwrap_or_default(); - let proxy_domains = local_server_descriptor.proxy.domain.clone().into_vec(); + let proxy_domains = local_server_descriptor + .proxy + .domain + .clone() + .map(|v| v.into_vec()); let replica_config = { let replica_config =