从libevent的HTTP服务器响应中获取所有HTTP头



使用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->keyheader->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;
    }
}

相关内容

  • 没有找到相关文章

最新更新