Blame samples/conntest.cpp

Packit 01d647
// ***************************************************************** -*- C++ -*-
Packit 01d647
// con-test.cpp
Packit 01d647
// Tester application for testing the http/https/ftp/ssh/sftp connection
Packit 01d647
Packit 01d647
#include <exiv2/exiv2.hpp>
Packit 01d647
Packit 01d647
#ifdef EXV_USE_CURL
Packit 01d647
    #include <curl/curl.h>
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#include <iostream>
Packit 01d647
#include <cstdlib>
Packit 01d647
Packit 01d647
void httpcon(const std::string& url, bool useHttp1_0 = false) {
Packit 01d647
    Exiv2::Dictionary response;
Packit 01d647
    Exiv2::Dictionary request;
Packit 01d647
    std::string       errors;
Packit 01d647
Packit 01d647
    Exiv2::Uri uri = Exiv2::Uri::Parse(url);
Packit 01d647
    Exiv2::Uri::Decode(uri);
Packit 01d647
Packit 01d647
    request["server"] = uri.Host;
Packit 01d647
    request["page"]   = uri.Path;
Packit 01d647
    request["port"]   = uri.Port;
Packit 01d647
    if (!useHttp1_0) request["version"] = "1.1";
Packit 01d647
Packit 01d647
    int serverCode = Exiv2::http(request,response,errors);
Packit 01d647
    if (serverCode < 0 || serverCode >= 400 || errors.compare("") != 0) {
Packit 01d647
        throw Exiv2::Error(Exiv2::kerTiffDirectoryTooLarge, "Server", serverCode);
Packit 01d647
    }
Packit 01d647
}
Packit 01d647
Packit 01d647
#ifdef EXV_USE_CURL
Packit 01d647
void curlcon(const std::string& url, bool useHttp1_0 = false) {
Packit 01d647
    CURL* curl = curl_easy_init();
Packit 01d647
    if(!curl) {
Packit 01d647
        throw Exiv2::Error(Exiv2::kerErrorMessage, "Uable to init libcurl.");
Packit 01d647
    }
Packit 01d647
Packit 01d647
    // get the timeout value
Packit 01d647
    std::string timeoutStr = Exiv2::getEnv(Exiv2::envTIMEOUT);
Packit 01d647
    long timeout = atol(timeoutStr.c_str());
Packit 01d647
    if (timeout == 0) {
Packit 01d647
        throw Exiv2::Error(Exiv2::kerErrorMessage, "Timeout Environmental Variable must be a positive integer.");
Packit 01d647
    }
Packit 01d647
Packit 01d647
    std::string response;
Packit 01d647
    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
Packit 01d647
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, Exiv2::curlWriter);
Packit 01d647
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
Packit 01d647
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
Packit 01d647
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
Packit 01d647
    curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, timeout);
Packit 01d647
    //curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); // debug
Packit 01d647
    if (useHttp1_0) curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
Packit 01d647
    else            curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
Packit 01d647
Packit 01d647
    /* Perform the request, res will get the return code */
Packit 01d647
    CURLcode res = curl_easy_perform(curl);
Packit 01d647
    if(res != CURLE_OK) { // error happends
Packit 01d647
        throw Exiv2::Error(Exiv2::kerErrorMessage, curl_easy_strerror(res));
Packit 01d647
    }
Packit 01d647
Packit 01d647
    // get return code
Packit 01d647
    long returnCode;
Packit 01d647
    curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &returnCode); // get code
Packit 01d647
    curl_easy_cleanup(curl);
Packit 01d647
Packit 01d647
    if (returnCode >= 400 || returnCode < 0) {
Packit 01d647
        throw Exiv2::Error(Exiv2::kerTiffDirectoryTooLarge, "Server", returnCode);
Packit 01d647
    }
