1

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

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

在下面的示例中,我们发现 2 个调用的相同地址非常接近......

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

为了解决这个问题,我使用来自其他服务器的 siege 以及不同 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 
}
4

2 回答 2

2

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

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

  • G-WAN 内部缓冲区在运行中被重新使用以处理请求(它们在连接的生命周期内不附加)。

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

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

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

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

  1. 您正在使用的输入(数据示例)
  2. 你想做什么(简短描述)
  3. 你是怎么做的(源代码)
  4. 您没有得到的预期输出
  5. 您获得的输出。

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

于 2012-11-30T15:39:58.477 回答
2

只是备注,但您的 URL 映射:

/-100018-imagesgallery/BIG-1.jpg 

...比您的文件系统目标更少逻辑和更少 RESTFUL:

/imagesproduitnew/imagesgallery/BIG/100018.jpg

...因为它破坏了资源的层次结构。

此外,使用文件系统映射将为您节省求助于缓慢的 RegEx 库的障碍。

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

如果您确实需要在 URI 中进行反转"100018""imagesgallery"那么您可以在不使用 RegEx 的情况下更轻松、更快地完成它。

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

/imagesproduitnew/imagesgallery/BIG/100018.jpg 

由处理程序修改如下:

/imagesproduitnew/imagesgallery/BIG/957345.jpg 

转换可以通过一个非常简单的操作就地完成,比如对资源名称进行异或。

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

于 2012-12-01T10:55:51.270 回答