【问题标题】:How to detect HTTP Request in python + twisted?如何在 python + twisted 中检测 HTTP 请求?
【发布时间】:2011-03-26 17:35:22
【问题描述】:

我正在使用 python 中的 twisted 10 学习网络编程。在下面的代码中,有没有办法在收到数据时检测 HTTP 请求?还从中检索域名、子域、端口值吗?如果不是http数据就丢弃?

from twisted.internet import stdio, reactor, protocol

from twisted.protocols import basic

import re



class DataForwardingProtocol(protocol.Protocol):

    def _ _init_ _(self):

        self.output = None

        self.normalizeNewlines = False



    def dataReceived(self, data):

        if self.normalizeNewlines:

            data = re.sub(r"(\r\n|\n)", "\r\n", data)

        if self.output:

            self.output.write(data)



class StdioProxyProtocol(DataForwardingProtocol):

    def connectionMade(self):

        inputForwarder = DataForwardingProtocol( )

        inputForwarder.output = self.transport

        inputForwarder.normalizeNewlines = True

        stdioWrapper = stdio.StandardIO(inputForwarder)

        self.output = stdioWrapper

        print "Connected to server.  Press ctrl-C to close connection."



class StdioProxyFactory(protocol.ClientFactory):

    protocol = StdioProxyProtocol



    def clientConnectionLost(self, transport, reason):

        reactor.stop( )



    def clientConnectionFailed(self, transport, reason):

        print reason.getErrorMessage( )

        reactor.stop( )



if __name__ == '_ _main_ _':

    import sys

    if not len(sys.argv) == 3:

        print "Usage: %s host port" % _ _file_ _

        sys.exit(1)



    reactor.connectTCP(sys.argv[1], int(sys.argv[2]), StdioProxyFactory( ))

    reactor.run( )

【问题讨论】:

    标签: python http twisted packet


    【解决方案1】:

    protocol.dataReceived,您正在覆盖它,它的级别太低,无法在没有智能缓冲的情况下用于此目的——根据我刚刚引用的文档,

    在收到数据时调用。

    使用此方法转换为 更高级别的消息。通常,一些 收到后将进行回调 每个完整的协议消息。

    参数

    data
    

    一串 长度不定。请保持在 请注意,您可能需要 缓冲一些数据,作为部分(或 多个)协议消息可能是 已收到!我建议进行单元测试 对于协议调用此 具有不同块大小的方法, 一次减少到一个字节。

    您似乎完全忽略了文档的这一关键部分。

    您可以改用LineReceiver.lineReceived(当然是从protocols.basic.LineReceiver 继承)来利用HTTP 请求进入“行”这一事实——您仍然需要将发送的标头合并为多行,因为this tutorial 说:

    以空格开头的标题行或 标签实际上是前一个的一部分 标题行,折叠成多个 便于阅读的线条。

    一旦你有一个很好的格式化/解析响应(考虑研究twisted.web's sources,看看可以做到的一种方法),

    检索域名、子域、端口 从中获得价值?

    现在Host 标头(cfr the RFC 第 14.23 节)是包含此信息的标头。

    【讨论】:

    • 感谢亚历克斯的回复。您的回答对像我这样的新手非常有用。我会参与其中:)
    • 没问题,我实际上花了很多时间来解决类似的问题并让扭曲的 HTTP 代理自己工作。一旦你弄明白它是非常光滑的。
    【解决方案2】:

    仅基于您似乎正在尝试的内容,我认为以下将是阻力最小的路径: http://twistedmatrix.com/documents/10.0.0/api/twisted.web.proxy.html

    这是构建 HTTP 代理的扭曲类。它会让你拦截请求,查看目的地并查看发送者。您还可以查看所有标题和来回显示的内容。您似乎正在尝试重新编写 twisted 已经为您提供的 HTTP 协议和代理类。我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-20
      • 1970-01-01
      相关资源
      最近更新 更多