Skip to content

Commit 49156db

Browse files
authored
retry http requests like calls to ARU (#124)
1 parent 2dee1cc commit 49156db

File tree

1 file changed

+49
-3
lines changed
  • imagetool/src/main/java/com/oracle/weblogic/imagetool/util

1 file changed

+49
-3
lines changed

imagetool/src/main/java/com/oracle/weblogic/imagetool/util/HttpUtil.java

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,37 @@
1-
// Copyright (c) 2019, Oracle Corporation and/or its affiliates. All rights reserved.
1+
// Copyright (c) 2019, 2020, Oracle Corporation and/or its affiliates. All rights reserved.
22
// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
33

44
package com.oracle.weblogic.imagetool.util;
55

66
import java.io.File;
77
import java.io.IOException;
8+
import java.io.InterruptedIOException;
89
import java.io.StringReader;
10+
import java.net.UnknownHostException;
911
import java.util.ArrayList;
1012
import java.util.List;
13+
import javax.net.ssl.SSLException;
1114
import javax.xml.XMLConstants;
1215
import javax.xml.parsers.DocumentBuilder;
1316
import javax.xml.parsers.DocumentBuilderFactory;
1417

1518
import com.oracle.weblogic.imagetool.logging.LoggingFacade;
1619
import com.oracle.weblogic.imagetool.logging.LoggingFactory;
1720
import org.apache.http.HttpEntity;
21+
import org.apache.http.HttpEntityEnclosingRequest;
22+
import org.apache.http.HttpRequest;
1823
import org.apache.http.auth.AuthScope;
1924
import org.apache.http.auth.UsernamePasswordCredentials;
2025
import org.apache.http.client.ClientProtocolException;
2126
import org.apache.http.client.CookieStore;
2227
import org.apache.http.client.CredentialsProvider;
2328
import org.apache.http.client.HttpClient;
29+
import org.apache.http.client.HttpRequestRetryHandler;
2430
import org.apache.http.client.config.CookieSpecs;
2531
import org.apache.http.client.config.RequestConfig;
2632
import org.apache.http.client.fluent.Executor;
2733
import org.apache.http.client.fluent.Request;
34+
import org.apache.http.client.protocol.HttpClientContext;
2835
import org.apache.http.entity.mime.HttpMultipartMode;
2936
import org.apache.http.entity.mime.MultipartEntityBuilder;
3037
import org.apache.http.impl.client.BasicCookieStore;
@@ -107,15 +114,54 @@ private static HttpClient getOraClient(String userId, String password) {
107114
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(
108115
userId, password));
109116
}
110-
HttpClient result = HttpClientBuilder.create().setDefaultRequestConfig(config.build())
117+
HttpClient result = HttpClientBuilder.create()
118+
.setDefaultRequestConfig(config.build())
119+
.setRetryHandler(retryHandler())
111120
.setDefaultCookieStore(cookieStore).useSystemProperties()
112121
.setDefaultCredentialsProvider(credentialsProvider).build();
113122
logger.exiting();
114123
return result;
115124
}
116125

126+
private static HttpRequestRetryHandler retryHandler() {
127+
return (exception, executionCount, context) -> {
128+
129+
if (executionCount > 3) {
130+
// Do not retry if over max retries
131+
return false;
132+
}
133+
if (exception instanceof InterruptedIOException) {
134+
// Timeout
135+
return false;
136+
}
137+
if (exception instanceof UnknownHostException) {
138+
// Unknown host
139+
return false;
140+
}
141+
if (exception instanceof SSLException) {
142+
// SSL handshake failed
143+
return false;
144+
}
145+
HttpClientContext clientContext = HttpClientContext.adapt(context);
146+
HttpRequest request = clientContext.getRequest();
147+
// return true if it is okay to retry this request type
148+
boolean retriable = !(request instanceof HttpEntityEnclosingRequest);
149+
if (retriable) {
150+
try {
151+
logger.warning("Connect failed, retrying in 10 seconds, attempts={0} ", executionCount);
152+
Thread.sleep(10000);
153+
} catch (InterruptedException e) {
154+
//continue
155+
}
156+
return true;
157+
} else {
158+
return false;
159+
}
160+
};
161+
}
162+
117163
/**
118-
* Downlod a file from the url.
164+
* Download a file from the url.
119165
*
120166
* @param url url of the aru server
121167
* @param fileName full path to save the file

0 commit comments

Comments
 (0)