Как разобратся с ошибкой Unsupported protocol в cURL в QtCreator?

Есть код примера парсера Jannson
#include <stdlib.h>
#include <string.h>

#include <src/jansson.h>
#include <curl/include/curl/curl.h>

#define BUFFER_SIZE  (256 * 1024)  /* 256 KB */

#define URL_FORMAT   "https://api.github.com/repos/vmg/redcarpet/commits"
#define URL_SIZE     256

/* Return the offset of the first newline in text or the length of
   text if there's no newline */
static int newline_offset(const char *text)
{
    const char *newline = strchr(text, '\n');
    if(!newline)
        return strlen(text);
    else
        return (int)(newline - text);
}

struct write_result
{
    char *data;
    int pos;
};

static size_t write_response(void *ptr, size_t size, size_t nmemb, void *stream)
{
    struct write_result *result = (struct write_result *)stream;

    if(result->pos + size * nmemb >= BUFFER_SIZE - 1)
    {
        fprintf(stderr, "error: too small buffer\n");
        return 0;
    }

    memcpy(result->data + result->pos, ptr, size * nmemb);
    result->pos += size * nmemb;

    return size * nmemb;
}

static char *request(const char *url)
{
    CURL *curl = NULL;
    CURLcode status;
    struct curl_slist *headers = NULL;
    char *data = NULL;
    long code;

    curl_global_init(CURL_GLOBAL_ALL);
    curl = curl_easy_init();
    if(!curl)
        goto error;

    data = malloc(BUFFER_SIZE);
    if(!data)
        goto error;

    struct write_result write_result = {
        .data = data,
                .pos = 0
    };

    curl_easy_setopt(curl, CURLOPT_URL, url);

    /* GitHub commits API v3 requires a User-Agent header */
    headers = curl_slist_append(headers, "User-Agent: Jansson-Tutorial");
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_response);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &write_result);

    status = curl_easy_perform(curl);
    if(status != 0)
    {
        fprintf(stderr, "error: unable to request data from %s:\n", url);
        fprintf(stderr, "%s\n", curl_easy_strerror(status));
        goto error;
    }

    curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code);
    if(code != 200)
    {
        fprintf(stderr, "error: server responded with code %ld\n", code);
        goto error;
    }

    curl_easy_cleanup(curl);
    curl_slist_free_all(headers);
    curl_global_cleanup();

    /* zero-terminate the result */
    data[write_result.pos] = '\0';

    return data;

error:
    if(data)
        free(data);
    if(curl)
        curl_easy_cleanup(curl);
    if(headers)
        curl_slist_free_all(headers);
    curl_global_cleanup();
    return NULL;
}

int main(int argc, char *argv[])
{
    size_t i;
    char *text;
    char url[URL_SIZE];

    json_t *root;
    json_error_t error;

    if(argc != 3)
    {
        fprintf(stderr, "usage: %s USER REPOSITORY\n\n", argv[0]);
        fprintf(stderr, "List commits at USER's REPOSITORY.\n\n");
//        return 2;
    }

    snprintf(url, URL_SIZE, URL_FORMAT);

    text = request(url);
    if(!text)
        return 1;

    root = json_loads(text, 0, &error);
    free(text);

    if(!root)
    {
        fprintf(stderr, "error: on line %d: %s\n", error.line, error.text);
        return 1;
    }

    if(!json_is_array(root))
    {
        fprintf(stderr, "error: root is not an array\n");
        json_decref(root);
        return 1;
    }

    for(i = 0; i < json_array_size(root); i++)
    {
        json_t *data, *sha, *commit, *message;
        const char *message_text;

        data = json_array_get(root, i);
        if(!json_is_object(data))
        {
            fprintf(stderr, "error: commit data %d is not an object\n", (int)(i + 1));
            json_decref(root);
            return 1;
        }

        sha = json_object_get(data, "sha");
        if(!json_is_string(sha))
        {
            fprintf(stderr, "error: commit %d: sha is not a string\n", (int)(i + 1));
            return 1;
        }

        commit = json_object_get(data, "commit");
        if(!json_is_object(commit))
        {
            fprintf(stderr, "error: commit %d: commit is not an object\n", (int)(i + 1));
            json_decref(root);
            return 1;
        }

        message = json_object_get(commit, "message");
        if(!json_is_string(message))
        {
            fprintf(stderr, "error: commit %d: message is not a string\n", (int)(i + 1));
            json_decref(root);
            return 1;
        }

        message_text = json_string_value(message);
        printf("%.8s %.*s\n",
               json_string_value(sha),
               newline_offset(message_text),
               message_text);
    }

    json_decref(root);
    return 0;
}


есть скомпилированная cURL вот таким образом:

./configure
make
make install


А .pro файл выглядит так
TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt

SOURCES += \
    github_commits.c

HEADERS +=


win32:CONFIG(release, debug|release): LIBS += -L$$PWD/src/.libs/release/ -ljansson
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/src/.libs/debug/ -ljansson
else:unix: LIBS += -L$$PWD/src/.libs/ -ljansson

INCLUDEPATH += $$PWD/src/.libs
DEPENDPATH += $$PWD/src/.libs

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/curl/lib/.libs/release/ -lcurl
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/curl/lib/.libs/debug/ -lcurl
else:unix: LIBS += -L$$PWD/curl/lib/.libs/ -lcurl

INCLUDEPATH += $$PWD/curl/lib/.libs
DEPENDPATH += $$PWD/curl/lib/.libs


Командная строка выдает:
usage: /home/username/programy/build-jansson-c-Desktop_Qt_5_2_1_GCC_64bit-Debug/jansson-c USER REPOSITORY

List commits at USER's REPOSITORY.

error: unable to request data from https://api.github.com/repos/vmg/redcarpet/commits:
Unsupported protocol
  • Вопрос задан
  • 4787 просмотров
Решения вопроса 1
Z37
@Z37 Автор вопроса
В моем случае:
1. Собрать и поставить OpenSSL.
2. Поставить файлы разработки OpenSSL apt-get install libssl-dev
3. Собрать и поставить сURL с
./configure --with-openssl=/usr/local/ssl
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
EXL
@EXL
Энтузиаст
https

Если не ошибаюсь, то cURL должен быть собран с поддержкой этого протокола. То есть тянуть в зависимостях еще и openssl. Проблема в библиотеке cURL. Пробуйте собрать openssl, затем cURL с поддержкой SSL:

./configure --with-ssl
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы