【问题标题】:Figuring out which response belongs to which request using proxpy使用代理找出哪个响应属于哪个请求
【发布时间】:2015-01-27 07:48:01
【问题描述】:

我正在为 proxpy 编写一个插件(您不需要熟悉它来回答这个问题)。这基本上是一个 HTTP/HTTPS 代理。您可以通过实现两个函数来扩展它,其参数分别是 HTTP 请求和响应。像这样的:

method1(request):  
    #your implementation

method2(response):  
    #your implementation

我想简单地将请求和响应写入以下格式的文件。

Request 1  
Response of request 1  
Request 2  
Response of request 2.  
#etc

但是,请求和响应可能不一定按顺序排列,因此它们的写法如下:

Request 1  
Request 2  
Response of request 2  
Request 3  
Response of request 3  
Response of request 2  

所以,本质上,我要做的是找出每个响应对应的请求。

【问题讨论】:

    标签: python http proxy http-proxy


    【解决方案1】:

    您可以尝试以下代码,它将每个请求存储在由线程 ID 键入的字典中,然后使用相同的线程 ID 匹配响应。这依赖于 proxpy 为每个请求和响应对使用单独的工作线程这一事实(这需要了解 proxpy 实现!)。

    请注意,在插件代码之外引发的异常将导致 sent 字典中的“孤立”请求,尽管如果重复使用线程 ID(如实践中所观察到的那样),这可能不是这样的问题。

    此外,此插件的输出将记录成对的请求和响应,但顺序将是接收响应的顺序,不一定是发送的顺序。

    import threading
    
    lock = threading.Lock()
    sent = {}
    req_seq = 0
    
    def proxy_mangle_request(req):
        global req_seq
        lock.acquire()
        req_seq += 1
        thread_id = threading.current_thread().ident
    #    print "thread id = {}".format(thread_id)
        req.seq = req_seq
        sent[thread_id] = req
        lock.release()
    
        return req
    
    def proxy_mangle_response(res):
        thread_id = threading.current_thread().ident
    #    print "Got response for thread_id {}".format(thread_id)
        print "Request: {}".format(sent[thread_id].seq)
        lock.acquire()
        del sent[thread_id]
        lock.release()
    
        print "Response: {}".format(res)
        return res
    

    【讨论】:

    • 感谢@mhawke,这是一个非常聪明的解决方案。在收到您的回复之前,我对 proxpy 实现进行了一些更改,以将 req 作为参数添加到 proxy_mangle_response 方法。所以现在定义看起来像def proxy_mangle_response(res, req) 为此,我不得不在 core.py 中更改委托方法的定义以将 req 作为参数。除了这需要更改 proxpy 本身的实现这一事实之外,您是否发现这种方法有任何明显的缺陷?是的,熟悉 proxpy 显然有帮助。 :)
    • 您根本不应该更改proxpy。当模块被维护者更新并且您想要更新时会发生什么?您将需要维护一个补丁版本,这很快就会变得令人厌烦。另一方面,您可以向proxpy 作者提出您的更改(也将请求传递给响应处理程序),因为它可能有用。
    • 再次感谢@mhawke。我想我会做出你提议的改变。
    • 只有一件事@mhawke,req 对象没有任何变量seq。那么你如何为这个变量分配 req_seq 的值呢?
    • 在请求处理程序中:req.seq = req_seq。这会在 req 对象中创建一个新属性,然后在响应处理程序中访问该属性。
    猜你喜欢
    • 2019-08-17
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 2021-02-16
    相关资源
    最近更新 更多