Z
Z
Z372014-05-25 22:41:13
C++ / C#
Z37, 2014-05-25 22:41:13

How to deal with Unsupported protocol error in cURL in QtCreator?

There is Jannson parser example code

#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;
}

there is a compiled cURL like this:
./configure
make
make install

And the .pro file looks like this
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

The command line outputs:
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

Answer the question

In order to leave comments, you need to log in

2 answer(s)
Z
Z37, 2014-05-26
@Z37

In my case:
1. Build and install OpenSSL.
3. Build and install with URL with

./configure --with-openssl=/usr/local/ssl

E
EXL, 2014-05-25
@EXL

http s
If I'm not mistaken, then cURL should be compiled with support for this protocol. That is, pull in dependencies also openssl. The problem is in the cURL library. Try building openssl, then cURL with SSL support:
./configure --with-ssl

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question