使用代理找出哪个响应属于哪个请求
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
我正在为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