我当前正在编写一个测试安全带,该测试线束在使用LUA脚本的HTTPD中引入延迟,失败和代理。这包括Querystring的解析,该解析可能包含相同标签的多个值IE:
?ref=12345678&ref=01012052&ref=30257523
然后,这允许将消息延迟在消息流中的特定点或将某些请求重定向到替代端点。我的问题是在提供的LUA表中可以使用的。
我遇到的问题是,在将以下代码与上述Querystring一起使用以简单地登录其正在使用的值时:
function output_multi_values(r)
local queryString, queryStringMulti = r:parseargs()
for queryStringKey, queryStringValue in pairs(queryStringMulti) do
r:err(queryStringKey .. "," .. queryString[queryStringKey] .. "," .. tostring(queryStringMulti[queryStringKey]) .. "," .. tostring(queryStringValue))
for multiKey, multiValue in pairs(queryStringMulti[queryStringKey]) do
r:err(queryStringKey .. "," .. multiKey .. "," .. multiValue)
end
end
return 0
end
唯一记录的项目是与提供的最终参考值相关的项目:
[Wed Jun 07 10:24:43.923877 2017] [lua:error] [pid 1370:tid 140336118597376] [client 192.168.56.101:43980] ref,30257523,table: 0x7fa264010810
[Wed Jun 07 10:24:43.923948 2017] [lua:error] [pid 1370:tid 140336118597376] [client 192.168.56.101:43980] ref,1,30257523
正如我们所看到的,在第一个日志条目中,它知道ref的值是一个表,但是当通过该表迭代时,只能返回1个条目,其中提供了最后一个值。另外,标准表还仅包括提供的最终值,不确定在这里应该是什么,且不感兴趣。
我相信我正在遵循Mod_lua文档中概述的Parseargs的正确程序,它与我的功能有关,但没有给出我的期望,但没有给出如何处理多价部分的示例。
。我只是以为它的工作方式与任何其他表格具有相同的键,该键是增量整数。
是否有其他方法应该通过Ref的多价值表?
环境详细信息
服务器硬件 - Oracle VirtualBox 5.1.16 R113841(2GB RAM,2个核心CPU,32GB HDD(。
服务器OS -Ubuntu 16.04.2 LTS(gnu/linux4.4.0-78代X86_64(。
apache HTTPD版本 - 服务器版本:Apache/2.4.18(Ubuntu(,服务器构建:2017-05-05-05T16:32:00。使用Ubuntu Canonical Repo安装。
Web客户端 - 选择您的选择,而不是依赖客户(curl,wget,firefox 44,chrome,jmeter(
更多信息
在查询字符串中包含不同的标签会导致所有正在处理的标签,但再次仅存储每个标签的最后一个值。querystring:
?ref=12345678&ref=01012052&ref=30257523&dob=01062017&dob=0101970
仅导致以下记录:
[Wed Jun 07 10:35:15.627686 2017] [lua:error] [pid 1369:tid 140336076633856] [client 192.168.56.101:43982] dob,0101970,table: 0x7fa25c0108f0
[Wed Jun 07 10:35:15.627774 2017] [lua:error] [pid 1369:tid 140336076633856] [client 192.168.56.101:43982] dob,1,0101970
[Wed Jun 07 10:35:15.627786 2017] [lua:error] [pid 1369:tid 140336076633856] [client 192.168.56.101:43982] ref,30257523,table: 0x7fa25c010810
[Wed Jun 07 10:35:15.627795 2017] [lua:error] [pid 1369:tid 140336076633856] [client 192.168.56.101:43982] ref,1,30257523
我也知道我不应该使用r:err:它是apache安装的日志记录级别,我无法更改它,所以err确保我有日志。
apache2已加载以下模块:
core_module (static)
so_module (static)
watchdog_module (static)
http_module (static)
log_config_module (static)
logio_module (static)
version_module (static)
unixd_module (static)
access_compat_module (shared)
alias_module (shared)
auth_basic_module (shared)
authn_core_module (shared)
authn_file_module (shared)
authz_core_module (shared)
authz_host_module (shared)
authz_user_module (shared)
autoindex_module (shared)
deflate_module (shared)
dir_module (shared)
env_module (shared)
filter_module (shared)
lbmethod_bybusyness_module (shared)
lbmethod_byrequests_module (shared)
lbmethod_bytraffic_module (shared)
lbmethod_heartbeat_module (shared)
lua_module (shared)
mime_module (shared)
mpm_event_module (shared)
negotiation_module (shared)
proxy_module (shared)
proxy_ajp_module (shared)
proxy_balancer_module (shared)
proxy_http_module (shared)
setenvif_module (shared)
slotmem_plain_module (shared)
slotmem_shm_module (shared)
socache_shmcb_module (shared)
ssl_module (shared)
status_module (shared)
在搜索其他问题时,我必须探索您的问题。我因此发现服务器代码中的AP_ARGS_TO_TABLE函数使用APR_Table_set。此函数将始终覆盖具有相等键的表条目,因此您获得的结果始终是一个1行表,其名称为键的多值查询字符串参数的最后值。这些文档还不够清楚,无法确定它是util_script.c(服务器代码(还是lua_request.c(模块代码(中的错误。无论如何,我通过对后者进行了一些修改,从而获得了正确的行为,我还纠正了Set_output_filter((工作。我只是在这里提交一个补丁:https://bz.apache.org/bugzilla/show_bug.cgi?id=62369