bakercp / ofxHTTP

A suite of HTTP tools, including clients and servers for openFrameworks.
MIT License
110 stars 37 forks source link

Possible segmentation fault on GetRequest? #55

Open neobits opened 4 years ago

neobits commented 4 years ago

Hello! I'm currently working on a app that needs to access the internet. I'm using the addon first to "ping" a server to see if there's network connection available. This is done in a separate thread. But one in a while, the app terminates with a segmentation fault. I done a backtrace using gdb, but no result other than 1 stack was found. Maybe I'm doing some errors, so I would like to know if these calls can be handled in a separate thread.

Here is the coude:

ConnectionHandler.h

class ConnectionHandler : public ofThread
{
public:
    ConnectionHandler();

    void setup(ConfigurationManager *config);
    void threadedFunction();
    bool pingServer();
    bool isConnected();

private:
    ConfigurationManager    *config;
    std::map<std::string, std::string> headers;
    ofxHTTP::ClientSessionSettings sessionSettings;
    bool connected;
    long sleepTime;
};

ConnectionHandler.cpp

#include "ConnectionHandler.h"

ConnectionHandler::ConnectionHandler()
{

}
//--------------------------------------------------------------------------
void ConnectionHandler::setup(ConfigurationManager *config) 
{
    startThread(false);
    setThreadName("ConnectionHandlerThread");
    this->config = config;
    sleepTime = config->systemConfig.getCheckConnectionTime() * 1000;
    sessionSettings.setKeepAliveTimeout(Poco::Timespan::SECONDS * 10);
}
//--------------------------------------------------------------------------
bool ConnectionHandler::isConnected() 
{
    return connected;
}
//--------------------------------------------------------------------------
void ConnectionHandler::threadedFunction()
{
    while (isThreadRunning())
    {
        // Try ping and check response
        connected = pingServer();

        ofLogNotice("ConnectionHandler::threadedFunction")
            << "Ping " << config->serverConfig.pbDNSServer
            << " result " << std::boolalpha << connected;

        sleep(sleepTime);
    }
}
//--------------------------------------------------------------------------
bool ConnectionHandler::pingServer()
{
    bool success = false;
    //ResponseInfo info;
    try { // Do the query!
        string uri = "https://"; // Using a secure scheme
        uri.append(config->serverConfig.pbDNSServer); // Append server address
        ofx::HTTP::GetRequest request(uri); // Create request
        ofxHTTP::Client client; // Create client
        ofx::HTTP::Context ctx; // Create context
        ctx.setClientSessionSettings(sessionSettings);
        request.setContentType("application/x-www-form-urlencoded");

        // Execute the request within the given context.
        auto response = client.execute(ctx, request);

        if (response->getStatus() == Poco::Net::HTTPResponse::HTTP_OK) {
            //info.success = true;
            success = true;
        }
        ofLogNotice("ConnectionHandler::pingServer")
            << "HTTP Status Code = " << response->getStatus();
    }
    catch (const Poco::Exception& exc) {
        ofLogError("ConnectionHandler::pingServer") << "Poco: " << exc.displayText();
    }
    catch (const std::exception& exc) {
        ofLogError("ConnectionHandler::pingServer") << exc.what();
    }
    return success;
}

Thank you very much for your help! I'm testing this for days but cannot resolve it :S