Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
71a34d1
Chore: Regional API domain processing
manisha1997 Nov 25, 2025
515b1ed
Merge branch 'main' into regional-api-domain-processing
manisha1997 Nov 25, 2025
a26a4fa
Chore: Regional API domain processing
manisha1997 Nov 25, 2025
5f4ad71
Chore: Regional API domain processing
manisha1997 Nov 25, 2025
30246bf
Chore: Regional API domain processing
manisha1997 Nov 25, 2025
ee512b7
Chore: Regional API domain processing
manisha1997 Nov 25, 2025
931cfb4
Chore: Regional API domain processing
manisha1997 Nov 25, 2025
bee95a3
Chore: Regional API domain processing
manisha1997 Nov 25, 2025
7e275ae
Chore: Regional API domain processing
manisha1997 Nov 25, 2025
0b1badd
Chore: Regional API domain processing
manisha1997 Nov 25, 2025
6f4f17c
Chore: Regional API domain processing
manisha1997 Nov 27, 2025
d420db2
Chore: Regional API domain processing
manisha1997 Nov 27, 2025
80c8f7e
Chore: Regional API domain processing
manisha1997 Nov 27, 2025
f028c02
Chore: Regional API domain processing
manisha1997 Nov 27, 2025
b88a705
Chore: Regional API domain processing
manisha1997 Nov 28, 2025
0af8832
Update src/main/java/com/twilio/type/RegionEndpoints.java
manisha1997 Nov 28, 2025
4405a95
Update src/main/java/com/twilio/http/TwilioRestClient.java
manisha1997 Nov 28, 2025
1671eba
Chore: Regional API domain processing
manisha1997 Nov 28, 2025
d884ee3
Update src/main/java/com/twilio/Twilio.java
manisha1997 Nov 28, 2025
62221c4
Chore: Regional API domain processing
manisha1997 Nov 28, 2025
d070528
Chore: Regional API domain processing
manisha1997 Nov 28, 2025
9ea49f3
Chore: Regional API domain processing
manisha1997 Nov 28, 2025
b62be7f
Update src/main/java/com/twilio/http/TwilioRestClient.java
manisha1997 Nov 28, 2025
d4d255d
Update src/main/java/com/twilio/Twilio.java
manisha1997 Nov 28, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 15 additions & 1 deletion src/main/java/com/twilio/Twilio.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,17 @@
import com.twilio.http.Request;
import com.twilio.http.Response;
import com.twilio.http.TwilioRestClient;
import com.twilio.type.RegionEndpoints;
import java.util.Map;
import lombok.Getter;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* Singleton class to initialize Twilio environment.
Expand All @@ -40,6 +44,11 @@ public class Twilio {

private static CredentialProvider credentialProvider;

private static Map<String, String> regionMap = RegionEndpoints.getRegions();
private static final Logger logger = LoggerFactory.getLogger(Twilio.class);



private Twilio() {
}

Expand Down Expand Up @@ -234,7 +243,12 @@ private static TwilioRestClient buildRestClient() {
if (userAgentExtensions != null) {
builder.userAgentExtensions(Twilio.userAgentExtensions);
}

if (Twilio.edge == null && Twilio.region != null) {
logger.warn(
"Setting default `Edge` for the provided `region`. For regional processing, DNS is of format product.<city>.<region>.twilio.com; otherwise use product.twilio.com."
);
Twilio.edge = regionMap.get(Twilio.region);
}
builder.region(Twilio.region);
builder.edge(Twilio.edge);

Expand Down
14 changes: 12 additions & 2 deletions src/main/java/com/twilio/http/TwilioRestClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.twilio.Twilio;

Check warning on line 5 in src/main/java/com/twilio/http/TwilioRestClient.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Remove this unused import 'com.twilio.Twilio'.

See more on https://sonarcloud.io/project/issues?id=twilio_twilio-java&issues=AZrEsr2o2v82-KtyibXP&open=AZrEsr2o2v82-KtyibXP&pullRequest=928
import com.twilio.auth_strategy.AuthStrategy;
import com.twilio.constant.EnumConstants;
import com.twilio.type.RegionEndpoints;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -69,14 +71,22 @@
@Getter
private final List<String> userAgentExtensions;
private static final Logger logger = LoggerFactory.getLogger(TwilioRestClient.class);
private static Map<String, String> regionMap = RegionEndpoints.getRegions();

protected TwilioRestClient(Builder b) {
this.username = b.username;
this.password = b.password;
this.authStrategy = b.authStrategy;
this.accountSid = b.accountSid;
this.region = b.region;
this.edge = b.edge;
if(b.edge == null && b.region != null) {
logger.warn(
"Setting default `Edge` for the provided `region`. For regional processing, DNS is of format product.<city>.<region>.twilio.com; otherwise use product.twilio.com."
);
this.edge = regionMap.get(this.region);
}
else
this.edge = b.edge;
this.httpClient = b.httpClient;
this.objectMapper = b.objectMapper;
this.userAgentExtensions = b.userAgentExtensions;
Expand All @@ -89,7 +99,7 @@
* @return Response object
*/
public Response request(final Request request) {
// If authStrategy is passed from NoAuth API, no need to set authStrategy (ex TokenCreator).
// If authStrategy is passed from NoAuth API, no need to set authStrategy (ex TokenCreator).
if (request.getAuthStrategy() == null) {
if (username != null && password != null) {
request.setAuth(username, password);
Expand Down
30 changes: 30 additions & 0 deletions src/main/java/com/twilio/type/RegionEndpoints.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.twilio.type;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
* Provides region-to-edge mappings for Twilio's regional processing.
* <p>
* This class is part of the transition away from direct edge configuration,
* allowing clients to use region identifiers that are mapped to the appropriate edge endpoints.
* It is intended to centralize and simplify region-to-edge lookups for Twilio services.
*/
public class RegionEndpoints {

Check warning on line 14 in src/main/java/com/twilio/type/RegionEndpoints.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Add a private constructor to hide the implicit public one.

See more on https://sonarcloud.io/project/issues?id=twilio_twilio-java&issues=AZq6cNzNDINOUa6eFoQc&open=AZq6cNzNDINOUa6eFoQc&pullRequest=928
private static Map<String, String> regionMap = new HashMap<>();
static {
regionMap.put("au1", "sydney");
regionMap.put("br1", "sao-paulo");
regionMap.put("ie1", "dublin");
regionMap.put("de1", "frankfurt");
regionMap.put("jp1", "tokyo");
regionMap.put("jp2", "osaka");
regionMap.put("sg1", "singapore");
regionMap.put("us1", "ashburn");
regionMap.put("us2", "umatilla");
}
public static Map<String, String> getRegions() {
return Collections.unmodifiableMap(regionMap);
}
}
27 changes: 27 additions & 0 deletions src/test/java/com/twilio/TwilioTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,11 @@
import com.twilio.http.Response;
import com.twilio.http.TwilioRestClient;

import com.twilio.type.RegionEndpoints;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;

Check warning on line 15 in src/test/java/com/twilio/TwilioTest.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Remove this unused import 'java.util.HashMap'.

See more on https://sonarcloud.io/project/issues?id=twilio_twilio-java&issues=AZq6cN4LDINOUa6eFoQg&open=AZq6cN4LDINOUa6eFoQg&pullRequest=928
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
Expand Down Expand Up @@ -158,4 +161,28 @@

Twilio.validateSslCertificate(networkHttpClient);
}

@Test
public void testEdge() {
Twilio.setUsername("testUser");
Twilio.setPassword("testToken");
Twilio.setRegion("br1");
Twilio.setEdge("someEdge");
TwilioRestClient client = Twilio.getRestClient();
assertEquals("someEdge", client.getEdge());
Twilio.setEdge(null);
Twilio.setRegion(null);
}

@Test
public void testEdgeIsSetFromRegionMap() {
Map<String, String> regionMap = RegionEndpoints.getRegions();
Twilio.setUsername("testUser");
Twilio.setPassword("testToken");
Twilio.setRegion("br1");
TwilioRestClient client = Twilio.getRestClient();
assertEquals(regionMap.get("br1"), client.getEdge());
Twilio.setRegion(null);
}

}
19 changes: 19 additions & 0 deletions src/test/java/com/twilio/http/TwilioRestClientTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,16 @@

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.twilio.Twilio;

Check warning on line 11 in src/test/java/com/twilio/http/TwilioRestClientTest.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Remove this unused import 'com.twilio.Twilio'.

See more on https://sonarcloud.io/project/issues?id=twilio_twilio-java&issues=AZrEvqs6qWEPcCN2gXoF&open=AZrEvqs6qWEPcCN2gXoF&pullRequest=928
import com.twilio.auth_strategy.BasicAuthStrategy;
import com.twilio.auth_strategy.NoAuthStrategy;
import com.twilio.rest.Domains;
import com.twilio.type.RegionEndpoints;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;

Check warning on line 18 in src/test/java/com/twilio/http/TwilioRestClientTest.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Remove this unused import 'java.util.HashMap'.

See more on https://sonarcloud.io/project/issues?id=twilio_twilio-java&issues=AZq6cN39DINOUa6eFoQf&open=AZq6cN39DINOUa6eFoQf&pullRequest=928
import java.util.List;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
Expand Down Expand Up @@ -161,4 +165,19 @@
// AuthStrategy of Request not changing by TwilioRestClient
assertEquals(NoAuthStrategy.getInstance(), request.getAuthStrategy());
}

@Test
public void testEdgeIsSetFromRegionMap() {
Map<String, String> regionMap = RegionEndpoints.getRegions();
for( String key: regionMap.keySet() ) {
TwilioRestClient client = new TwilioRestClient.Builder(USER_NAME, TOKEN).region(key).build();
assertEquals(regionMap.get(key), client.getEdge());
}
}

@Test
public void testEdge() {
TwilioRestClient client = new TwilioRestClient.Builder(USER_NAME, TOKEN).region("us1").edge("someEdge").build();
assertEquals("someEdge", client.getEdge());
}
}