1

squidのキャッシュを消去しようとしていますが、そのためには奇妙な http 要求を実行する必要があります。

リクエストは次のようになります。

PURGE www.cached:port/params HTTP/1.1

wherewww.cached:port/paramsは、キャッシュから削除する値を表します。

興味深いことに、接続は squid サーバーに対してではなく、squid サーバーに対して開く必要がありますwww.cached:port/params

したがって、シーケンス全体は次のようになります。

  1. squid サーバーへの接続を開きます。
  2. パスPURGEリクエスト。
  3. 結果を読み取ります。
  4. 近い

私はApache httpclientを試しました。request メソッドを書き直して send にすることはできますPURGEが、ライブラリは常に http 要求で渡す同じホストに対して接続を開き ( への接続を開きwww.cached、 を実行しますPURGE www.cached)、それは私にとってはうまくいきません。

純粋なソケットを使用してそれを行うことができますが、うまく機能するライブラリを見つけるのは素晴らしいことです.

4

1 に答える 1

0

まず、Apache HttpClient でこれを実行できない理由がわかりません。「http.route.default-proxy」パラメーターを使用して、プロキシ経由でリクエストを実行するようにクライアントを構成しましたか?

とにかく、下位のコンポーネントを使用してもかまわない場合は、これが Apache HttpCore (ブロッキング) で同じことができる方法です。

    HttpProcessor httpproc = new ImmutableHttpProcessor(new HttpRequestInterceptor[] {
            new RequestContent(),
            new RequestTargetHost(),
            new RequestConnControl(),
            new RequestUserAgent()});

    HttpRequestExecutor httpexecutor = new HttpRequestExecutor();
    ConnectionReuseStrategy connStrategy = new DefaultConnectionReuseStrategy();

    HttpContext context = new BasicHttpContext();
    HttpHost target = new HttpHost("www.cached", port);
    HttpHost proxy = new HttpHost("squid", 8080);

    HttpParams params = new BasicHttpParams();
    HttpRequest request = new BasicHttpRequest("PURGE", "www.cached:port/params");

    DefaultHttpClientConnection conn = new DefaultHttpClientConnection();
    try {
        if (!conn.isOpen()) {
            Socket socket = new Socket(proxy.getHostName(), proxy.getPort());
            conn.bind(socket, params);
        }
        context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn);
        context.setAttribute(ExecutionContext.HTTP_TARGET_HOST, target);

        httpexecutor.preProcess(request, httpproc, context);
        HttpResponse response = httpexecutor.execute(request, conn, context);
        httpexecutor.postProcess(response, httpproc, context);

        // do something useful with the response

        if (!connStrategy.keepAlive(response, context)) {
            conn.close();
        } else {
            // Connection could be kept alive
        }
    } finally {
        conn.close();
    }
}

同じことが他のHTTPライブラリでも非常に実行可能であると確信しています

于 2012-11-15T09:31:28.733 に答える