收听HTTP响应

时间:2012-09-14 01:07:28

标签: python http

我正在尝试编写一个将在套接字上侦听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()

我有两个问题:

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

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

4 个答案:

答案 0 :(得分:3)

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

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

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

      echo -e 'GET / HTTP/1.1\n\n' | nc localhost 7000
      
  3. 关于术语的说明:您在绑定套接字上侦听的内容是HTTP 请求,用HTTP说法;您发送回连接客户端的是响应

答案 1 :(得分:1)

  

1。有更好的方法吗?

是的,there is

  

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()

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

其中-n是测试期间和服务器之间的连接总数,在-c之后你有apache基准测试会产生的并发连接数,试验这些的不同值,也可以阅读它的手册,你可能会找到更有用的选项,无论你的具体目的是什么