Skip to content

Commit fecfcc1

Browse files
committed
Fix timeout and add backoff for http requests
- helper for regular http calls - timeouts need to be added to grpc clients directly Signed-off-by: Appu Goundan <[email protected]>
1 parent ec8ea56 commit fecfcc1

File tree

5 files changed

+34
-24
lines changed

5 files changed

+34
-24
lines changed

sigstore-java/src/main/java/dev/sigstore/fulcio/client/FulcioClient.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,10 @@ public SigningCertificate signingCertificate(CertificateRequest request)
122122
.setPublicKeyRequest(publicKeyRequest)
123123
.build();
124124

125-
var certs = client.createSigningCertificate(req);
125+
var certs =
126+
client
127+
.withDeadlineAfter(httpParams.getTimeout(), TimeUnit.SECONDS)
128+
.createSigningCertificate(req);
126129

127130
if (certs.getCertificateCase() == SIGNED_CERTIFICATE_DETACHED_SCT) {
128131
if (certs.getSignedCertificateDetachedSct().getSignedCertificateTimestamp().isEmpty()

sigstore-java/src/main/java/dev/sigstore/http/HttpClients.java

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,40 @@
1515
*/
1616
package dev.sigstore.http;
1717

18+
import com.google.api.client.http.HttpBackOffUnsuccessfulResponseHandler;
19+
import com.google.api.client.http.HttpRequestFactory;
1820
import com.google.api.client.http.HttpTransport;
1921
import com.google.api.client.http.apache.v2.ApacheHttpTransport;
20-
import java.util.concurrent.TimeUnit;
22+
import com.google.api.client.util.ExponentialBackOff;
23+
import java.io.IOException;
2124
import org.apache.http.conn.ssl.NoopHostnameVerifier;
2225
import org.apache.http.impl.client.HttpClientBuilder;
2326

24-
/** HttpClients generates HttpTransport objects from configuration. */
27+
/** HttpClients generates Google Http Client objects from configuration. */
2528
public class HttpClients {
29+
30+
/**
31+
* Build a transport, you probably want to use {@link #newRequestFactory} to instantiate GET and
32+
* POST requests.
33+
*/
2634
public static HttpTransport newHttpTransport(HttpParams httpParams) {
2735
HttpClientBuilder hcb =
28-
ApacheHttpTransport.newDefaultHttpClientBuilder()
29-
.setConnectionTimeToLive(httpParams.getTimeout(), TimeUnit.SECONDS)
30-
.setUserAgent(httpParams.getUserAgent());
36+
ApacheHttpTransport.newDefaultHttpClientBuilder().setUserAgent(httpParams.getUserAgent());
3137
if (httpParams.getAllowInsecureConnections()) {
3238
hcb.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE);
3339
}
3440
return new ApacheHttpTransport(hcb.build());
3541
}
42+
43+
/** Create a new get requests with the httpParams applied and exponential backoff retries. */
44+
public static HttpRequestFactory newRequestFactory(HttpParams httpParams) throws IOException {
45+
return HttpClients.newHttpTransport(httpParams)
46+
.createRequestFactory(
47+
request -> {
48+
request.setConnectTimeout(httpParams.getTimeout() * 1000);
49+
request.setReadTimeout(httpParams.getTimeout() * 1000);
50+
request.setUnsuccessfulResponseHandler(
51+
new HttpBackOffUnsuccessfulResponseHandler(new ExponentialBackOff()));
52+
});
53+
}
3654
}

sigstore-java/src/main/java/dev/sigstore/oidc/client/GithubActionsOidcClient.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -83,13 +83,8 @@ public OidcToken getIDToken() throws OidcException {
8383
}
8484
var url = new GenericUrl(urlBase + "&audience=" + audience);
8585
try {
86-
var req =
87-
HttpClients.newHttpTransport(httpParams)
88-
.createRequestFactory(
89-
request -> {
90-
request.setParser(new GsonFactory().createJsonObjectParser());
91-
})
92-
.buildGetRequest(url);
86+
var req = HttpClients.newRequestFactory(httpParams).buildGetRequest(url);
87+
req.setParser(new GsonFactory().createJsonObjectParser());
9388
req.getHeaders().setAuthorization("Bearer " + bearer);
9489
req.getHeaders().setAccept("application/json; api-version=2.0");
9590
req.getHeaders().setContentType("application/json");

sigstore-java/src/main/java/dev/sigstore/rekor/client/RekorClient.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,7 @@ public RekorResponse putEntry(HashedRekordRequest hashedRekordRequest) throws IO
7777
URI rekorPutEndpoint = serverUrl.resolve(REKOR_ENTRIES_PATH);
7878

7979
HttpRequest req =
80-
HttpClients.newHttpTransport(httpParams)
81-
.createRequestFactory()
80+
HttpClients.newRequestFactory(httpParams)
8281
.buildPostRequest(
8382
new GenericUrl(rekorPutEndpoint),
8483
ByteArrayContent.fromString(
@@ -105,9 +104,7 @@ public Optional<RekorEntry> getEntry(HashedRekordRequest hashedRekordRequest) th
105104
public Optional<RekorEntry> getEntry(String UUID) throws IOException {
106105
URI getEntryURI = serverUrl.resolve(REKOR_ENTRIES_PATH + "/" + UUID);
107106
HttpRequest req =
108-
HttpClients.newHttpTransport(httpParams)
109-
.createRequestFactory()
110-
.buildGetRequest(new GenericUrl(getEntryURI));
107+
HttpClients.newRequestFactory(httpParams).buildGetRequest(new GenericUrl(getEntryURI));
111108
req.getHeaders().set("Accept", "application/json");
112109
HttpResponse response;
113110
try {
@@ -146,8 +143,7 @@ public List<String> searchEntry(
146143

147144
String contentString = GSON.get().toJson(data);
148145
HttpRequest req =
149-
HttpClients.newHttpTransport(httpParams)
150-
.createRequestFactory()
146+
HttpClients.newRequestFactory(httpParams)
151147
.buildPostRequest(
152148
new GenericUrl(rekorSearchEndpoint),
153149
ByteArrayContent.fromString("application/json", contentString));

sigstore-java/src/main/java/dev/sigstore/tuf/HttpMetaFetcher.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,9 @@ <T extends SignedTufMeta> Optional<MetaFetchResult<T>> getMeta(String filename,
6565
throws IOException, MetaFileExceedsMaxException {
6666
GenericUrl nextVersionUrl = new GenericUrl(mirror + "/" + filename);
6767
var req =
68-
HttpClients.newHttpTransport(ImmutableHttpParams.builder().build())
69-
.createRequestFactory(
70-
request ->
71-
request.setParser(GsonFactory.getDefaultInstance().createJsonObjectParser()))
68+
HttpClients.newRequestFactory(ImmutableHttpParams.builder().build())
7269
.buildGetRequest(nextVersionUrl);
70+
req.setParser(GsonFactory.getDefaultInstance().createJsonObjectParser());
7371
req.getHeaders().setAccept("application/json; api-version=2.0");
7472
req.getHeaders().setContentType("application/json");
7573
req.setThrowExceptionOnExecuteError(false);

0 commit comments

Comments
 (0)