2

我正在尝试编写一个 python 应用程序来侦听套接字上的 HTTP 响应。我为此使用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()

我有两个问题:

  1. 这是最好的方法吗?请注意,我不想发送请求然后收听响应。我想要一个重定向机制,将所有响应重定向到运行此脚本的框。
  2. 我应该如何测试这个?有没有可以模拟 HTTP 响应的工具?

编辑 我想要做的是:我有三个盒子,一旦运行 Apache,一个运行这个脚本,一个是客户端。当客户端连接到 Apache 并发送回响应时,我将响应转移到此框。所以在这个脚本中,我试图监听 HTTP 响应。

拓扑 这是我的拓扑: 服务器 <----> 交换机一 <-----> 交换机二 <-----> 框一和二 最初,框一连接到服务器并发送请求。当第二个交换机接收到来自服务器的响应时,它会将其分叉到框一和框二。

4

4 回答 4

3
  1. 如果您真的想在 TCP 套接字级别进行操作,那么这是一个非常好的实现。如果你想要更多的抽象,有很多很多用于 python 的 HTTP 服务器包,包括标准库BaseHttpServer,以及外部库/框架,如tornadocherrypy

  2. 要测试您的 HTTP 侦听器,有很多选项。您可以在 Python 中编写完整的 HTTP 客户端测试代码(使用类似的 HTTP 客户端库urllib),或者您可以:

    • 将您的网络浏览器指向http://localhost:7000
    • telnet到 localhost 上的端口 7000 并输入原始 HTTP 请求。
    • 通过使用自动执行上述操作nc,例如:

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

关于术语的注释:您在绑定套接字上监听的是 HTTP请求,用 HTTP 的说法;您发送回连接客户端的是响应

于 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 回答