apache 2.4模块:在响应中写入新的cookie导致seg错误

Shi*_*shi 6 c apache

我正在编写apache模块,我在编写一个新的cookie以便通过响应发送到浏览器时遇到困难.

我正在尝试ap_cookie_write按照文档中的说明使用.

第一个问题 - 我不认为在request_rec将cookie发送回客户端时会在遗嘱上设置cookie ,那么我怎么能真正添加​​cookie呢?

第二个问题 - 此代码:

if (ap_cookie_write(ctx->r, "_mycookie", "", NULL,  0L) != APR_SUCCESS) {
     ERROR(ctx->r->server, "Could not write _mycookie empty value");
}
Run Code Online (Sandbox Code Playgroud)

导致此崩溃:

[Wed Aug 03 10:09:51.712610 2016] [core:debug] [pid 17272:tid 140219016423168] util_cookies.c(59): [client 10.20.1.35:52967] AH00007: ap_cookie: user '(null)' set cookie: '_mycookie=;HttpOnly;Secure;Version=1', referer: http://10.20.1.203/
[Wed Aug 03 10:09:52.389575 2016] [core:notice] [pid 32421:tid 140219219822464] AH00051: child pid 17272 exit signal Segmentation fault (11), possible coredump in /etc/apache2
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?通过查看源代码,我发现不需要分配我发送的字符串.

更新

至于第二个问题 - 我发现varargs列表必须结束,NULL以便修复seg错误:

if (ap_cookie_write(ctx->r, "_mycookie", "", NULL,  0L, NULL) != APR_SUCCESS) {
     ERROR(ctx->r->server, "Could not write _mycookie empty value");
}
Run Code Online (Sandbox Code Playgroud)

但现在cookie没有返回响应.

Avi*_*Avi 2

您需要提供ap_cookie_write要添加 cookie 的标头表。正如文档所说:

由零个或多个 (apr_table_t *) 表组成的 varargs 数组,后跟应添加 cookie 的 NULL。

Cookie 与标头有什么关系?

Cookie 是通过Set-Cookie(或Set-Cookie2 )标头添加/删除的。

为什么需要提供头表?

request_rec 实例有两个头表,headers_out 和 err_headers_out。

headers_out 和 err_headers_out 之间的区别在于,后者即使出现错误也会打印,并且在内部重定向中持续存在(因此为 ErrorDocument 处理程序打印的标头将包含它们)。

例如,如果处理程序想要返回 404 响应,但仍然要设置 cookie,则必须是:

$r->err_headers_out->add('Set-Cookie' => $cookie); 返回 Apache2::Const::NOT_FOUND;如果处理程序执行以下操作:

$r->headers_out->add('Set-Cookie' => $cookie); 返回 Apache2::Const::NOT_FOUND;Set-Cookie 标头不会被发送。

来源

因此,ap_cookie_write无法知道要使用哪个标头表(如果有)。如果需要,您可以提供其他不相关的表。

就您而言,您可能想要执行以下操作:

request_rec *r = ctx->r;
ap_cookie_write(r, "_mycookie", "", NULL,  0L, r->headers_out, r->err_headers_out, NULL);
Run Code Online (Sandbox Code Playgroud)