Python 侦听HTTP响应

Python 侦听HTTP响应,python,http,Python,Http,我正在尝试编写一个python应用程序,它将侦听套接字上的HTTP响应。我用这个。这是我的密码: #!/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_INE

我正在尝试编写一个python应用程序,它将侦听套接字上的HTTP响应。我用这个。这是我的密码:

#!/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()
我有两个问题:

  • 这是最好的方法吗?请注意,我不希望发送请求,然后侦听响应。我希望有一个重定向机制,将所有响应重定向到运行此脚本的框
  • 我应该如何测试这个?有没有可以模拟HTTP响应的工具
  • 编辑 我想做的是:我有三个盒子,一个运行Apache,一个运行这个脚本,一个是客户端。当客户端连接到Apache并发送回响应时,我将响应转移到这个框中。所以在这个脚本中,我试图监听HTTP响应

    拓扑结构 以下是我的拓扑结构: 服务器交换机1交换机2盒1和2 最初,box one连接到服务器并发送请求。当第二个交换机接收到来自服务器的响应时,它将其分叉到框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()
    
  • 如果您真的想在TCP套接字级别上运行,那么这是一个非常好的实现。如果您想要更多的抽象,有很多用于python的HTTP服务器包,包括标准库和外部库/框架,如和

  • 要测试HTTP侦听器,有很多选项。您可以用Python编写完整的HTTP客户机测试代码(使用HTTP客户机库,例如),也可以:

    • 将web浏览器指向
      http://localhost:7000
    • telnet
      到本地主机上的端口7000,并键入原始HTTP请求
    • 使用
      nc
      自动执行上述操作,例如:

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

  • 术语说明:用HTTP的说法,您在绑定套接字上监听的是HTTP请求;您发送回连接客户端的是一个响应。

    如果您使用apache作为服务器,将数据重定向到服务器,则可以使用apache基准测试(ab-据我所知,您必须是超级用户才能使用它)来测试它。。。还将帮助评估应用程序对整体性能的影响,例如

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

    其中after-n是测试过程中与服务器建立的连接总数,after-c是apache benchmark将建立的并发连接数,使用这些连接的不同值进行实验,并阅读其手册,无论您的具体目的是什么,您可能会发现更多有用的选项。

    我最终使用了一个原始套接字并直接从中读取数据包。

    我认为TCP抽象级别对我来说很好。我在无限循环中添加了一个
    print p.headers()
    调用,现在它抛出了一个错误
    Transport endpoint not connected
    ,我找不到在
    django
    中模拟响应的方法。这就是您的意思吗?您可能应该传递一个从连接接收的套接字:
    conn,address=s.accept()。。。SocketReader(康涅狄格州)
    。为什么不使用任何现有的http服务器?我不需要服务器,我想要侦听http响应。侦听和接受连接的部分传统上称为服务器。等等,您想要“转移”响应,这意味着阻止它返回到客户端?或者您只是想窃听客户机/服务器通信?不管怎样,这听起来像是中间人的恶作剧。我实际上是在尝试将响应传递给客户机和第三个框。这看起来像是攻击,但这是我需要做的!在问题中添加了拓扑。你能回答一下你是怎么做到的吗,我实际上也在做同样的事情。