Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
19 changes: 15 additions & 4 deletions src/main/java/com/google/genai/ApiClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -534,13 +534,24 @@ protected Request buildRequest(
try {
URI originalUri = new URI(url);
URI baseUri = new URI(mergedHttpOptions.baseUrl().get());

String baseUriPath = baseUri.getRawPath() != null ? baseUri.getRawPath() : "";
String originalUriPath = originalUri.getRawPath() != null ? originalUri.getRawPath() : "";

String combinedPath;
if (baseUriPath.endsWith("/") && originalUriPath.startsWith("/")) {
combinedPath = baseUriPath + originalUriPath.substring(1);
} else {
combinedPath = baseUriPath + originalUriPath;
}

finalUrl =
new URI(
baseUri.getScheme(),
baseUri.getAuthority(),
originalUri.getPath(),
originalUri.getQuery(),
originalUri.getFragment())
baseUri.getRawAuthority(),
combinedPath,
originalUri.getRawQuery(),
originalUri.getRawFragment())
.toString();
} catch (URISyntaxException e) {
logger.warning("Failed to rewrite upload URL with base URL: " + e.getMessage());
Expand Down
61 changes: 54 additions & 7 deletions src/test/java/com/google/genai/ClientTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,15 @@
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.mockito.MockedStatic;
import org.mockito.Mockito;

import com.google.auth.oauth2.GoogleCredentials;
import com.google.common.collect.ImmutableMap;
import com.google.genai.types.HttpOptions;
import java.lang.reflect.Field;
import java.util.Optional;
import okhttp3.OkHttpClient;
import java.util.concurrent.CompletableFuture;
import org.junit.jupiter.api.Test;

import org.mockito.MockedStatic;
import org.mockito.Mockito;

public class ClientTest {
private static final String API_KEY = "api-key";
Expand Down Expand Up @@ -365,4 +361,55 @@ void defaultIsFalse_whenNoFlagsOrEnvsAreSet() {
assertFalse(client.vertexAI());
}
}

static class TestApiClient extends ApiClient {
TestApiClient(HttpOptions httpOptions) {
super(Optional.of("dummy-api-key"), Optional.of(httpOptions), Optional.empty());
}

@Override
public ApiResponse request(
String httpMethod, String path, String requestJson, Optional<HttpOptions> httpOptions) {
return null;
}

@Override
public ApiResponse request(
String httpMethod, String path, byte[] requestBytes, Optional<HttpOptions> httpOptions) {
return null;
}

@Override
public CompletableFuture<ApiResponse> asyncRequest(
String httpMethod, String path, String requestJson, Optional<HttpOptions> httpOptions) {
return null;
}

@Override
public CompletableFuture<ApiResponse> asyncRequest(
String httpMethod, String path, byte[] requestBytes, Optional<HttpOptions> httpOptions) {
return null;
}

@Override
public void close() {}
}

@Test
void testBuildRequest_preservesBaseUrlPath() throws Exception {
HttpOptions httpOptions =
HttpOptions.builder().baseUrl("http://my-proxy.company.com/api/Gemini/Proxy").build();
TestApiClient client = new TestApiClient(httpOptions);

okhttp3.Request request =
client.buildRequest(
"POST",
"https://generativelanguage.googleapis.com/upload/v1beta/files?upload_id=xxx",
new byte[0],
Optional.empty());

assertEquals(
"http://my-proxy.company.com/api/Gemini/Proxy/upload/v1beta/files?upload_id=xxx",
request.url().toString());
}
}
Loading