0

Jetty に基づいてサーバーをテストする必要があります。このサーバーは独自のプロトコル、HTTP、HTTPS で動作し、最後に SPDY のサポートを開始しました。httplib/に基づくいくつかのストレス テストがあります。http.client各スレッドは同様の URL (クエリ文字列の一部のデータは可変) で開始し、グローバル変数に実行時間を追加し、数秒ごとにいくつかの統計を表示します。コードは次のようになります。

t_start = time.time()
connection.request("GET", path)
resp = connection.getresponse()
t_stop = time.time()
check_response(resp)
QRY_TIMES.append(t_stop - t_start)

httplibネイティブ プロトコルを使用するクライアントはAPI を共有するためconnection、ネイティブ、HTTPConnectionまたはHTTPSConnection.

ここで、モジュールを使用して SPDY テストを追加しspdylayます。しかし、そのインターフェイスは不透明であり、その不透明性をインターフェイスに似たものに変更する方法がわかりませんhttplib。例に基づいてテスト クライアントを作成しましたが、2 番目の引数spdylay.urlfetch()はオブジェクトではなくクラス名ですが、テストで使用する方法がわかりません。on_close()を拡張するクラスのメソッドに既にテストを追加していますspdylay.BaseSPDYStreamHandlerが、他のテストと互換性がありません。それがインスタンスであれば、spdylay.urlfetch()通話の外で使用します。

インターフェイスspydlayに基づいて機能するコードで使用するにはどうすればよいですか?httplib

4

1 に答える 1

0

url私の唯一のアイデアは、がキーでhandlerオブジェクトが値であるグローバル辞書を使用することです。次の理由により、理想的ではありません。

  • 同じクエリを使用すると、url以前の応答が上書きされます
  • handlerグローバル辞書から解放することを忘れがちです

しかし、それはうまくいきます!

import sys
import spdylay

CLIENT_RESULTS = {}


class MyStreamHandler(spdylay.BaseSPDYStreamHandler):
    def __init__(self, url, fetcher):
        super().__init__(url, fetcher)
        self.headers = []
        self.whole_data = []

    def on_header(self, nv):
        self.headers.append(nv)

    def on_data(self, data):
        self.whole_data.append(data)

    def get_response(self, charset='UTF8'):
        return (b''.join(self.whole_data)).decode(charset)

    def on_close(self, status_code):
        CLIENT_RESULTS[self.url] = self


def spdy_simply_get(url):
    spdylay.urlfetch(url, MyStreamHandler)
    data_handler = CLIENT_RESULTS[url]
    result = data_handler.get_response()
    del CLIENT_RESULTS[url]
    return result


if __name__ == '__main__':
    if '--test' in sys.argv:
        spdy_response = spdy_simply_get('https://localhost:8443/test_spdy/get_ver_xml.hdb')

誰かがspdy_simply_get(url)もっとうまくやれることを願っています。

于 2014-01-24T08:04:19.290 に答える