1

URLを書き換えて包囲でテストしていますが、1つの問題がありました。

gwan は、ハンドラー接続でメイン関数の 2 回の呼び出しに同じアドレスを使用する場合があります。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 のリストを使用して siege を使用します。

ご協力いただきありがとうございます


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

ただの発言ですが、あなたの URL マッピング:

/-100018-imagesgallery/BIG-1.jpg 

...ファイルシステムターゲットよりもロジックが少なく、RESTFUL が少ない:

/imagesproduitnew/imagesgallery/BIG/100018.jpg

...リソースの階層構造が崩れるためです。

さらに、ファイルシステム マッピングを使用すると、低速の RegEx ライブラリに頼るハードルを節約できます。

「やり方が間違っている」と言っているのではなく、この直感的でない URI マッピングによって作成された問題を解決せずに目標を達成する方法がたくさんあることを示しているだけです。

本当に"100018"URIを反転する必要がある場合"imagesgallery"は、RegEx を使用しなくても、はるかに簡単かつ迅速に行うことができます。

この URI マッピングが、リソースへの実際の PATH を隠すことを目的としている場合は、次のような URI を使用します。

/imagesproduitnew/imagesgallery/BIG/100018.jpg 

次のようにハンドラーによって変更されます。

/imagesproduitnew/imagesgallery/BIG/957345.jpg 

変換は、リソース名の XOR などの非常に単純な操作でインプレースで実行できます。

これが、必ずしも最善の解決策ではない何かをしようとする前に、最初の目標を疑問視することが良い考えである理由です.

于 2012-12-01T10:55:51.270 に答える
2

printf()カスタム ハンドラーの変数のこのダンプは確かに理にかなっています... ハンドラーのソース コードにアクセスできるようになると。

ハンドラー接続でのメイン関数の2回の呼び出しで同じアドレス」とは、アドレスを意味する場合、次のREAD_XBUFことに注意してください。

  • G-WAN の内部バッファーは、要求を処理するためにオンザフライで再利用されます (接続の存続期間中は接続されません)。

  • printf()連続した(および同時の)接続を表示します

  • タイマーを使用しても、ハンドラー内の各処理ステップの開始と停止の時間を計るまで、リクエストが同時か順次かはわかりません。

これは、あなたの場合、アドレスが同じであることを説明している可能性があります。

より一般的には、問題を説明するときは、次のように述べてください。

  1. 使用している入力 (データ例)
  2. やりたいこと(簡単な説明)
  3. どのようにしようとしていますか(ソースコード)
  4. 得られない期待される出力
  5. 代わりに得られる出力。

これは、他の人があなたの質問に答えるのに役立ちます。

于 2012-11-30T15:39:58.477 に答える