public boolean sendMessageResult()

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;
            }
        }
    }