0

我目前正在编写一个测试工具,它使用带有 LUA 脚本的 httpd 引入延迟、失败和代理。这包括解析可能包含同一标签的多个值的查询字符串,即:

?ref=12345678&ref=01012052&ref=30257523 

然后,这允许消息在消息流中的特定点延迟或将某些请求重定向到替代端点。我的问题来自提供的 LUA 表中可用的内容。

我遇到的问题是,当使用类似下面的代码和上面的查询字符串来简单地注销它正在使用的值时:

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 的值是一个表,但是当迭代该表时,只返回一个带有最后一个值的条目。此外,标准表也只包括提供的最终值,但不确定这里应该是什么并且不感兴趣。

我相信我正在遵循 mod_lua文档中概述的 parseargs 的正确程序,就我的功能而言,这与我的期望相呼应,但没有给出如何处理多值部分的示例。

我只是假设它与任何其他表一样工作,其中多值的键是增量整数。

还有其他方法我应该通过多值表获取 ref 吗?

环境细节

服务器硬件 - Oracle VirtualBox 5.1.16 r113841(2gb RAM,2 核 CPU,32gb 硬盘)。

服务器操作系统 - Ubuntu 16.04.2 LTS(GNU/Linux 4.4.0-78-generic x86_64)。

Apache httpd 版本 - 服务器版本:Apache/2.4.18 (Ubuntu),服务器构建时间:2017-05-05T16:32:00。使用 ubuntu 规范 repo 安装。

Web 客户端 - 随您选择,不依赖于客户端(curl、wget、firefox 44、chrome、jmeter)

更多信息

在查询字符串中包含不同的标签会导致所有标签都被处理,但同样,只有每个标签的最后一个值被存储。请求参数:

?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)
4

1 回答 1

-1

在寻找不同的问题时,我不得不探索你的问题。我因此发现服务器代码中的 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

于 2018-05-10T17:18:37.997 回答