使用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("%sn", evhttp_find_header(kv, "SetCookie"));
}
谢谢。
虽然我没有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);
}
您可以简单地从evkeyval
struct(在include/event2/keyvalq_struct.h
中定义)中获取header->key
或header->value
项,而不是执行evutil_ascii_strcasecmp
:
/*
* 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->"的原因如下。使用tqe_next"是因为struct evkeyval定义中的"TAILQ_ENTRY(evkeyval) next"
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: %sn", kv->key, kv->value);
kv = kv->next.tqe_next;
}
}