@@ -84,6 +84,7 @@ public class ApiClient {
8484 protected InputStream sslCaCert ;
8585 protected boolean verifyingSsl ;
8686 protected KeyManager [] keyManagers ;
87+ protected String tlsServerName ;
8788
8889 protected OkHttpClient httpClient ;
8990 protected JSON json ;
@@ -189,8 +190,8 @@ public String getBasePath() {
189190 /**
190191 * Set base path
191192 *
192- * @param basePath Base path of the URL (e.g https://load-balancer.api.stackit.cloud
193- * @return An instance of OkHttpClient
193+ * @param basePath Base path of the URL (e.g https://load-balancer.api.stackit.cloud)
194+ * @return An instance of ApiClient
194195 */
195196 public ApiClient setBasePath (String basePath ) {
196197 this .basePath = basePath ;
@@ -321,6 +322,28 @@ public ApiClient setKeyManagers(KeyManager[] managers) {
321322 return this ;
322323 }
323324
325+ /**
326+ * Get TLS server name for SNI (Server Name Indication).
327+ *
328+ * @return The TLS server name
329+ */
330+ public String getTlsServerName () {
331+ return tlsServerName ;
332+ }
333+
334+ /**
335+ * Set TLS server name for SNI (Server Name Indication). This is used to verify the server
336+ * certificate against a specific hostname instead of the hostname in the URL.
337+ *
338+ * @param tlsServerName The TLS server name to use for certificate verification
339+ * @return ApiClient
340+ */
341+ public ApiClient setTlsServerName (String tlsServerName ) {
342+ this .tlsServerName = tlsServerName ;
343+ applySslSettings ();
344+ return this ;
345+ }
346+
324347 /**
325348 * Getter for the field <code>dateFormat</code>.
326349 *
@@ -605,7 +628,7 @@ public List<Pair> parameterToPair(String name, Object value) {
605628 * @param value The value of the parameter.
606629 * @return A list of {@code Pair} objects.
607630 */
608- public List <Pair > parameterToPairs (String collectionFormat , String name , Collection value ) {
631+ public List <Pair > parameterToPairs (String collectionFormat , String name , Collection <?> value ) {
609632 List <Pair > params = new ArrayList <Pair >();
610633
611634 // preconditions
@@ -827,7 +850,17 @@ public <T> T deserialize(Response response, Type returnType) throws ApiException
827850 }
828851 try {
829852 if (isJsonMime (contentType )) {
830- return JSON .deserialize (respBody .byteStream (), returnType );
853+ if (returnType .equals (String .class )) {
854+ String respBodyString = respBody .string ();
855+ if (respBodyString .isEmpty ()) {
856+ return null ;
857+ }
858+ // Use String-based deserialize for String return type with fallback
859+ return JSON .deserialize (respBodyString , returnType );
860+ } else {
861+ // Use InputStream-based deserialize which supports responses > 2GB
862+ return JSON .deserialize (respBody .byteStream (), returnType );
863+ }
831864 } else if (returnType .equals (String .class )) {
832865 String respBodyString = respBody .string ();
833866 if (respBodyString .isEmpty ()) {
@@ -1227,8 +1260,10 @@ public String buildUrl(
12271260 if (serverIndex < 0 || serverIndex >= servers .size ()) {
12281261 throw new ArrayIndexOutOfBoundsException (
12291262 String .format (
1263+ java .util .Locale .ROOT ,
12301264 "Invalid index %d when selecting the host settings. Must be less than %d" ,
1231- serverIndex , servers .size ()));
1265+ serverIndex ,
1266+ servers .size ()));
12321267 }
12331268 baseURL = servers .get (serverIndex ).URL (serverVariables );
12341269 } else {
@@ -1302,12 +1337,16 @@ public void processHeaderParams(Map<String, String> headerParams, Request.Builde
13021337 public void processCookieParams (Map <String , String > cookieParams , Request .Builder reqBuilder ) {
13031338 for (Entry <String , String > param : cookieParams .entrySet ()) {
13041339 reqBuilder .addHeader (
1305- "Cookie" , String .format ("%s=%s" , param .getKey (), param .getValue ()));
1340+ "Cookie" ,
1341+ String .format (
1342+ java .util .Locale .ROOT , "%s=%s" , param .getKey (), param .getValue ()));
13061343 }
13071344 for (Entry <String , String > param : defaultCookieMap .entrySet ()) {
13081345 if (!cookieParams .containsKey (param .getKey ())) {
13091346 reqBuilder .addHeader (
1310- "Cookie" , String .format ("%s=%s" , param .getKey (), param .getValue ()));
1347+ "Cookie" ,
1348+ String .format (
1349+ java .util .Locale .ROOT , "%s=%s" , param .getKey (), param .getValue ()));
13111350 }
13121351 }
13131352 }
@@ -1495,7 +1534,20 @@ public boolean verify(String hostname, SSLSession session) {
14951534 trustManagerFactory .init (caKeyStore );
14961535 }
14971536 trustManagers = trustManagerFactory .getTrustManagers ();
1498- hostnameVerifier = OkHostnameVerifier .INSTANCE ;
1537+ if (tlsServerName != null && !tlsServerName .isEmpty ()) {
1538+ hostnameVerifier =
1539+ new HostnameVerifier () {
1540+ @ Override
1541+ public boolean verify (String hostname , SSLSession session ) {
1542+ // Verify the certificate against tlsServerName instead of the
1543+ // actual hostname
1544+ return OkHostnameVerifier .INSTANCE .verify (
1545+ tlsServerName , session );
1546+ }
1547+ };
1548+ } else {
1549+ hostnameVerifier = OkHostnameVerifier .INSTANCE ;
1550+ }
14991551 }
15001552
15011553 SSLContext sslContext = SSLContext .getInstance ("TLS" );
0 commit comments