Url rewriting 在两个不同的连接处理程序调用中使用相同的指针地址

Url rewriting 在两个不同的连接处理程序调用中使用相同的指针地址,url-rewriting,g-wan,Url Rewriting,G Wan,我正在重写url并用Sakege进行测试,但我遇到了一个问题 有时,gwan在处理程序连接中对主函数的2次调用使用相同的地址。 为了在两个调用之间产生差异,我使用一个带rand()的整数 在下面的示例中,我们发现两个电话的相同地址非常接近 init 1412811699 : buff 0x10d3760 -> GET /imagesproduitnew-100018-imagesgallery/BIG-1.jpg HTTP/1.1 init 687109171 : buff 0x10d3

我正在重写url并用Sakege进行测试,但我遇到了一个问题

有时,gwan在处理程序连接中对主函数的2次调用使用相同的地址。 为了在两个调用之间产生差异,我使用一个带rand()的整数

在下面的示例中,我们发现两个电话的相同地址非常接近

init 1412811699 : buff 0x10d3760 -> GET /imagesproduitnew-100018-imagesgallery/BIG-1.jpg HTTP/1.1

init 687109171 : buff 0x10d3760 -> GET /imagesproduitnew-100018-imagesgallery/BIG-1.jpg HTTP/1.1

regex OK 1412811699 : buff 0x10d3760 -> GET /imagesproduitnew-100018-imagesgallery/BIG-1.jpg HTTP/1.1

extarctPart 1412811699 : buff 0x10d3760 -> GET /imagesproduitnew-100018-imagesgallery/BIG-1.jpg HTTP/1.1

regex OK 687109171 : buff 0x10d3760 -> GET /imagesproduitnew-100018-imagesgallery/BIG-1.jpg HTTP/1.1

rewriteJPG 1412811699 : buff 0x10d3760 -> GET /imagesproduitnew-100018-imagesgallery/BIG-1.jpg HTTP/1.1

xbufreplace 1412811699 : buff 0x10d3760 -> GET /imagesproduitnew/imagesgallery/BIG/100018.jpg HTTP/1.1

-- HERE buffer is changed by the previous step because both have the same address -- 
extarctPart 687109171 : buff 0x10d3760 -> GET /imagesproduitnew/imagesgallery/BIG/100018.jpg HTTP/1.1
为了解决这个问题,我使用了另一台服务器提供的不同URL列表

谢谢你的帮助


我需要重写URL: /-100018 imagesgallery/BIG-1.jpg必须发送到文件/imagesproduitnew/imagesgallery/BIG/100018.jpg

我的代码:

int main(int argc, char *argv[])
{
  const long state = (long)argv[0];
  if(state == HDL_AFTER_READ)
  {
    int test = rand();

    xbuf_t *read_xbuf = (xbuf_t*)get_env(argv, READ_XBUF);
    printf ("init %i : buff %p -> %s\n", test, read_xbuf->ptr, read_xbuf->ptr);


    //function to test if URL needs to be rewrite
    if(regexRewriteJPG(read_xbuf->ptr) == 0){
      printf ("regex OK %i : buff %p -> %s\n", test, read_xbuf->ptr, read_xbuf->ptr);

      char *URL;
      char *newURL;
      //extractPart, extract the URL from buffer (/imagesproduitnew-100018-imagesgallery/BIG-1.jpg for exemple)
      URL = extractPart(read_xbuf->ptr, str_regexJPG);
      printf ("extarctPart %i : buff %p -> %s\n", test, read_xbuf->ptr, read_xbuf->ptr);
      if(URL){
        //rewriteJPG return the reel path of the file (/imagesproduitnew/imagesgallery/BIG/100018.jpg for exemple)
        newURL = rewriteJPG(URL);
        printf ("rewriteJPG %i : buff %p -> %s\n", test, read_xbuf->ptr, read_xbuf->ptr);
        if(newURL){
          xbuf_repl(read_xbuf, URL, newURL);
          printf ("xbufreplace %i : buff %p -> %s\n", test, read_xbuf->ptr, read_xbuf->ptr);
          free(newURL);
        }
        else{
          printf("newURL is NULL\n");
        }
        free(URL);
      }
      else{
        printf("URL is NULL\n");
      }
    }
    printf ("END %i : buff %p -> %s\n", test, read_xbuf->ptr, read_xbuf->ptr);
  }
return 255; // execute next connection 
}
自定义处理程序变量的
printf()
转储肯定有意义。。。一旦有人可以访问处理程序的源代码

