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 =