Skip to content

Commit f92120d

Browse files
committed
Allow StorageOptions to override storage host
1 parent 25dfab6 commit f92120d

File tree

4 files changed

+74
-2
lines changed

4 files changed

+74
-2
lines changed

src/main/java/com/google/firebase/FirebaseOptions.java

+16
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.google.api.client.util.Key;
2525
import com.google.auth.oauth2.GoogleCredentials;
2626
import com.google.cloud.firestore.FirestoreOptions;
27+
import com.google.cloud.storage.StorageOptions;
2728
import com.google.common.base.Strings;
2829
import com.google.common.base.Supplier;
2930
import com.google.common.base.Suppliers;
@@ -86,6 +87,8 @@ public GoogleCredentials get() {
8687
private final ThreadManager threadManager;
8788
private final FirestoreOptions firestoreOptions;
8889

90+
private final StorageOptions storageOptions;
91+
8992
private FirebaseOptions(@NonNull final FirebaseOptions.Builder builder) {
9093
this.databaseUrl = builder.databaseUrl;
9194
this.credentialsSupplier = checkNotNull(
@@ -113,6 +116,7 @@ private FirebaseOptions(@NonNull final FirebaseOptions.Builder builder) {
113116
checkArgument(builder.readTimeout >= 0);
114117
this.readTimeout = builder.readTimeout;
115118
this.firestoreOptions = builder.firestoreOptions;
119+
this.storageOptions = builder.storageOptions;
116120
}
117121

118122
/**
@@ -216,6 +220,10 @@ FirestoreOptions getFirestoreOptions() {
216220
return firestoreOptions;
217221
}
218222

223+
public StorageOptions getStorageOptions() {
224+
return storageOptions;
225+
}
226+
219227
/**
220228
* Creates an empty builder.
221229
*
@@ -251,6 +259,8 @@ public static final class Builder {
251259
@Key("storageBucket")
252260
private String storageBucket;
253261

262+
private StorageOptions storageOptions;
263+
254264
@Key("serviceAccountId")
255265
private String serviceAccountId;
256266
private Supplier<GoogleCredentials> credentialsSupplier;
@@ -290,6 +300,7 @@ public Builder(FirebaseOptions options) {
290300
connectTimeout = options.connectTimeout;
291301
readTimeout = options.readTimeout;
292302
firestoreOptions = options.firestoreOptions;
303+
storageOptions = options.storageOptions;
293304
}
294305

295306
/**
@@ -495,6 +506,11 @@ public Builder setReadTimeout(int readTimeout) {
495506
return this;
496507
}
497508

509+
public Builder setStorageOptions(StorageOptions storageOptions) {
510+
this.storageOptions = storageOptions;
511+
return this;
512+
}
513+
498514
/**
499515
* Builds the {@link FirebaseOptions} instance from the previously set options.
500516
*

src/main/java/com/google/firebase/cloud/StorageClient.java

+18-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import static com.google.common.base.Preconditions.checkArgument;
2020
import static com.google.common.base.Preconditions.checkNotNull;
2121

22+
import com.google.cloud.firestore.Firestore;
23+
import com.google.cloud.firestore.FirestoreOptions;
2224
import com.google.cloud.storage.Bucket;
2325
import com.google.cloud.storage.Storage;
2426
import com.google.cloud.storage.StorageOptions;
@@ -27,6 +29,7 @@
2729
import com.google.firebase.FirebaseApp;
2830
import com.google.firebase.ImplFirebaseTrampolines;
2931
import com.google.firebase.internal.FirebaseService;
32+
import com.google.firebase.internal.NonNull;
3033

3134
/**
3235
* StorageClient provides access to Google Cloud Storage APIs. You can specify a default cloud
@@ -56,8 +59,12 @@ public static synchronized StorageClient getInstance(FirebaseApp app) {
5659
StorageClientService service = ImplFirebaseTrampolines.getService(app, SERVICE_ID,
5760
StorageClientService.class);
5861
if (service == null) {
59-
Storage storage = StorageOptions.newBuilder()
62+
StorageOptions userOptions = app.getOptions().getStorageOptions();
63+
StorageOptions.Builder builder = userOptions != null ? userOptions.toBuilder() :
64+
StorageOptions.newBuilder();
65+
Storage storage = builder
6066
.setCredentials(ImplFirebaseTrampolines.getCredentials(app))
67+
.setProjectId(ImplFirebaseTrampolines.getProjectId(app))
6168
.build()
6269
.getService();
6370
StorageClient client = new StorageClient(app, storage);
@@ -66,6 +73,16 @@ public static synchronized StorageClient getInstance(FirebaseApp app) {
6673
return service.getInstance();
6774
}
6875

76+
@NonNull
77+
public static Storage getStorage(FirebaseApp app) {
78+
return getInstance(app).storage;
79+
}
80+
81+
@NonNull
82+
public static Storage getStorage() {
83+
return getStorage(FirebaseApp.getInstance());
84+
}
85+
6986
/**
7087
* Returns the default cloud storage bucket associated with the current app. This is the bucket
7188
* configured via {@link com.google.firebase.FirebaseOptions} when initializing the app. If

src/test/java/com/google/firebase/cloud/StorageClientIT.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,16 @@
2121
import static org.junit.Assert.assertTrue;
2222
import static org.junit.Assert.fail;
2323

24+
import com.google.auth.oauth2.GoogleCredentials;
2425
import com.google.cloud.storage.Blob;
2526
import com.google.cloud.storage.Bucket;
27+
import com.google.cloud.storage.Storage;
28+
import com.google.cloud.storage.StorageOptions;
2629
import com.google.common.io.CharStreams;
30+
import com.google.firebase.FirebaseApp;
31+
import com.google.firebase.FirebaseOptions;
2732
import com.google.firebase.testing.IntegrationTestUtils;
33+
import com.google.firebase.testing.ServiceAccount;
2834
import java.io.IOException;
2935
import java.io.InputStream;
3036
import java.io.InputStreamReader;
@@ -87,5 +93,4 @@ private Blob createTextBlob(Bucket bucket, String contents) {
8793
String fileName = "data_" + System.currentTimeMillis() + ".txt";
8894
return bucket.create(fileName, contents.getBytes(), "text/plain");
8995
}
90-
9196
}

src/test/java/com/google/firebase/cloud/StorageClientTest.java

+34
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,19 @@
1616

1717
package com.google.firebase.cloud;
1818

19+
import static org.junit.Assert.assertEquals;
1920
import static org.junit.Assert.assertNotNull;
21+
import static org.junit.Assert.assertNotSame;
2022
import static org.junit.Assert.assertSame;
2123
import static org.junit.Assert.fail;
2224

2325
import com.google.auth.oauth2.GoogleCredentials;
2426
import com.google.cloud.storage.Bucket;
2527
import com.google.cloud.storage.Storage;
28+
import com.google.cloud.storage.StorageOptions;
2629
import com.google.firebase.FirebaseApp;
2730
import com.google.firebase.FirebaseOptions;
31+
import com.google.firebase.ImplFirebaseTrampolines;
2832
import com.google.firebase.TestOnlyImplFirebaseTrampolines;
2933
import com.google.firebase.testing.ServiceAccount;
3034
import java.io.IOException;
@@ -126,4 +130,34 @@ public void testBucket() throws IOException {
126130
assertSame(mockBucket, client.bucket());
127131
assertSame(mockBucket, client.bucket("mock-bucket-name"));
128132
}
133+
134+
@Test
135+
public void testAbsentStorageOptions() throws Exception {
136+
String projectId = "test-proj";
137+
FirebaseOptions options = FirebaseOptions.builder()
138+
.setCredentials(GoogleCredentials.fromStream(ServiceAccount.EDITOR.asStream()))
139+
.setProjectId(projectId)
140+
.build();
141+
142+
FirebaseApp.initializeApp(options);
143+
Storage storage = StorageClient.getStorage();
144+
assertEquals(projectId, storage.getOptions().getProjectId());
145+
assertEquals("https://storage.googleapis.com", storage.getOptions().getHost());
146+
}
147+
148+
@Test
149+
public void testStorageOptions() throws IOException {
150+
FirebaseApp app = FirebaseApp.initializeApp(FirebaseOptions.builder()
151+
.setCredentials(GoogleCredentials.fromStream(ServiceAccount.EDITOR.asStream()))
152+
.setProjectId("explicit-project-id")
153+
.setStorageOptions(StorageOptions.newBuilder()
154+
.setHost("explicit-host")
155+
.build())
156+
.build());
157+
Storage storage1 = StorageClient.getStorage(app);
158+
assertEquals("explicit-project-id", storage1.getOptions().getProjectId());
159+
assertEquals("explicit-host", storage1.getOptions().getHost());
160+
161+
assertSame(storage1, StorageClient.getStorage());
162+
}
129163
}

0 commit comments

Comments
 (0)