aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libmproxy/console.py50
-rw-r--r--libmproxy/proxy.py14
2 files changed, 49 insertions, 15 deletions
diff --git a/libmproxy/console.py b/libmproxy/console.py
index c47de130..17c14580 100644
--- a/libmproxy/console.py
+++ b/libmproxy/console.py
@@ -403,6 +403,22 @@ class ConnectionView(WWrap):
except IOError, v:
self.master.statusbar.message(v.strerror)
+ def set_url(self, url):
+ request = self.flow.request
+ if not request.set_url(url):
+ return "Invalid URL."
+ self.master.refresh_connection(self.flow)
+
+ def set_resp_code(self, code):
+ response = self.flow.response
+ response.code = code
+ self.master.refresh_connection(self.flow)
+
+ def set_resp_msg(self, msg):
+ response = self.flow.response
+ response.msg = msg
+ self.master.refresh_connection(self.flow)
+
def edit(self, part):
if self.state.view_flow_mode == VIEW_FLOW_REQUEST:
conn = self.flow.request
@@ -419,14 +435,18 @@ class ConnectionView(WWrap):
headers.read(fp)
conn.headers = headers
elif part == "u" and self.state.view_flow_mode == VIEW_FLOW_REQUEST:
- conn = self.flow.request
- url = self._spawn_editor(conn.url())
- url = url.strip()
- if not conn.set_url(url):
- return "Invalid URL."
+ self.master.prompt_edit("URL", conn.url(), self.set_url)
elif part == "m" and self.state.view_flow_mode == VIEW_FLOW_REQUEST:
self.master.prompt_onekey("Method", self.methods, self.edit_method)
- key = None
+ elif part == "c" and self.state.view_flow_mode == VIEW_FLOW_RESPONSE:
+ self.master.prompt_edit("Code", conn.code, self.set_resp_code)
+ elif part == "m" and self.state.view_flow_mode == VIEW_FLOW_RESPONSE:
+ self.master.prompt_edit("Message", conn.msg, self.set_resp_msg)
+ elif part == "r" and self.state.view_flow_mode == VIEW_FLOW_REQUEST:
+ if not conn.acked:
+ response = proxy.Response(conn, "200", "HTTP/1.1", "OK", utils.Headers(), "")
+ conn.ack(response)
+ self.view_response()
self.master.refresh_connection(self.flow)
def _changeview(self, v):
@@ -472,7 +492,8 @@ class ConnectionView(WWrap):
("header", "h"),
("body", "b"),
("url", "u"),
- ("method", "m")
+ ("method", "m"),
+ ("reply", "r")
),
self.edit
)
@@ -480,6 +501,8 @@ class ConnectionView(WWrap):
self.master.prompt_onekey(
"Edit response",
(
+ ("code", "c"),
+ ("message", "m"),
("header", "h"),
("body", "b"),
),
@@ -613,8 +636,8 @@ class ActionBar(WWrap):
def path_prompt(self, prompt, text):
self.w = PathEdit(prompt, text)
- def prompt(self, prompt):
- self.w = urwid.Edit(prompt)
+ def prompt(self, prompt, text = ""):
+ self.w = urwid.Edit(prompt, text)
def message(self, message):
self.w = urwid.Text(message)
@@ -663,8 +686,8 @@ class StatusBar(WWrap):
def path_prompt(self, prompt, text):
return self.ab.path_prompt(prompt, text)
- def prompt(self, prompt):
- return self.ab.prompt(prompt)
+ def prompt(self, prompt, text = ""):
+ self.ab.prompt(prompt, text)
def message(self, msg, expire=None):
if expire:
@@ -1059,6 +1082,11 @@ class ConsoleMaster(controller.Master):
self.view.set_focus("footer")
self.prompting = (callback, args)
+ def prompt_edit(self, prompt, text, callback):
+ self.statusbar.prompt(prompt, text)
+ self.view.set_focus("footer")
+ self.prompting = callback
+
def prompt_onekey(self, prompt, keys, callback):
"""
Keys are a set of (word, key) tuples. The appropriate key in the
diff --git a/libmproxy/proxy.py b/libmproxy/proxy.py
index eefa6905..44bc10e2 100644
--- a/libmproxy/proxy.py
+++ b/libmproxy/proxy.py
@@ -378,11 +378,17 @@ class ProxyHandler(SocketServer.StreamRequestHandler):
if request is None:
self.finish()
return
- server = ServerConnection(request)
- response = server.read_response()
- response = response.send(self.mqueue)
+ if request.is_response():
+ response = request
+ request = False
+ response = response.send(self.mqueue)
+ else:
+ server = ServerConnection(request)
+ response = server.read_response()
+ response = response.send(self.mqueue)
+ if response is None:
+ server.terminate()
if response is None:
- server.terminate()
self.finish()
return
self.send_response(response)