oatpp / oatpp-openssl

OpenSSL adaptor for Oat++ applications

Home Page:https://oatpp.io/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Curl backend works, Oatpp backend fails to parse headers

xanderdunn opened this issue · comments

This produces the output I expect to see:

#include <iostream>

#include "oatpp/web/client/ApiClient.hpp"
#include "oatpp/core/macro/codegen.hpp"

#include OATPP_CODEGEN_BEGIN(ApiClient) ///< Begin code-gen section

class MyApiClient : public oatpp::web::client::ApiClient {

  API_CLIENT_INIT(MyApiClient)

  API_CALL("GET", "/api/markets", getMarkets)

};

#include OATPP_CODEGEN_END(ApiClient) ///< End code-gen section

#include "oatpp/web/client/HttpRequestExecutor.hpp"
#include "oatpp/core/base/StrBuffer.hpp"
#include "oatpp/core/Types.hpp"
#include "oatpp-openssl/client/ConnectionProvider.hpp"
#include "oatpp-openssl/Config.hpp"
#include "oatpp-openssl/Callbacks.hpp"
#include "oatpp-curl/RequestExecutor.hpp"
#include <csignal>

using namespace oatpp::network;
using namespace oatpp::web;
using namespace oatpp::parser;

int main() {
    oatpp::openssl::Callbacks::setDefaultCallbacks();
    std::signal(SIGPIPE, SIG_IGN);

    /* create connection provider */
    auto config = oatpp::openssl::Config::createShared();
    auto connectionProvider = oatpp::openssl::client::ConnectionProvider::createShared(config,
            {"ftx.com", 443});

    //auto requestExecutor = client::HttpRequestExecutor::createShared(connectionProvider);
    auto requestExecutor = oatpp::curl::RequestExecutor::createShared("https://ftx.com");

    auto client = MyApiClient::createShared(requestExecutor, NULL);
    auto response = client->getMarkets();
    std::cout << response->getStatusCode() << std::endl;
    std::cout << response->readBodyToString()->std_str() << std::endl;
    return EXIT_SUCCESS;
}

Now comment out the curl-backed requestExecutor and uncomment auto requestExecutor = client::HttpRequestExecutor::createShared(connectionProvider);, running it again produces this error:

terminate called after throwing an instance of 'oatpp::web::client::RequestExecutor::RequestExecutionError'
  what():  [oatpp::web::client::HttpRequestExecutor::executeOnce()]: Failed to read response.
./data_feed.sh: line 20: 21490 Aborted                 (core dumped)

It appears to be this failure to read the headers.

I just noticed in the curl header that the response is HTTP/2. Perhaps this parsing error is just a manifestation of oatpp/oatpp#116?

curl --http1.1 on the same endpoint works, so I don't think HTTP/2 is the issue. The server also supports HTTP/1.1.

Hello @xanderdunn ,

Here is the code that works for me:

#include <iostream>

#include "oatpp/web/client/ApiClient.hpp"
#include "oatpp/core/macro/codegen.hpp"

#include OATPP_CODEGEN_BEGIN(ApiClient) ///< Begin code-gen section

class MyApiClient : public oatpp::web::client::ApiClient {

  API_CLIENT_INIT(MyApiClient)

  API_CALL("GET", "/api/markets", getMarkets)

};

#include OATPP_CODEGEN_END(ApiClient) ///< End code-gen section

#include "oatpp/web/client/HttpRequestExecutor.hpp"
#include "oatpp/core/base/StrBuffer.hpp"
#include "oatpp/core/Types.hpp"
#include "oatpp-openssl/client/ConnectionProvider.hpp"
#include "oatpp-openssl/Config.hpp"
#include <csignal>

using namespace oatpp::network;
using namespace oatpp::web;
using namespace oatpp::parser;

int main() {
  std::signal(SIGPIPE, SIG_IGN);

  /* create connection provider */
  //auto config = oatpp::openssl::Config::createShared(); // also works
  auto config = oatpp::openssl::Config::createDefaultClientConfigShared();
  auto connectionProvider =
    oatpp::openssl::client::ConnectionProvider::createShared(config,{"ftx.com", 443});

  auto requestExecutor = client::HttpRequestExecutor::createShared(connectionProvider);

  auto client = MyApiClient::createShared(requestExecutor, NULL);
  auto response = client->getMarkets();
  std::cout << response->getStatusCode() << std::endl;
  std::cout << response->readBodyToString()->std_str() << std::endl;
  return EXIT_SUCCESS;
}

cmake:

find_package(OpenSSL 1.1 REQUIRED)

find_package(oatpp          1.2.5 REQUIRED)
find_package(oatpp-openssl  1.2.5 REQUIRED)

target_link_libraries(my-example
        # oatpp
        PUBLIC oatpp::oatpp
        PUBLIC oatpp::oatpp-openssl

        # third-party
        PUBLIC OpenSSL::SSL
        PUBLIC OpenSSL::Crypto
)

Please make sure to use the latest oatpp and oatpp-openssl. Notice that the latest oatpp-openssl has no "oatpp-openssl/Callbacks.hpp" file.

Regards,
Leonid

Thanks @lganzzzo, in the coming days I will try this with 1.2.5 as soon as I can. I was on 1.2.0, the latest version in vcpkg. I opened microsoft/vcpkg#17504 to make it easily available to my project.

I just upgraded to 1.2.5 and updated my code and this is working as expected now, thank you!