我正在做重寫URL並用圍攻進行測試,我遇到了一個問題。在連接處理程序的兩個不同的調用中的相同的指針地址
有時,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
要得到這個問題,我使用攻城從其他服務器不同的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
}
我同意這不是最好的主意,但這是我的項目的要求,我不能決定它!除非你有更好的方式去做,否則我將無法使用gwan。 – gdevillepin
鑑於此處理程序的性質(處理所有請求),我會要求G-WAN團隊幫助您編寫可用的優化版本,使您更容易專注於應用程序本身。 – Gil