如果“处理程序连接中主函数的2次调用的相同地址”是指
READ\u XBUF
地址,请记住:

  • G-WAN内部缓冲区被动态地重新使用以处理请求(它们在连接的生命周期内不会被连接)

  • printf()
    将显示连续(以及并发)连接

  • 在处理程序中每个处理步骤的开始和停止计时之前,使用计时器不会让您知道请求是并发的还是顺序的

这可以解释在您的情况下地址是相同的

更一般地说,在描述问题时,请尝试说明:

  • 您正在使用的输入(数据示例)
  • 你想做什么(简短描述)
  • 你是如何尝试的(源代码)
  • 您没有得到的预期输出
  • 您获得的输出
  • 这将有助于其他人回答您的问题。

    printf()
    转储自定义处理程序的变量肯定有意义。。。一旦有人可以访问处理程序的源代码

    如果“处理程序连接中主函数的2次调用的相同地址”是指
    READ\u XBUF
    地址,请记住:

    • G-WAN内部缓冲区被动态地重新使用以处理请求(它们在连接的生命周期内不会被连接)

    • printf()
      将显示连续(以及并发)连接

    • 在处理程序中每个处理步骤的开始和停止计时之前,使用计时器不会让您知道请求是并发的还是顺序的

    这可以解释在您的情况下地址是相同的

    更一般地说,在描述问题时,请尝试说明:

  • 您正在使用的输入(数据示例)
  • 你想做什么(简短描述)
  • 你是如何尝试的(源代码)
  • 您没有得到的预期输出
  • 您获得的输出

  • 这将帮助其他人回答您的问题。

    只是一句话,但您的URL映射:

    /-100018-imagesgallery/BIG-1.jpg 
    
    …的逻辑性和RESTFUL性低于文件系统目标:

    /imagesproduitnew/imagesgallery/BIG/100018.jpg
    
    …因为它打破了资源的层次结构

    此外,使用文件系统映射可以避免使用速度较慢的正则表达式库

    我并不是说你“做错了”,我只是指出有很多方法可以实现你的目标,而不必解决这个不直观的URI映射所产生的问题

    如果您确实需要在URI中反转
    “100018”
    “imagesgallery”
    ,则无需使用正则表达式即可轻松快速地完成

    如果此URI映射旨在隐藏资源的实际路径,则使用类似以下URI的内容:

    /imagesproduitnew/imagesgallery/BIG/100018.jpg 
    
    由处理程序进行如下修改:

    /imagesproduitnew/imagesgallery/BIG/957345.jpg 
    
    转换可以通过一个非常简单的操作完成,比如XORing资源名


    这就是为什么在尝试做不一定是最佳解决方案的事情之前,质疑初始目标是一个好主意。

    只是一句话,但你的URL映射:

    /-100018-imagesgallery/BIG-1.jpg 
    
    …的逻辑性和RESTFUL性低于文件系统目标:

    /imagesproduitnew/imagesgallery/BIG/100018.jpg
    
    …因为它打破了资源的层次结构

    此外,使用文件系统映射可以避免使用速度较慢的正则表达式库

    我并不是说你“做错了”,我只是指出有很多方法可以实现你的目标,而不必解决这个不直观的URI映射所产生的问题

    如果您确实需要在URI中反转
    “100018”
    “imagesgallery”
    ,则无需使用正则表达式即可轻松快速地完成

    如果此URI映射旨在隐藏资源的实际路径,则使用类似以下URI的内容:

    /imagesproduitnew/imagesgallery/BIG/100018.jpg 
    
    由处理程序进行如下修改:

    /imagesproduitnew/imagesgallery/BIG/957345.jpg 
    
    转换可以通过一个非常简单的操作完成,比如XORing资源名


    这就是为什么在尝试做一些不一定是最佳解决方案的事情之前,质疑初始目标是一个好主意。

    我同意这不是最好的主意,但这是我的项目的要求,我无法决定!除非你有更好的方法,否则我将无法使用gwan。鉴于此处理程序的性质(满足所有请求),我会要求G-WAN团队帮助你编写一个优化版本,使你更容易专注于应用程序本身。我同意这不是最好的主意,但这是我项目的一个要求,我不能决定!除非您有更好的方法,否则我将无法使用gwan。鉴于此处理程序的性质(满足所有请求),我将要求G-WAN团队帮助您编写一个优化版本,使您更容易专注于应用程序本身。