Получить все заголовки 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;
}
}