3030package com .google .api .gax .httpjson ;
3131
3232import com .google .api .client .http .HttpTransport ;
33+ import com .google .api .client .http .javanet .NetHttpTransport ;
3334import com .google .api .core .BetaApi ;
3435import com .google .api .core .InternalExtensionOnly ;
3536import com .google .api .gax .core .ExecutorProvider ;
3637import com .google .api .gax .rpc .FixedHeaderProvider ;
3738import com .google .api .gax .rpc .HeaderProvider ;
3839import com .google .api .gax .rpc .TransportChannel ;
3940import com .google .api .gax .rpc .TransportChannelProvider ;
41+ import com .google .api .gax .rpc .mtls .MtlsProvider ;
4042import com .google .auth .Credentials ;
43+ import com .google .common .annotations .VisibleForTesting ;
4144import com .google .common .collect .Lists ;
4245import java .io .IOException ;
46+ import java .security .GeneralSecurityException ;
47+ import java .security .KeyStore ;
4348import java .util .List ;
4449import java .util .Map ;
4550import java .util .concurrent .Executor ;
@@ -64,24 +69,28 @@ public final class InstantiatingHttpJsonChannelProvider implements TransportChan
6469 private final HeaderProvider headerProvider ;
6570 private final String endpoint ;
6671 private final HttpTransport httpTransport ;
72+ private final MtlsProvider mtlsProvider ;
6773
6874 private InstantiatingHttpJsonChannelProvider (
6975 Executor executor , HeaderProvider headerProvider , String endpoint ) {
7076 this .executor = executor ;
7177 this .headerProvider = headerProvider ;
7278 this .endpoint = endpoint ;
7379 this .httpTransport = null ;
80+ this .mtlsProvider = new MtlsProvider ();
7481 }
7582
7683 private InstantiatingHttpJsonChannelProvider (
7784 Executor executor ,
7885 HeaderProvider headerProvider ,
7986 String endpoint ,
80- HttpTransport httpTransport ) {
87+ HttpTransport httpTransport ,
88+ MtlsProvider mtlsProvider ) {
8189 this .executor = executor ;
8290 this .headerProvider = headerProvider ;
8391 this .endpoint = endpoint ;
8492 this .httpTransport = httpTransport ;
93+ this .mtlsProvider = mtlsProvider ;
8594 }
8695
8796 @ Override
@@ -160,6 +169,20 @@ public TransportChannelProvider withCredentials(Credentials credentials) {
160169 "InstantiatingHttpJsonChannelProvider doesn't need credentials" );
161170 }
162171
172+ HttpTransport createHttpTransport () throws IOException {
173+ if (mtlsProvider .useMtlsClientCertificate ()) {
174+ try {
175+ KeyStore mtlsKeyStore = mtlsProvider .getKeyStore ();
176+ if (mtlsKeyStore != null ) {
177+ return new NetHttpTransport .Builder ().trustCertificates (null , mtlsKeyStore , "" ).build ();
178+ }
179+ } catch (GeneralSecurityException e ) {
180+ throw new IOException (e .toString ());
181+ }
182+ }
183+ return null ;
184+ }
185+
163186 private TransportChannel createChannel () throws IOException {
164187 Map <String , String > headers = headerProvider .getHeaders ();
165188
@@ -168,12 +191,17 @@ private TransportChannel createChannel() throws IOException {
168191 headerEnhancers .add (HttpJsonHeaderEnhancers .create (header .getKey (), header .getValue ()));
169192 }
170193
194+ HttpTransport httpTransportToUse = httpTransport ;
195+ if (httpTransportToUse == null ) {
196+ httpTransportToUse = createHttpTransport ();
197+ }
198+
171199 ManagedHttpJsonChannel channel =
172200 ManagedHttpJsonChannel .newBuilder ()
173201 .setEndpoint (endpoint )
174202 .setHeaderEnhancers (headerEnhancers )
175203 .setExecutor (executor )
176- .setHttpTransport (httpTransport )
204+ .setHttpTransport (httpTransportToUse )
177205 .build ();
178206
179207 return HttpJsonTransportChannel .newBuilder ().setManagedChannel (channel ).build ();
@@ -202,6 +230,7 @@ public static final class Builder {
202230 private HeaderProvider headerProvider ;
203231 private String endpoint ;
204232 private HttpTransport httpTransport ;
233+ private MtlsProvider mtlsProvider = new MtlsProvider ();
205234
206235 private Builder () {}
207236
@@ -210,6 +239,7 @@ private Builder(InstantiatingHttpJsonChannelProvider provider) {
210239 this .headerProvider = provider .headerProvider ;
211240 this .endpoint = provider .endpoint ;
212241 this .httpTransport = provider .httpTransport ;
242+ this .mtlsProvider = provider .mtlsProvider ;
213243 }
214244
215245 /**
@@ -259,9 +289,15 @@ public String getEndpoint() {
259289 return endpoint ;
260290 }
261291
292+ @ VisibleForTesting
293+ Builder setMtlsProvider (MtlsProvider mtlsProvider ) {
294+ this .mtlsProvider = mtlsProvider ;
295+ return this ;
296+ }
297+
262298 public InstantiatingHttpJsonChannelProvider build () {
263299 return new InstantiatingHttpJsonChannelProvider (
264- executor , headerProvider , endpoint , httpTransport );
300+ executor , headerProvider , endpoint , httpTransport , mtlsProvider );
265301 }
266302 }
267303}
0 commit comments