使用代理找出哪个响应属于哪个请求

Figuring out which response belongs to which request using proxpy

我正在为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  

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

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

请注意,在插件代码之外引发的异常将导致 sent 字典中的 "orphaned" 请求,尽管如果重复使用线程 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