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

标签 python http proxy http-proxy

我正在为 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 字典中的“孤立”请求,尽管如果线程 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

关于python - 使用代理找出哪个响应属于哪个请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28165549/

相关文章:

java - 如何在 Jersey 和 Apache Http 客户端中使用代理身份验证?

python - 为什么使用 scikit-learn 的 GradientBoostingRegressor 从相同的输入中得到不同的输出?

python - Python 和 gettext 的 UTF-8 错误

java - 如何在 JavaFX 8 上禁用按钮事件直到 http 响应

java - Axis HTTP 与 Axis HTTPS 代理设置

internet-explorer - 如何从 IE 获取代理设置?

python - 搁置:无法确定数据库类型

python - 泛型类的类方法

java - 使用传输编码改造客户端和响应 : chunked

apache - 使用 Apache 和 HAProxy 诊断 HTTP 500 错误