use of org.opencastproject.kernel.http.api.HttpClient in project opencast by opencast.
the class TrustedHttpClientImpl method retryAuthAndRequestAfterNonceTimeout.
/**
* Retries a request if the nonce timed out during the request.
*
* @param httpUriRequest
* The request to be made that isn't a GET, those are handled automatically.
* @param response
* The response with the bad nonce timeout in it.
* @return A new response for the request if it was successful without the nonce timing out again or just the same
* response it got if it ran out of attempts.
* @throws TrustedHttpClientException
* @throws IOException
* @throws ClientProtocolException
*/
private HttpResponse retryAuthAndRequestAfterNonceTimeout(HttpUriRequest httpUriRequest, HttpResponse response) throws TrustedHttpClientException, IOException, ClientProtocolException {
// Get rid of old security headers with the old nonce.
httpUriRequest.removeHeaders(AUTHORIZATION_HEADER_NAME);
for (int i = 0; i < nonceTimeoutRetries; i++) {
HttpClient httpClient = makeHttpClient(DEFAULT_CONNECTION_TIMEOUT, DEFAULT_SOCKET_TIMEOUT);
int variableDelay = 0;
// Make sure that we have a variable delay greater than 0.
if (retryMaximumVariableTime > 0) {
variableDelay = generator.nextInt(retryMaximumVariableTime * MILLISECONDS_IN_SECONDS);
}
long totalDelay = (retryBaseDelay * MILLISECONDS_IN_SECONDS + variableDelay);
if (totalDelay > 0) {
logger.info("Sleeping " + totalDelay + "ms before trying request " + httpUriRequest.getURI() + " again due to a " + response.getStatusLine());
try {
Thread.sleep(totalDelay);
} catch (InterruptedException e) {
logger.error("Suffered InteruptedException while trying to sleep until next retry.", e);
}
}
manuallyHandleDigestAuthentication(httpUriRequest, httpClient);
response = new HttpResponseWrapper(httpClient.execute(httpUriRequest));
if (!hadNonceTimeoutResponse(response)) {
responseMap.put(response, httpClient);
break;
}
httpClient.getConnectionManager().shutdown();
}
return response;
}
use of org.opencastproject.kernel.http.api.HttpClient in project opencast by opencast.
the class TrustedHttpClientImplTest method successIfNonceReturnOnceAndThreeRetries.
@Test
public void successIfNonceReturnOnceAndThreeRetries() throws ClientProtocolException, IOException {
// Setup bundle context for TrustedHttpClientImpl
bundleContextMock = createNiceMock(BundleContext.class);
expect(bundleContextMock.getProperty(TrustedHttpClientImpl.DIGEST_AUTH_USER_KEY)).andReturn("matterhorn_system_account");
expect(bundleContextMock.getProperty(TrustedHttpClientImpl.DIGEST_AUTH_PASS_KEY)).andReturn("CHANGE_ME");
expect(bundleContextMock.getProperty(TrustedHttpClientImpl.NONCE_TIMEOUT_RETRY_KEY)).andReturn("3");
expect(bundleContextMock.getProperty(TrustedHttpClientImpl.NONCE_TIMEOUT_RETRY_BASE_TIME_KEY)).andReturn("0");
expect(bundleContextMock.getProperty(TrustedHttpClientImpl.NONCE_TIMEOUT_RETRY_MAXIMUM_VARIABLE_TIME_KEY)).andReturn("0");
replay(bundleContextMock);
componentContextMock = createNiceMock(ComponentContext.class);
expect(componentContextMock.getBundleContext()).andReturn(bundleContextMock).anyTimes();
replay(componentContextMock);
client = new TrustedHttpClientImpl("matterhorn_system_account", "CHANGE_ME");
client.setServiceRegistry(serviceRegistry);
client.setSecurityService(securityService);
client.activate(componentContextMock);
HttpPost httpPost = new HttpPost("http://localhost:8080/fake");
HttpParams httpParams = createNiceMock(HttpParams.class);
expect(httpParams.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 60000)).andReturn(httpParams);
expect(httpParams.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 60000)).andReturn(httpParams);
replay(httpParams);
ClientConnectionManager clientConnectionManager = createMock(ClientConnectionManager.class);
IMocksControl ctrl = EasyMock.createNiceControl();
ctrl.checkOrder(false);
HttpClient httpClient = createMock("Request", HttpClient.class);
expect(httpClient.getParams()).andReturn(httpParams).anyTimes();
// First Digest handshake and close
expect(httpClient.execute(isA(HttpUriRequest.class))).andReturn(digestResponse);
expect(httpClient.getConnectionManager()).andReturn(clientConnectionManager);
// First request and close.
expect(httpClient.execute(isA(HttpUriRequest.class))).andReturn(nonceResponse);
expect(httpClient.getConnectionManager()).andReturn(clientConnectionManager);
// Second Digest handshake and close
expect(httpClient.execute(isA(HttpUriRequest.class))).andReturn(digestResponse);
expect(httpClient.getConnectionManager()).andReturn(clientConnectionManager);
// First request retry.
expect(httpClient.execute(isA(HttpUriRequest.class))).andReturn(okResponse);
replay(httpClient);
// Setup DefaultHttpClientFactory
HttpClientFactory httpClientFactory = createMock(HttpClientFactory.class);
expect(httpClientFactory.makeHttpClient()).andReturn(httpClient).atLeastOnce();
replay(httpClientFactory);
client.setHttpClientFactory(httpClientFactory);
HttpResponse response = client.execute(httpPost);
Assert.assertEquals(200, response.getStatusLine().getStatusCode());
}
use of org.opencastproject.kernel.http.api.HttpClient in project opencast by opencast.
the class TrustedHttpClientImplTest method testAlreadySignedUrlIgnoredByUrlSigningService.
@Test
public void testAlreadySignedUrlIgnoredByUrlSigningService() throws IOException, UrlSigningException {
String acceptsUrl = "http://alreadysigned.com?signature=thesig&policy=thepolicy&keyId=thekey";
HttpHead headRequest = new HttpHead(acceptsUrl);
// Setup signing service
UrlSigningService urlSigningService = EasyMock.createMock(UrlSigningService.class);
EasyMock.expect(urlSigningService.accepts(acceptsUrl)).andReturn(true);
EasyMock.replay(urlSigningService);
CredentialsProvider cp = EasyMock.createNiceMock(CredentialsProvider.class);
Capture<HttpUriRequest> request = EasyMock.newCapture();
// Setup Http Client
HttpClient httpClient = createMock("Request", HttpClient.class);
HttpParams httpParams = createNiceMock(HttpParams.class);
expect(httpParams.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 60000)).andReturn(httpParams);
expect(httpParams.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 60000)).andReturn(httpParams);
replay(httpParams);
expect(httpClient.getParams()).andReturn(httpParams).anyTimes();
expect(httpClient.getCredentialsProvider()).andReturn(cp);
expect(httpClient.execute(EasyMock.capture(request))).andReturn(new BasicHttpResponse(new BasicStatusLine(HttpVersion.HTTP_1_1, 200, "ok")));
EasyMock.replay(httpClient);
// Setup DefaultHttpClientFactory
HttpClientFactory httpClientFactory = createMock(HttpClientFactory.class);
expect(httpClientFactory.makeHttpClient()).andReturn(httpClient).atLeastOnce();
replay(httpClientFactory);
client = new TrustedHttpClientImpl("user", "pass");
client.setHttpClientFactory(httpClientFactory);
client.setSecurityService(securityService);
client.setUrlSigningService(urlSigningService);
client.execute(headRequest);
assertTrue(request.hasCaptured());
assertEquals(acceptsUrl, request.getValue().getURI().toString());
}
use of org.opencastproject.kernel.http.api.HttpClient in project opencast by opencast.
the class TrustedHttpClientImplTest method testAcceptsUrlSigningService.
@Test
public void testAcceptsUrlSigningService() throws IOException, UrlSigningException {
String acceptsUrl = "http://accepts.com";
String signedUrl = "http://accepts.com?policy=testPolicy&signature=testSignature&keyId=testKeyId";
HttpGet get = new HttpGet(acceptsUrl);
// Setup signing service
UrlSigningService urlSigningService = EasyMock.createMock(UrlSigningService.class);
EasyMock.expect(urlSigningService.accepts(acceptsUrl)).andReturn(true);
EasyMock.expect(urlSigningService.sign(EasyMock.anyString(), EasyMock.anyLong(), EasyMock.anyLong(), EasyMock.anyString())).andReturn(signedUrl);
EasyMock.replay(urlSigningService);
CredentialsProvider cp = EasyMock.createNiceMock(CredentialsProvider.class);
Capture<HttpUriRequest> request = EasyMock.newCapture();
// Setup Http Client
HttpClient httpClient = createMock("Request", HttpClient.class);
HttpParams httpParams = createNiceMock(HttpParams.class);
expect(httpParams.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 60000)).andReturn(httpParams);
expect(httpParams.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 60000)).andReturn(httpParams);
replay(httpParams);
expect(httpClient.getParams()).andReturn(httpParams).anyTimes();
expect(httpClient.getCredentialsProvider()).andReturn(cp);
expect(httpClient.execute(EasyMock.capture(request))).andReturn(new BasicHttpResponse(new BasicStatusLine(HttpVersion.HTTP_1_1, 200, "ok")));
EasyMock.replay(httpClient);
// Setup DefaultHttpClientFactory
HttpClientFactory httpClientFactory = createMock(HttpClientFactory.class);
expect(httpClientFactory.makeHttpClient()).andReturn(httpClient).atLeastOnce();
replay(httpClientFactory);
client = new TrustedHttpClientImpl("user", "pass");
client.setHttpClientFactory(httpClientFactory);
client.setSecurityService(securityService);
client.setUrlSigningService(urlSigningService);
client.execute(get);
assertTrue(request.hasCaptured());
assertEquals(signedUrl, request.getValue().getURI().toString());
}
use of org.opencastproject.kernel.http.api.HttpClient in project opencast by opencast.
the class TrustedHttpClientImplTest method successIfNonceReturnThreeAndThreeRetries.
@Test
public void successIfNonceReturnThreeAndThreeRetries() throws ClientProtocolException, IOException {
// Setup bundle context for TrustedHttpClientImpl
bundleContextMock = createNiceMock(BundleContext.class);
expect(bundleContextMock.getProperty(TrustedHttpClientImpl.DIGEST_AUTH_USER_KEY)).andReturn("matterhorn_system_account");
expect(bundleContextMock.getProperty(TrustedHttpClientImpl.DIGEST_AUTH_PASS_KEY)).andReturn("CHANGE_ME");
expect(bundleContextMock.getProperty(TrustedHttpClientImpl.NONCE_TIMEOUT_RETRY_KEY)).andReturn("3");
expect(bundleContextMock.getProperty(TrustedHttpClientImpl.NONCE_TIMEOUT_RETRY_BASE_TIME_KEY)).andReturn("0");
expect(bundleContextMock.getProperty(TrustedHttpClientImpl.NONCE_TIMEOUT_RETRY_MAXIMUM_VARIABLE_TIME_KEY)).andReturn("0");
replay(bundleContextMock);
componentContextMock = createNiceMock(ComponentContext.class);
expect(componentContextMock.getBundleContext()).andReturn(bundleContextMock).anyTimes();
replay(componentContextMock);
client = new TrustedHttpClientImpl("matterhorn_system_account", "CHANGE_ME");
client.setServiceRegistry(serviceRegistry);
client.setSecurityService(securityService);
client.activate(componentContextMock);
HttpPost httpPost = new HttpPost("http://localhost:8080/fake");
HttpParams httpParams = createNiceMock(HttpParams.class);
expect(httpParams.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 60000)).andReturn(httpParams);
expect(httpParams.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 60000)).andReturn(httpParams);
replay(httpParams);
ClientConnectionManager clientConnectionManager = createMock(ClientConnectionManager.class);
HttpClient httpClient = createMock("Request", HttpClient.class);
expect(httpClient.getParams()).andReturn(httpParams).anyTimes();
// First Digest handshake and close
expect(httpClient.execute(isA(HttpUriRequest.class))).andReturn(digestResponse);
expect(httpClient.getConnectionManager()).andReturn(clientConnectionManager);
// First request with a nonce timeout and close.
expect(httpClient.execute(isA(HttpUriRequest.class))).andReturn(nonceResponse);
expect(httpClient.getConnectionManager()).andReturn(clientConnectionManager);
// First retry getting nonce and close.
expect(httpClient.execute(isA(HttpUriRequest.class))).andReturn(digestResponse);
expect(httpClient.getConnectionManager()).andReturn(clientConnectionManager);
// First retry request and close.
expect(httpClient.execute(isA(HttpUriRequest.class))).andReturn(nonceResponse);
expect(httpClient.getConnectionManager()).andReturn(clientConnectionManager);
// Second retry getting nonce and close.
expect(httpClient.execute(isA(HttpUriRequest.class))).andReturn(digestResponse);
expect(httpClient.getConnectionManager()).andReturn(clientConnectionManager);
// Second retry request and close
expect(httpClient.execute(isA(HttpUriRequest.class))).andReturn(nonceResponse);
expect(httpClient.getConnectionManager()).andReturn(clientConnectionManager);
// Third retry getting nonce and close.
expect(httpClient.execute(isA(HttpUriRequest.class))).andReturn(digestResponse);
expect(httpClient.getConnectionManager()).andReturn(clientConnectionManager);
// Third retry with successful request.
expect(httpClient.execute(isA(HttpUriRequest.class))).andReturn(okResponse);
replay(httpClient);
// Setup DefaultHttpClientFactory
HttpClientFactory httpClientFactory = createMock(HttpClientFactory.class);
expect(httpClientFactory.makeHttpClient()).andReturn(httpClient).atLeastOnce();
replay(httpClientFactory);
client.setHttpClientFactory(httpClientFactory);
HttpResponse response = client.execute(httpPost);
Assert.assertEquals(200, response.getStatusLine().getStatusCode());
}
Aggregations