【问题标题】:GWAN query string length issueGWAN 查询字符串长度问题
【发布时间】:2014-08-18 14:05:15
【问题描述】:

我正在使用 GWAN (v4.3.14) 并遇到一个奇怪的问题。我正在尝试在查询字符串中传递一些长文本。我发现 GWAN 不允许我传递超过 537 个字符的总请求大小的查询参数。
它以 400 Bad Request

响应

一个示例字符串是:

http://xxx.xxx.xxx.xxx:yyyy/?t.cpp&c=DbE9kdOJGMm9yr7aypGlQBY1a9rZuiaMDAAnTJSbOBRJZo45YHbpAO5VENLa6IcmlSadZnTucpKBKb0E0G15pFHCgB4oNxqQ3m1K0CX8K15RQkawb8MThuoIHKp02vk9WwJFU5NkBJtwu80onudOkwWPUiGxKKcJiSwJJNcgDY1LQIJ1GnvgRGgomthoxppsZ1cl7zxIf5CjWggzsbUnADDTq5W4pBXveVnugOBHryqdTylhI4tudeae2jUnswezxtQM1qKG3ezGkM2dN68R7YxpCEfZ2N1nXggUkYdGn6em7veq5G5LpTVrdexn0fSozGbeNfHXS2OLjWGhffcEdGeu1dFKnFxNac6IETbIiVvTjv55wcZI7WBiTA0r60KJkUZYNn59W6XhnAwTk0zCYN2Rq8LraOjHzjXHjcyL9Sk6jw4D9K0wWLsiZHDfTOlnPr9jYp2SesyHlUJsCHPiHOR4fCBVwQMwh5YOddcpl2Kbr6CjSjWabaac

我的 C++ 文件中的代码是:

# include "gwan.h"
# include <iostream>
using namespace std;

int main (int argc, char * argv[])
{
    if(argc)
    {
        cout<<argv[0];
        xbuf_cat(get_reply(argv), argv[0]);
    }
    else
    {
        xbuf_cat(get_reply(argv), "pass something to me to see it on your screen.");
    }

    return 200; 
}

谁能帮我让 GWAN 接受 1000 个或更多字符的查询参数?

【问题讨论】:

    标签: g-wan server-configuration http-request-parameters httpentity


    【解决方案1】:

    G-WAN v4.5+ 的错误是“414: Request URI too large”

    许多生产 HTTP 服务器禁用 PUT/POST Entities 以避免滥用。

    G-WAN 最初使用了略大于 4KiB 的限制,但大多数请求不需要这么大的空间,因此我们让开发者可以自行决定。

    下面的示例(参见entity_size.c 的工作示例)显示了如何从 servlet 修改 G-WAN(服务器全局)PUT/POST Entity 大小限制,但这也可以在 init()main() 调用 connection handler,以及来自 v4.10+ 中可用的 gwan/init.c 脚本:

    u32 *max_entity_size = (int*)get_env(argv, MAX_ENTITY_SIZE);
    *max_entity_size = 200 * 1024; // new size in bytes (200 KiB)
    

    您可以通过在connection handler 中使用 IP 过滤随时更改限制(即使在连接给定用户时)。

    您的 servlet 将决定如何处理实体,以便您可以在磁盘上处理或存储或进行实时处理,请参阅 entity.c 示例。

    除此之外,还有几点需要牢记:

    • 为避免 DoS 攻击让每个人都向您的服务器发送巨大的实体(以 GB 为单位),您可以只扩大授权用户的请求大小;

    • 在处理没有PUT/POST Entity 的请求时,您还可以通过使用xbuf_growto()READ_XBUF 分配更多内存来动态扩大读取缓冲区。

    现在您知道如何接受任何长度的请求了。确保只在需要时才这样做。

    您可能需要检查其他相关值,例如:

      KALIVE_TMO       // time-out in ms for HTTP keep-alives
      REQUEST_TMO      // time-out in ms waiting for request
      MIN_SEND_SPEED   // send rate in bytes/sec (if < close)
      MIN_READ_SPEED   // read rate in bytes/sec (if < close)
    

    所有这些都可以在gwan/init.c 脚本中设置——在任何请求到达服务器之前。这也可以通过 G-WAN 处理程序和 servlet 完成,如上面引用的示例所示。

    【讨论】:

    • 感谢您的回复,吉尔。我在 gwan 目录中找不到 init.c 文件。你能告诉我从哪里可以下载 G-WAN v4.5 吗? gwan.com 网站上提供的最新版本是 v 4.3.14。
    • 如果我没记错的话,init.c 是 v4.10+ 的功能。 G-WAN v4.5 于 2013 年 5 月向注册用户提供,他们目前使用 v4.12。在我们基于 G-WAN 的云服务交付后,G-WAN v5 将于今年晚些时候公开发布。你能接受上面的答案吗?谢谢。
    • 建议的解决方案似乎适用于PUT/POST Entity size limit。我正在尝试使用长查询字符串执行GET。不幸的是,在我当前的用例中 PUT/POST 无法使用。我试过你提到的方法,但没有奏效。这是我的处理程序代码` u32 max_entity_size = (int)get_env(argv, MAX_ENTITY_SIZE); 最大实体大小 = 200 * 1024; // 以字节为单位的新大小 (200 KiB) xbuf_t * xbuf = (int)get_env(argv, READ_XBUF); xbuf_growto(xbuf, 200 * 1024);`
    • 与实体大小不同,READ_XBUF 值无法全局设置(除非所有 HTTP 请求都具有相同的巨大长度,否则这是没有意义的 - 这是不现实的)。因此,您必须在 AFTER_CONNECT(例如通过过滤 IP 或经过身份验证的用户)和/或当 AFTER_READ 状态下的 READ_XBUF 大小超出缓冲区空间时对当前请求执行此操作。如果您对此有任何疑问,请在 G-WAN 网站上给我们发送电子邮件。
    猜你喜欢
    • 2014-01-14
    • 2015-10-15
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多