in sdk/src/main/java/software/amazon/awssdk/iot/AwsIotMqttConnectionBuilder.java [705:820]
public MqttClientConnection build() {
// Validate
if (bootstrap == null) {
bootstrap = ClientBootstrap.getOrCreateStaticDefault();
}
// Lazy create
// This does mean that once you call build() once, modifying the tls context options or client bootstrap
// has no affect on subsequently-created connections.
synchronized(this) {
// Check to see if a custom authorizer is being used but not through the builder.
if (isUsingCustomAuthorizer == false) {
if (config.getUsername() != null) {
if (config.getUsername().contains("x-amz-customauthorizer-name=") ||
config.getUsername().contains("x-amz-customauthorizer-signature="))
{
isUsingCustomAuthorizer = true;
}
}
}
// Is the user trying to connect using a custom authorizer?
if (isUsingCustomAuthorizer == true) {
if (config.getPort() != 443) {
Log.log(LogLevel.Warn, LogSubject.MqttClient,"Attempting to connect to authorizer with unsupported port. Port is not 443...");
}
if (config.getUseWebsockets() == false) {
if (tlsOptions.alpnList.size() == 1) {
if (tlsOptions.alpnList.get(0) != "mqtt") {
tlsOptions.alpnList.clear();
tlsOptions.alpnList.add("mqtt");
}
} else {
tlsOptions.alpnList.clear();
tlsOptions.alpnList.add("mqtt");
}
}
}
if (tlsOptions != null && (tlsContext == null || resetLazilyCreatedResources)) {
try (ClientTlsContext clientTlsContext = new ClientTlsContext(tlsOptions)) {
swapReferenceTo(tlsContext, clientTlsContext);
tlsContext = clientTlsContext;
}
}
if (client == null || resetLazilyCreatedResources) {
try (MqttClient mqttClient = (tlsContext == null) ? new MqttClient(bootstrap) : new MqttClient(bootstrap, tlsContext)) {
swapReferenceTo(client, mqttClient);
client = mqttClient;
config.setMqttClient(client);
}
}
}
resetLazilyCreatedResources = false;
// Connection create
try (MqttConnectionConfig connectionConfig = config.clone()) {
// Whether or not a username has been added, append our metrics tokens
String usernameOrEmpty = "";
if (connectionConfig.getUsername() != null) {
usernameOrEmpty = connectionConfig.getUsername();
}
String queryStringConcatenation = "?";
if (usernameOrEmpty.contains("?")) {
queryStringConcatenation = "&";
}
if(CRT.getOSIdentifier() == "android"){
connectionConfig.setUsername(String.format("%s%sSDK=AndroidV2&Version=%s",
usernameOrEmpty,
queryStringConcatenation,
new PackageInfo().version.toString()));
} else {
connectionConfig.setUsername(String.format("%s%sSDK=JavaV2&Version=%s",
usernameOrEmpty,
queryStringConcatenation,
new PackageInfo().version.toString()));
}
if (connectionConfig.getUseWebsockets() && connectionConfig.getWebsocketHandshakeTransform() == null) {
if (websocketCredentialsProvider == null) {
DefaultChainCredentialsProvider.DefaultChainCredentialsProviderBuilder providerBuilder = new DefaultChainCredentialsProvider.DefaultChainCredentialsProviderBuilder();
providerBuilder.withClientBootstrap(bootstrap);
try (CredentialsProvider defaultProvider = providerBuilder.build()) {
withWebsocketCredentialsProvider(defaultProvider);
}
}
try (AwsSigningConfig signingConfig = new AwsSigningConfig()) {
signingConfig.setAlgorithm(AwsSigningConfig.AwsSigningAlgorithm.SIGV4);
signingConfig.setSignatureType(AwsSigningConfig.AwsSignatureType.HTTP_REQUEST_VIA_QUERY_PARAMS);
signingConfig.setRegion(websocketSigningRegion);
signingConfig.setService(IOT_SIGNING_SERVICE);
signingConfig.setCredentialsProvider(websocketCredentialsProvider);
signingConfig.setOmitSessionToken(true);
try (AwsSigv4HandshakeTransformer transformer = new AwsSigv4HandshakeTransformer(signingConfig)) {
connectionConfig.setWebsocketHandshakeTransform(transformer);
/*
* transformer is actually a CrtResource since we track a SigningConfig (which tracks a Credentials Provider
* But the MqttConnectionConfig only knows of the transformer as a Consumer function, so it's not
* able to properly add a forward reference to the transformer. So we do it manually here after setting.
*/
connectionConfig.addReferenceTo(transformer);
}
}
}
return new MqttClientConnection(connectionConfig);
}
}