mitmproxy: Замените ответ повторно отправленным запросом

#python #mitmproxy

#питон #mitmproxy

Вопрос:

Я пытаюсь заменить ответ в mitmproxy результатом повторной отправки того же запроса снова. Это мой текущий сценарий:

 from mitmproxy import http from mitmproxy import ctx  import requests import re  class ReplaceToken:   nextToken = ""   def response(self, flow: http.HTTPFlow):   m = re.search('localhost.local:8085/test/index.php/(. ?)" method=', str(flow.response.content))  if m:  self.nextToken = m.group(1)  ctx.log.info("Next token: "   self.nextToken)    m = re.search('Wrong token!lt;brgt;', str(flow.response.content))  if m:    flow = flow.copy()  request = flow.request.copy()    ctx.log.info("Found wrong token! Resend request with correct token...")  request.path = re.sub("/[^/]*$", "/"   self.nextToken, flow.request.path)    playback = ctx.master.addons.get('clientplayback')  flow.request = request    playback.start_replay([flow])  addons = [ReplaceToken()]  

В ответе я хочу обнаружить условие ошибки (например, неправильный токен CSRF). Если это условие присутствует, я хочу повторно отправить запрос с правильным маркером, дождаться правильного ответа и заменить исходные данные ответа на правильные.

Однако в приведенном выше сценарии ответ не заменяется. И правильный запрос делается только в mitmprox внутренне.

Возможным обходным путем было бы использовать $random-http-lib для выполнения HTTP-запроса в обход mitmproxy. Например, следующий PoC:

 import requests def response(self, flow: http.HTTPFlow):  r = requests.get("http://www.example.com")  ctx.log.info(r.text)  flow.response.text = r.text  

Однако для этого потребуется вручную «скопировать» каждый аспект из исходного запроса (метод HTTP, путь, заголовки, тело и т. Д.) Во внешнюю библиотеку HTTP, чего я хотел бы избежать.

Есть ли какой-либо способ добиться этого, используя только саму mitmproxy?