req->vars_ref = LUA_NOREF;
req->uid = uid;
req->qsource.flags.xdp = is_xdp;
+ array_init(req->qsource.headers);
if (session) {
req->qsource.flags.tcp = session_get_handle(session)->type == UV_TCP;
req->qsource.flags.tls = session_flags(session)->has_tls;
req->qsource.flags.http = session_flags(session)->has_http;
req->qsource.stream_id = -1;
- req->qsource.headers = NULL;
#if ENABLE_DOH2
if (req->qsource.flags.http) {
struct http_ctx *http_ctx = session_http_get_server_ctx(session);
struct http_stream stream = queue_head(http_ctx->streams);
req->qsource.stream_id = stream.id;
- /* Take ownership of HTTP headers. */
if (stream.headers) {
- req->qsource.headers = stream.headers;
+ req->qsource.headers = *stream.headers;
+ free(stream.headers);
stream.headers = NULL;
}
}
ctx->req.vars_ref = LUA_NOREF;
}
/* Free HTTP/2 headers for DoH requests. */
- if (ctx->req.qsource.headers) { // TODO maybe refactor elsewhere into function
- for(int i = 0; i < ctx->req.qsource.headers->len; i++) {
- free(ctx->req.qsource.headers->at[i].name);
- free(ctx->req.qsource.headers->at[i].value);
- }
- array_clear(*ctx->req.qsource.headers);
- free(ctx->req.qsource.headers);
+ for(int i = 0; i < ctx->req.qsource.headers.len; i++) {
+ free(ctx->req.qsource.headers.at[i].name);
+ free(ctx->req.qsource.headers.at[i].value);
}
+ array_clear(ctx->req.qsource.headers);
+
/* Make sure to free XDP buffer in case it wasn't sent. */
if (ctx->req.alloc_wire_cb) {
#if ENABLE_XDP
struct kr_request_qsource_flags flags; /**< See definition above. */
size_t size; /**< query packet size */
int32_t stream_id; /**< HTTP/2 stream ID for DoH requests */
- kr_http_header_array_t *headers; /**< HTTP/2 headers for DoH requests */
+ kr_http_header_array_t headers; /**< HTTP/2 headers for DoH requests */
} qsource;
struct {
unsigned rtt; /**< Current upstream RTT */