in iothub/device/iot-device-client/src/main/java/com/microsoft/azure/sdk/iot/device/transport/https/HttpsIotHubConnection.java [302:383]
public boolean sendMessageResult(IotHubTransportMessage message, IotHubMessageResult result) throws TransportException
{
synchronized (HTTPS_CONNECTION_LOCK)
{
log.trace("Checking if http layer can correlate the received iot hub message to a received etag {}", message);
String messageEtag = this.messageToETagMap.get(message);
if (messageEtag == null)
{
throw new IllegalStateException("Cannot send a message "
+ "result before a message is received or if the result was already sent");
}
log.trace("Http layer correlated the received iot hub message ({}) to etag {}", message, messageEtag);
log.trace("Sending ACK with result {} for etag {}", result, messageEtag);
String iotHubHostname = getHostName();
String deviceId = this.config.getDeviceId();
String resultUri = HTTPS_HEAD_TAG;
String resultPath;
URL resultUrl;
HttpsRequest request;
switch (result)
{
case COMPLETE:
IotHubCompleteUri completeUri =
new IotHubCompleteUri(iotHubHostname, deviceId, messageEtag, this.config.getModuleId());
resultUri += completeUri.toString();
resultPath = completeUri.getPath();
resultUrl = this.buildUrlFromString(resultUri);
request = new HttpsRequest(resultUrl, HttpsMethod.DELETE, new byte[0], this.config.getProductInfo().getUserAgentString(), config.getProxySettings());
break;
case ABANDON:
IotHubAbandonUri abandonUri =
new IotHubAbandonUri(iotHubHostname, deviceId, messageEtag, this.config.getModuleId());
resultUri += abandonUri.toString();
resultPath = abandonUri.getPath();
resultUrl = this.buildUrlFromString(resultUri);
// The IoT Hub service requires the content-length header to be
// set but the Java SE connection omits content-length
// if content-length == 0. We include a placeholder body to
// make the connection include a content-length.
request = new HttpsRequest(resultUrl, HttpsMethod.POST, new byte[1], this.config.getProductInfo().getUserAgentString(), config.getProxySettings());
break;
case REJECT:
IotHubRejectUri rejectUri =
new IotHubRejectUri(iotHubHostname, deviceId, messageEtag, this.config.getModuleId());
resultUri += rejectUri.toString();
resultPath = rejectUri.getPath();
resultUrl = this.buildUrlFromString(resultUri);
request = new HttpsRequest(resultUrl, HttpsMethod.DELETE, new byte[0], this.config.getProductInfo().getUserAgentString(), config.getProxySettings());
break;
default:
// should never happen.
throw new IllegalStateException(
"Invalid message result specified.");
}
request.setHeaderField(HTTPS_PROPERTY_IOTHUB_TO_TAG, resultPath).
setHeaderField(HTTPS_PROPERTY_IF_MATCH_TAG, messageEtag);
HttpsResponse response = this.sendRequest(request);
IotHubStatusCode resultStatus = IotHubStatusCode.getIotHubStatusCode(response.getStatus());
if (resultStatus != IotHubStatusCode.OK)
{
String errMsg = String.format(
"Sending message result failed with status %s.%n",
resultStatus.name());
throw new IotHubServiceException(errMsg);
}
else
{
log.trace("Successfully sent ack for http message with etag {}. Removing it from saved list of outstanding messages to acknowledge", messageEtag);
this.messageToETagMap.remove(message);
return true;
}
}
}