Result HTTPLookupService::sendHTTPRequest()

in lib/HTTPLookupService.cc [193:266]


Result HTTPLookupService::sendHTTPRequest(std::string completeUrl, std::string &responseData,
                                          long &responseCode) {
    // Authorization data
    AuthenticationDataPtr authDataContent;
    Result authResult = authenticationPtr_->getAuthData(authDataContent);
    if (authResult != ResultOk) {
        LOG_ERROR("Failed to getAuthData: " << authResult);
        return authResult;
    }

    CurlWrapper curl;
    if (!curl.init()) {
        LOG_ERROR("Unable to curl_easy_init for url " << completeUrl);
        return ResultLookupError;
    }

    std::unique_ptr<CurlWrapper::TlsContext> tlsContext;
    if (isUseTls_) {
        tlsContext.reset(new CurlWrapper::TlsContext);
        tlsContext->trustCertsFilePath = tlsTrustCertsFilePath_;
        tlsContext->validateHostname = tlsValidateHostname_;
        tlsContext->allowInsecure = tlsAllowInsecure_;
        if (authDataContent->hasDataForTls()) {
            tlsContext->certPath = authDataContent->getTlsCertificates();
            tlsContext->keyPath = authDataContent->getTlsPrivateKey();
        } else {
            tlsContext->certPath = tlsCertificateFilePath_;
            tlsContext->keyPath = tlsPrivateFilePath_;
        }
    }

    LOG_INFO("Curl Lookup Request sent for " << completeUrl);
    CurlWrapper::Options options;
    options.timeoutInSeconds = lookupTimeoutInSeconds_;
    options.userAgent = std::string("Pulsar-CPP-v") + PULSAR_VERSION_STR;
    options.maxLookupRedirects = maxLookupRedirects_;
    auto result = curl.get(completeUrl, authDataContent->getHttpHeaders(), options, tlsContext.get());
    const auto &error = result.error;
    if (!error.empty()) {
        LOG_ERROR(completeUrl << " failed: " << error);
        return ResultConnectError;
    }

    responseData = result.responseData;
    responseCode = result.responseCode;
    auto res = result.code;
    if (res == CURLE_OK) {
        LOG_INFO("Response received for url " << completeUrl << " responseCode " << responseCode);
    } else if (res == CURLE_TOO_MANY_REDIRECTS) {
        LOG_ERROR("Response received for url " << completeUrl << ": " << curl_easy_strerror(res)
                                               << ", curl error: " << result.serverError
                                               << ", redirect URL: " << result.redirectUrl);
    } else {
        LOG_ERROR("Response failed for url " << completeUrl << ": " << curl_easy_strerror(res)
                                             << ", curl error: " << result.serverError);
    }

    switch (res) {
        case CURLE_OK:
            return ResultOk;
        case CURLE_COULDNT_CONNECT:
            return ResultRetryable;
        case CURLE_COULDNT_RESOLVE_PROXY:
        case CURLE_COULDNT_RESOLVE_HOST:
        case CURLE_HTTP_RETURNED_ERROR:
            return ResultConnectError;
        case CURLE_READ_ERROR:
            return ResultReadError;
        case CURLE_OPERATION_TIMEDOUT:
            return ResultTimeout;
        default:
            return ResultLookupError;
    }
}