Share via

Getting error : "errorCode":400004,"trackingId":"7XXXXXX-2XXX-XXXX-XXXX-XXXXXXXXXXX6","message":"Invalid idScope length","timestampUtc":"2024-09-16T07:05:13.903829Z"

Shahanshah Alam 0 Reputation points
2024-09-16T07:09:44.1266667+00:00

I am trying to initialise file upload referring to this documentation with C++, but I am getting an error
"errorCode":400004,"trackingId":"7e49d9f8-2XXX-XXXX-XXXX-XXXXXXXXXXX6","message":"Invalid idScope length","timestampUtc":"2024-09-16T07:05:13.903829Z"

My code

// Function to perform the HTTPS POST request for file upload
std::string initialiseFileUpload(const std::string &certificate, const std::string &key, const std::string &fileNameWithFolder, const std::string &assignedHub, const std::string &registrationId) {
    std::cout << "Starting HTTPS POST request for file upload..." << std::endl;

    // Decode the base64-encoded P12 certificate
    std::string p12_data = DecodeBase64(certificate);
    std::cout << "P12 certificate decoded. Size: " << p12_data.size() << " bytes." << std::endl;

    EVP_PKEY *pkey = nullptr;
    X509 *cert = nullptr;
    STACK_OF(X509) *ca = nullptr;

    // Set up SSL context and load the P12 certificate
    SSL_CTX *ctx = setup_ssl_context(p12_data, key, pkey, cert, ca);
    if (!ctx) {
        return "";
    }

    SSL *ssl;
    BIO *bio_conn;

    std::string bioAddress = assignedHub + ":443";
    bio_conn = BIO_new_ssl_connect(ctx);
    BIO_get_ssl(bio_conn, &ssl);
    SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
    BIO_set_conn_hostname(bio_conn, bioAddress.c_str());

    if (BIO_do_connect(bio_conn) <= 0) {
        ERR_print_errors_fp(stderr);
        std::cerr << "Failed to connect to server." << std::endl;
        BIO_free_all(bio_conn);
        SSL_CTX_free(ctx);
        return "";
    }
    std::cout << "Connected to server." << std::endl;

    std::string url_path = "/devices/" + registrationId + "/files?api-version=2021-04-12";
    std::string jsonBody = "{\"blobName\": \"" + fileNameWithFolder + "\"}";
    std::string request = "POST " + url_path + " HTTP/1.1\r\n"
                          "Host: " + assignedHub + "\r\n"
                          "Content-Type: application/json\r\n"
                          "Content-Length: " + std::to_string(jsonBody.size()) + "\r\n"
                          "Connection: close\r\n\r\n" + jsonBody;

    BIO_write(bio_conn, request.c_str(), request.length());
    std::cout << "HTTP POST request sent." << std::endl;

    char buffer[1024];
    std::string response;
    while (int bytesRead = BIO_read(bio_conn, buffer, sizeof(buffer) - 1)) {
        if (bytesRead <= 0) break;
        buffer[bytesRead] = '\0';
        response += buffer;
    }
    std::cout << "Response received. Size: " << response.size() << " bytes." << std::endl;

    BIO_free_all(bio_conn);
    SSL_CTX_free(ctx);
    EVP_PKEY_free(pkey);
    X509_free(cert);
    sk_X509_pop_free(ca, X509_free);
    EVP_cleanup();
    std::cout << "Cleaned up OpenSSL resources." << std::endl;

    // Find the start of the JSON body by looking for the first '{'
    std::size_t jsonStart = response.find('{');
    
    // Find the end of the JSON body by looking for the last '}'
    std::size_t jsonEnd = response.rfind('}');
    std::string jsonResponse;
    if (jsonStart != std::string::npos && jsonEnd != std::string::npos) {
        // Extract the JSON portion of the response
        jsonResponse = response.substr(jsonStart, jsonEnd - jsonStart + 1);
        std::cout << "Trimmed JSON response: " << jsonResponse << std::endl;
    } else {
        std::cout << "JSON response not found." << std::endl;
    }

    return jsonResponse;
}
Azure IoT Hub
Azure IoT Hub

An Azure service that enables bidirectional communication between internet of things (IoT) devices and applications.


Your answer

Answers can be marked as 'Accepted' by the question author and 'Recommended' by moderators, which helps users know the answer solved the author's problem.