2

ソケットで HTTP 応答をリッスンする Python アプリケーションを作成しようとしています。これにはhttp-parserを使用しています。これが私のコードです:

#!/usr/bin/env python
import socket

from http_parser.http import HttpStream
from http_parser.reader import SocketReader

from http_parser.util import b

def main():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((socket.gethostname(), 7000))
    s.listen(5)
    try:
        while True:
            p = HttpStream(SocketReader(s))
    finally:
        s.close()

if __name__ == "__main__":
    main()

2 つの質問があります。

  1. これはこれを行うための最良の方法ですか?リクエストを送信してからレスポンスをリッスンしたくないことに注意してください。このスクリプトを実行しているボックスにすべての応答をリダイレクトするリダイレクト メカニズムが必要です。
  2. これをどのようにテストすればよいですか?HTTP 応答をモックできるツールはありますか?

編集 私がやろうとしているのはこれです.3つのボックスがあり、Apacheを一度実行し、1つはこのスクリプトを実行し、もう1つはクライアントです。クライアントが Apache に接続して応答を返すと、このボックスに応答を転送しています。したがって、このスクリプトでは、HTTP 応答をリッスンしようとしています。

トポロジ ここに私のトポロジがあります: サーバー <----> スイッチ 1 <-----> スイッチ 2 <-----> ボックス 1 と 2 最初に、ボックス 1 がサーバーに接続し、要求を送信します。2 番目のスイッチがサーバーから応答を受信すると、それをボックス 1 とボックス 2 の両方にフォークします。

4

4 に答える 4

3
  1. 本当に TCP ソケットのレベルで操作したい場合、これは完全に優れた実装です。さらに抽象化が必要な場合は、標準ライブラリの やtornadocherrypyBaseHttpServerなどの外部ライブラリ/フレームワークを含む、Python 用の HTTP サーバー パッケージがたくさんあります。

  2. HTTP リスナーをテストするには、多くのオプションがあります。完全な HTTP クライアント テスト コードを Python で ( のような HTTP クライアント ライブラリを使用してurllib) 記述することも、次のこともできます。

    • Web ブラウザでhttp://localhost:7000
    • telnetlocalhost で 7000 をポートし、生​​の HTTP 要求を入力します。
    • を使用して上記を自動化しますnc。例:

      echo -e 'GET / HTTP/1.1\n\n' | nc localhost 7000
      

用語に関する注意: バインドされたソケットでリッスンしているものは、HTTP 用語ではHTTP requestです。接続しているクライアントに送り返すのはresponseです。

于 2012-09-14T01:58:51.403 に答える
1

1. より良い方法はありますか?

はい、あります

2. これをどのようにテストすればよいですか?

一般的な方法は、test.py を同じフォルダーに置き、python test.py を実行してテストすることです。サンプルコード:

#!python
# -*- coding: utf-8 -*-
import optparse
import urllib2
from django.utils import unittest

# just a sample of settings
HOST = 'localhost'

class GIOPTest(unittest.TestCase):
    def test_basic(self):
        #TEST GOES HERE

if __name__ == '__main__':
    # This part is to accept command line parameters
    option_list = ( # check optparse help for more options
        make_option("--host",
                action = 'store',
                type    = 'string',
                dest    = 'host',
                default = 'localhost',
                help    = 'Server host (localhost by default)'
            ),
    )

    parser = OptionParser(option_list=option_list)
    options, args = parser.parse_args()
    HOST = options.host

    # run the test
    unittest.main()
于 2012-09-14T01:28:58.927 に答える
1

結局、生のソケットを使用して、そこからパケットを直接読み取ることになりました。

于 2012-10-01T03:11:44.503 に答える
0

データをリダイレクトするサーバーとしてApacheを使用している場合は、Apacheベンチマークを使用できます(ab-私の知る限り、それを使用するにはスーパーユーザーである必要があります)テストする...パフォーマンスの評価にも役立ちますアプリケーションが全体に与える影響、例

 ab -n 500 -c 20 http://localhost:7000/

ここで、-n の後はテスト中にサーバーに対して行われた接続の総数であり、-c の後は apache ベンチマークが行う同時接続の数です。これらのさまざまな値を試してみてください。マニュアルも読んでください。より役立つ場合があります。特定の目的が何であれ、オプション

于 2012-09-16T23:34:20.927 に答える