Packit 01d647
}
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef EXV_USE_SSH
Packit 01d647
void sshcon(const std::string& url) {
Packit 01d647
    Exiv2::Uri uri = Exiv2::Uri::Parse(url);
Packit 01d647
    Exiv2::Uri::Decode(uri);
Packit 01d647
Packit 01d647
    std::string page = uri.Path;
Packit 01d647
    // remove / at the beginning of the path
Packit 01d647
    if (page[0] == '/') {
Packit 01d647
        page = page.substr(1);
Packit 01d647
    }
Packit 01d647
    Exiv2::SSH ssh(uri.Host, uri.Username, uri.Password, uri.Port);
Packit 01d647
    std::string response = "";
Packit 01d647
    std::string cmd = "declare -a x=($(ls -alt " + page + ")); echo ${x[4]}";
Packit 01d647
    if (ssh.runCommand(cmd, &response) != 0) {
Packit 01d647
        throw Exiv2::Error(Exiv2::kerErrorMessage, "Unable to get file length.");
Packit 01d647
    } else {
Packit 01d647
        long length = atol(response.c_str());
Packit 01d647
        if (length == 0) {
Packit 01d647
            throw Exiv2::Error(Exiv2::kerErrorMessage, "File is empty or not found.");
Packit 01d647
        }
Packit 01d647
    }
Packit 01d647
}
Packit 01d647
Packit 01d647
void sftpcon(const std::string& url) {
Packit 01d647
    Exiv2::Uri uri = Exiv2::Uri::Parse(url);
Packit 01d647
    Exiv2::Uri::Decode(uri);
Packit 01d647
Packit 01d647
    std::string page = uri.Path;
Packit 01d647
    // remove / at the beginning of the path
Packit 01d647
    if (page[0] == '/') {
Packit 01d647
        page = page.substr(1);
Packit 01d647
    }
Packit 01d647
    Exiv2::SSH ssh(uri.Host, uri.Username, uri.Password, uri.Port);
Packit 01d647
    sftp_file handle;
Packit 01d647
    ssh.getFileSftp(page, handle);
Packit 01d647
    if (handle == NULL) throw Exiv2::Error(Exiv2::kerErrorMessage, "Unable to open the file");
Packit 01d647
    else sftp_close(handle);
Packit 01d647
}
Packit 01d647
#endif
Packit 01d647
Packit 01d647
int main(int argc,const char** argv)
Packit 01d647
{
Packit Service fb147c
    Exiv2::XmpParser::initialize();
Packit Service fb147c
    ::atexit(Exiv2::XmpParser::terminate);
Packit Service fb147c
Packit 01d647
    if (argc < 2) {
Packit 01d647
        std::cout << "Usage: " << argv[0] << " url {-http1_0}" << std::endl;
Packit 01d647
        return 1;
Packit 01d647
    }
Packit 01d647
    std::string url(argv[1]);
Packit 01d647
    Exiv2::Protocol prot = Exiv2::fileProtocol(url);
Packit 01d647
Packit 01d647
    bool useHttp1_0 = false;
Packit 01d647
    for ( int a = 1 ; a < argc ; a++ ) {
Packit 01d647
        std::string arg(argv[a]);
Packit 01d647
        if (arg == "-http1_0") useHttp1_0 = true;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    bool isOk = false;
Packit 01d647
    try {
Packit 01d647
        #ifdef EXV_USE_SSH
Packit 01d647
            if (prot == Exiv2::pSsh) {
Packit 01d647
                sshcon(url);
Packit 01d647
                isOk = true;
Packit 01d647
            } else if (prot == Exiv2::pSftp){
Packit 01d647
                sftpcon(url);
Packit 01d647
                isOk = true;
Packit 01d647
            }
Packit 01d647
        #endif
Packit 01d647
        #ifdef EXV_USE_CURL
Packit 01d647
            if (prot == Exiv2::pHttp || prot == Exiv2::pHttps || prot == Exiv2::pFtp) {
Packit 01d647
                curlcon(url, useHttp1_0);
Packit 01d647
                isOk = true;
Packit 01d647
            }
Packit 01d647
        #endif
Packit 01d647
        if (!isOk && prot == Exiv2::pHttp) {
Packit 01d647
            httpcon(url, useHttp1_0);
Packit 01d647
            isOk = true;
Packit 01d647
        }
Packit 01d647
    } catch (const Exiv2::AnyError& e) {
Packit 01d647
        std::cout << "Error: '" << e << "'" << std::endl;
Packit 01d647
        return -1;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    if (!isOk)  std::cout << "The protocol is unsupported." << std::endl;
Packit 01d647
    else        std::cout << "OK." << std::endl;
Packit 01d647
    return 0;
Packit 01d647
}
Packit 01d647
Packit 01d647
// That's all Folks!