Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C G-WAN处理程序重写解决方案_C_Url Rewriting_Handler_Restful Url_G Wan - Fatal编程技术网

C G-WAN处理程序重写解决方案

C G-WAN处理程序重写解决方案,c,url-rewriting,handler,restful-url,g-wan,C,Url Rewriting,Handler,Restful Url,G Wan,这是我的剧本: #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 c

这是我的剧本:

#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);
}
#包括“gwan.h”//G-WAN导出函数
#包括//strstr()
int init(int argc,char*argv[]
{
u32*状态=(u32*)获取环境(argv,美国处理程序状态);
*states=1 ptr,“GET/HTTP/1.1”))
{
xbuf_repl(读取xbuf,“GET/HTTP/1.1”,“GET/?index HTTP/1.1”);
}
其他的
{
如果(strstr(读\u xbuf->ptr,“.c HTTP/1.1”))
{
int*pHTTP_status=(int*)get_env(argv,HTTP_代码);
如果(pHTTP_状态)
*pHTTP_状态=404;
返回255;
}
xbuf_repl(读作“GET/”、“GET/?”;
}
}
返回(255);
}
正如您所理解的,我试图将主页重定向到动态文件“hello.c”。 我还将每个请求重定向到动态目录(不必使用字符“?”),同时防止在url中使用扩展名“.c”

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

首先,尝试避免
*.c
脚本扩展是无用的:默认情况下,G-WAN接受像
/?hello
这样的请求,这些请求会自动重新映射到
/?hello.c

其次,这不是C语言特有的,因为G-WAN允许您定义将使用哪种编程语言(在支持的16种脚本语言中)作为“默认”语言

第三,如果希望避免请求中的“?”字符,还可以定义另一个字符。G-WAN允许您在非保留字符中进行选择,从而可以使用
/'hello
/\u hello
而不是
/?hello.cpp
(请参见下面的所有选项)

而且,所有这些都可以在不为每个请求调用处理程序的情况下完成(因此不会搅动内存):


因此,回到您的问题,您可以使用
/'hello
,而无需进行任何重写。

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

根据脚本,您希望获取所有请求,因此最好使用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);
}
intmain(intargc,char*argv[])
{
xbuf_t*read_xbuf=(xbuf_t*)get_env(argv,read_xbuf);
如果(strncmp(读xbuf->ptr,“GET/”,6)=0)
{
xbuf_repl(读取xbuf,“/”,“/?索引”);
}
其他的
{
int pos=5;//在“GET/”中的“/”之后开始检查
while(pos<20)//只检查前15个字符
{//Adjust取决于最长的servlet名称
if(read_xbuf->ptr[pos]='.&&read_xbuf->ptr[pos+1]='c')//如果请求包含'.'',返回404
{
int*pHTTP_status=(int*)get_env(argv,HTTP_代码);
如果(pHTTP_状态)
*pHTTP_状态=404;
返回255;
}
}
xbuf_repl(读作“GET/”、“GET/?”;
}
返回(255);
}
再次检查“.c”。您只需要检查前N个字符

如果您担心在每个请求中添加“?”会导致内存分配,那么您需要设计servlet名称,以便进行就地替换。下面是一个链接,其中包含如何实现就地更换以获得更好性能的示例


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

此脚本无法处理流水线请求,因为您没有检查该情况。另外,它忽略了HTTP 1.0。下面是一个更简单、更有效的解决方案。我同意你的看法。我的解决方案不是很好,但我不知道该怎么解决我的问题。。。主要是以最好的方式将我的主页(mydomain.com/)重定向到一个动态文件。我检查“.c”字符的存在,以防止访问者知道我正在使用的编程语言(“mondomaine.com/?hello.c”将重定向到404页)。关于“?”这个字,我只想让它从我的访客的角度消失。对我来说,一个完美的地址应该是:“mondomaine.com/hello”,而不是“mondomaine.com/?hello.c”。然后,保留一个“垃圾”字符并进行“就地”重写。这比noving内存块更快、更安全。您的脚本实际上更快、更干净,但正如您所说,主要问题仍然存在(管道无法处理)!不管怎样,你的网站很有趣;)
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);
}