2012-11-30 37 views
1

我正在做重寫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 
} 

回答

2

printf()轉儲自定義處理程序中的變量的肯定意義......一旦人進入你的手柄r的源代碼。

如果「相同的地址2呼叫處理連接主要功能的」你的意思是READ_XBUF地址,然後記住:

  • G-WAN內部緩衝區被再次使用導通即時處理請求(它們在連接的生命週期中不附加)。

  • printf()將顯示連續(以及併發)連接使用定時器不會讓你知道,如果請求是同時或順序,直到時間的每一個處理步驟的開始和停止

  • 在處理程序中。

這可能會解釋您的情況下地址是相同的。

更一般地,describbing問題時,儘量狀態:

  1. 輸入您正在使用(數據爲例)
  2. 你想做的事(簡短描述)
  3. 你是怎麼想做到這一點(源代碼)
  4. 預期的輸出,你沒有得到
  5. 你取而代之的輸出。

這將幫助他人回答您的問題。

2

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

/-100018-imagesgallery/BIG-1.jpg 

...是較少的邏輯,比你的文件系統的目標少RESTFUL:

/imagesproduitnew/imagesgallery/BIG/100018.jpg 

...因爲它打破的分級你的資源。

此外,使用文件系統映射會爲您節省使用緩慢RegEx庫的障礙。

我並不是說你是「做錯了」,我只是表示有很多方法可以實現你的目標,而不必解決這個不直觀的URI映射所產生的問題。

如果你真的需要反轉"100018""imagesgallery"的URI,那麼你可以做到這一點更容易和更快,而無需使用正則表達式。

如果此URI的映射是針對hidding真實路徑的資源,然後使用類似下面的URI:

/imagesproduitnew/imagesgallery/BIG/100018.jpg 

由處理程序修改如下:

/imagesproduitnew/imagesgallery/BIG/957345.jpg 

轉化可通過一個非常簡單的操作(如XORing資源名稱)來完成in-place

這就是爲什麼在試圖做某件事情之前質疑初始目標是個好主意,而這並不一定是最好的解決方案。

+0

我同意這不是最好的主意,但這是我的項目的要求,我不能決定它!除非你有更好的方式去做,否則我將無法使用gwan。 – gdevillepin

+0

鑑於此處理程序的性質(處理所有請求),我會要求G-WAN團隊幫助您編寫可用的優化版本,使您更容易專注於應用程序本身。 – Gil

相關問題