gpt4 book ai didi

c - G-WAN handler重写方案

转载 作者:行者123 更新时间:2023-12-04 12:32:32 29 4
gpt4 key购买 nike

这是我的脚本:

#include "gwan.h" // G-WAN exported functions
#include <string.h> // strstr()

int init(int argc, char *argv[])
{
u32 *states = (u32*)get_env(argv, US_HANDLER_STATES);
*states = 1 << HDL_AFTER_READ;
return 0;
}

void clean(int argc, char *argv[])
{}

int main(int argc, char *argv[])
{
if((long)argv[0] == HDL_AFTER_READ)
{
xbuf_t *read_xbuf = (xbuf_t*)get_env(argv, READ_XBUF);
if(strstr(read_xbuf->ptr, "GET / HTTP/1.1"))
{
xbuf_repl(read_xbuf, "GET / HTTP/1.1", "GET /?index HTTP/1.1");
}
else
{
if(strstr(read_xbuf->ptr, ".c HTTP/1.1"))
{
int *pHTTP_status = (int*)get_env(argv, HTTP_CODE);
if(pHTTP_status)
*pHTTP_status = 404;
return 255;
}
xbuf_repl(read_xbuf, "GET /", "GET /?");
}
}
return(255);
}

正如您可能理解的那样,我正在尝试将主页重定向到动态文件“hello.c”。我还将每个请求重定向到动态目录(无需使用字符“?”),同时防止在 url 中使用扩展名“.c”。

此脚本部分有效,但显然会导致内存分配问题。您有什么解决方案可以提出吗?

最佳答案

如果您担心性能,请不要使用 strstr。它将在整个请求中搜索匹配项。

根据您的脚本,您希望所有请求都是 GET,因此最好使用 strncmp,因为您只比较前 6 个字符。

int main(int argc, char *argv[])
{
xbuf_t *read_xbuf = (xbuf_t*)get_env(argv, READ_XBUF);
if(strncmp(read_xbuf->ptr, "GET / ", 6) == 0)
{
xbuf_repl(read_xbuf, " / ", " /?index ");
}
else
{
int pos = 5; // Start checking after '/' in "GET /"
while(pos < 20) // Only check first 15 characters
{ // Adjust depend on longest servlet name
if(read_xbuf->ptr[pos] == '.' && read_xbuf->ptr[pos+1] == 'c') // If request contains '.' return 404
{
int *pHTTP_status = (int*)get_env(argv, HTTP_CODE);
if(pHTTP_status)
*pHTTP_status = 404;
return 255;
}
}
xbuf_repl(read_xbuf, "GET /", "GET /?");
}
return(255);
}

再次检查“.c”。您只想检查前 N 个字符。

如果你担心加'?'引起的内存分配问题对于您需要设计您的 servlet 名称的每个请求,以便可以进行就地替换。这是一个链接,其中包含有关如何实现就地替换以获得更好性能的示例。

RESTful URIs in G-WAN

我没有测试过上面的代码,所以它可能不起作用,但至少你会知道如何去做。此外,该脚本不处理流水线请求。

关于c - G-WAN handler重写方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15398849/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com