Получить все заголовки HTTP из ответа HTTP-сервера в libevent

Использование libevent для выполнения HTTP-запроса. Я хотел бы напечатать все HTTP-заголовки в ответе сервера, но не уверен, как.

static void http_request_done(struct evhttp_request *req, void *ctx) {
    //how do I print out all the http headers in the server response 
}

evhttp_request_new(http_request_done,NULL);

Я знаю, что могу получить отдельный заголовок, как показано ниже, но как мне получить все заголовки?

static void http_request_done(struct evhttp_request *req, void *ctx) {
    struct evkeyvalq * kv = evhttp_request_get_input_headers(req);
    printf("%s\n", evhttp_find_header(kv, "SetCookie"));
}

Благодарю.

2 ответа

Решение

Хотя у меня нет опыта работы с libevent библиотека, для меня довольно ясно, что API не обеспечивает такую ​​функциональность (см. его API для справки). Однако, что вы можете сделать, это написать свой собственный метод, используя TAILQ_FOREACH внутренний макрос, который определен в event-internal.h, Значение evhttp_find_header довольно просто:

const char *
evhttp_find_header(const struct evkeyvalq *headers, const char *key)
{
    struct evkeyval *header;

    TAILQ_FOREACH(header, headers, next) {
        if (evutil_ascii_strcasecmp(header->key, key) == 0)
            return (header->value);
    }

    return (NULL);
}

Вместо того чтобы делать evutil_ascii_strcasecmp Вы можете просто получить header->key или же header->value записи из evkeyval структура (определена в include/event2/keyvalq_struct.h):

/*
 * Key-Value pairs.  Can be used for HTTP headers but also for
 * query argument parsing.
 */
struct evkeyval {
    TAILQ_ENTRY(evkeyval) next;

    char *key;
    char *value;
};

Благодаря полезным советам @Grzegorz Szpetkowski я создал следующую процедуру, которая отлично работает. Причина использования "kv = kv->next.tqe_next" была из-за "TAILQ_ENTRY(evkeyval) next" в определении структуры evkeyval.

static void http_request_done(struct evhttp_request *req, void *ctx) {
    struct evkeyvalq *header = evhttp_request_get_input_headers(req);
    struct evkeyval* kv = header->tqh_first;
    while (kv) {
        printf("%s: %s\n", kv->key, kv->value);
        kv = kv->next.tqe_next;
    }
}
Другие вопросы по тегам