Do pre-processing of requests before replay.

This enables scripts, anticache, server playback and sticky cookies for
request replays.
This commit is contained in:
Aldo Cortesi 2011-03-15 15:11:03 +13:00
parent fe1e2f16ff
commit fb28e71f0b
3 changed files with 39 additions and 33 deletions

View File

@ -163,7 +163,7 @@ class ConnectionItem(WWrap):
self.master.statusbar.message("Can't delete connection mid-intercept.") self.master.statusbar.message("Can't delete connection mid-intercept.")
self.master.sync_list_view() self.master.sync_list_view()
elif key == "r": elif key == "r":
r = self.state.replay_request(self.flow, self.master.masterq) r = self.master.replay_request(self.flow)
if r: if r:
self.master.statusbar.message(r) self.master.statusbar.message(r)
self.master.sync_list_view() self.master.sync_list_view()
@ -478,7 +478,7 @@ class ConnectionView(WWrap):
elif key == "p": elif key == "p":
self.master.view_prev_flow(self.flow) self.master.view_prev_flow(self.flow)
elif key == "r": elif key == "r":
r = self.state.replay_request(self.flow, self.master.masterq) r = self.master.replay_request(self.flow)
if r: if r:
self.master.statusbar.message(r) self.master.statusbar.message(r)
self.master.refresh_connection(self.flow) self.master.refresh_connection(self.flow)

View File

@ -62,7 +62,7 @@ class ClientPlaybackState:
self.current = master.handle_request(n.request) self.current = master.handle_request(n.request)
if not testing and not self.current.response: if not testing and not self.current.response:
#begin nocover #begin nocover
master.state.replay_request(self.current, master.masterq) master.replay_request(self.current)
#end nocover #end nocover
elif self.current.response: elif self.current.response:
master.handle_response(self.current.response) master.handle_response(self.current.response)
@ -421,23 +421,6 @@ class State:
def revert(self, f): def revert(self, f):
f.revert() f.revert()
def replay_request(self, f, masterq):
"""
Returns None if successful, or error message if not.
"""
#begin nocover
if f.intercepting:
return "Can't replay while intercepting..."
if f.request:
f.backup()
f.request.set_replay()
if f.request.content:
f.request.headers["content-length"] = [str(len(f.request.content))]
f.response = None
f.error = None
rt = RequestReplayThread(f, masterq)
rt.start()
#end nocover
class FlowMaster(controller.Master): class FlowMaster(controller.Master):
@ -526,6 +509,40 @@ class FlowMaster(controller.Master):
controller.Master.tick(self, q) controller.Master.tick(self, q)
def process_new_request(self, f):
if self.stickycookie_state:
self.stickycookie_state.handle_request(f)
if "request" in self.scripts:
self._runscript(f, self.scripts["request"])
if self.anticache:
f.request.anticache()
if self.server_playback:
pb = self.do_server_playback(f)
if not pb:
if self.kill_nonreplay:
f.kill(self)
else:
f.request.ack()
def replay_request(self, f):
"""
Returns None if successful, or error message if not.
"""
#begin nocover
if f.intercepting:
return "Can't replay while intercepting..."
if f.request:
f.backup()
f.request.set_replay()
if f.request.content:
f.request.headers["content-length"] = [str(len(f.request.content))]
f.response = None
f.error = None
self.process_new_request(f)
rt = RequestReplayThread(f, self.masterq)
rt.start()
#end nocover
def handle_clientconnect(self, r): def handle_clientconnect(self, r):
self.state.clientconnect(r) self.state.clientconnect(r)
r.ack() r.ack()
@ -543,19 +560,7 @@ class FlowMaster(controller.Master):
def handle_request(self, r): def handle_request(self, r):
f = self.state.add_request(r) f = self.state.add_request(r)
if self.stickycookie_state: self.process_new_request(f)
self.stickycookie_state.handle_request(f)
if "request" in self.scripts:
self._runscript(f, self.scripts["request"])
if self.anticache:
r.anticache()
if self.server_playback:
pb = self.do_server_playback(f)
if not pb:
if self.kill_nonreplay:
f.kill(self)
else:
r.ack()
return f return f
def handle_response(self, r): def handle_response(self, r):

View File

@ -102,6 +102,7 @@ class uformat_flow(libpry.AutoTree):
f.backup() f.backup()
f.request.set_replay() f.request.set_replay()
f.response.set_replay()
assert ('method', '[replay]') in console.format_flow(f, True) assert ('method', '[replay]') in console.format_flow(f, True)
assert ('method', '[replay]') in console.format_flow(f, True, True) assert ('method', '[replay]') in console.format_flow(f, True, True)