1
16 package com.amazonaws.internal.auth;
17
18 import com.amazonaws.AmazonWebServiceClient;
19 import com.amazonaws.AmazonWebServiceRequest;
20 import com.amazonaws.Request;
21 import com.amazonaws.auth.Signer;
22 import com.amazonaws.auth.SignerFactory;
23 import com.amazonaws.auth.SignerParams;
24 import com.amazonaws.auth.SignerTypeAware;
25 import com.amazonaws.regions.EndpointToRegion;
26 import java.net.URI;
27
28 public class DefaultSignerProvider extends SignerProvider {
29
30 private final AmazonWebServiceClient awsClient;
31 private final Signer defaultSigner;
32
33 public DefaultSignerProvider(final AmazonWebServiceClient awsClient,
34 final Signer defaultSigner) {
35 this.awsClient = awsClient;
36 this.defaultSigner = defaultSigner;
37 }
38
39 @Override
40 public Signer getSigner(SignerProviderContext context) {
41 Request<?> request = context.getRequest();
42 if (request == null || shouldUseDefaultSigner(request.getOriginalRequest())) {
43 if (context.isRedirect()) {
44 return awsClient.getSignerByURI(context.getUri());
45 }
46 return defaultSigner;
47 }
48
49 SignerTypeAware signerTypeAware = (SignerTypeAware) request.getOriginalRequest();
50 SignerParams params = new SignerParams(awsClient.getServiceName(), getSigningRegionForRequestURI(request.getEndpoint()));
51 return SignerFactory.createSigner(signerTypeAware.getSignerType(), params);
52 }
53
54 private boolean shouldUseDefaultSigner(AmazonWebServiceRequest originalRequest) {
55 return !(originalRequest instanceof SignerTypeAware) || isSignerOverridden();
56 }
57
58 private boolean isSignerOverridden() {
59 return awsClient.getSignerOverride() != null;
60 }
61
62 private String getSigningRegionForRequestURI(URI uri) {
63 String regionName = awsClient.getSignerRegionOverride();
64 if (regionName == null) {
65 regionName = EndpointToRegion.guessRegionNameForEndpoint(uri.getHost(), awsClient.getEndpointPrefix());
66 }
67 return regionName;
68 }
69 }
70