1

我正在使用 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 个字符或更多字符的查询参数吗?

4

1 回答 1

0

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

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

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

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

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

您可以通过在connection handler.

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

除此之外,还有几点需要注意:

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

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

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

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

  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 完成,如上面引用的示例所示。

于 2014-06-28T08:33:27.300 回答