def put(self, flow_id): flow = self.flow flow.backup() try: for a, b in self.json.items(): if a == "request" and hasattr(flow, "request"): request = flow.request for k, v in b.items(): if k in [ "method", "scheme", "host", "path", "http_version" ]: setattr(request, k, str(v)) elif k == "port": request.port = int(v) elif k == "headers": request.headers.clear() for header in v: request.headers.add(*header) elif k == "content": request.text = v else: raise APIError( 400, "Unknown update request.{}: {}".format(k, v)) elif a == "response" and hasattr(flow, "response"): response = flow.response for k, v in b.items(): if k in ["msg", "http_version"]: setattr(response, k, str(v)) elif k == "code": response.status_code = int(v) elif k == "headers": response.headers.clear() for header in v: response.headers.add(*header) elif k == "content": response.text = v else: raise APIError( 400, "Unknown update response.{}: {}".format(k, v)) else: raise APIError(400, "Unknown update {}: {}".format(a, b)) except APIError: flow.revert() raise self.view.update(flow)
def edit_focus(self, part: str) -> None: """ Edit a component of the currently focused flow. """ flow = self.master.view.focus.flow # This shouldn't be necessary once this command is "console.edit @focus", # but for now it is. if not flow: raise exceptions.CommandError("No flow selected.") flow.backup() require_dummy_response = ( part in ("response-headers", "response-body", "set-cookies") and flow.response is None ) if require_dummy_response: flow.response = http.HTTPResponse.make() if part == "cookies": self.master.switch_view("edit_focus_cookies") elif part == "form": self.master.switch_view("edit_focus_form") elif part == "path": self.master.switch_view("edit_focus_path") elif part == "query": self.master.switch_view("edit_focus_query") elif part == "request-headers": self.master.switch_view("edit_focus_request_headers") elif part == "response-headers": self.master.switch_view("edit_focus_response_headers") elif part in ("request-body", "response-body"): if part == "request-body": message = flow.request else: message = flow.response c = self.master.spawn_editor(message.get_content(strict=False) or b"") # Fix an issue caused by some editors when editing a # request/response body. Many editors make it hard to save a # file without a terminating newline on the last line. When # editing message bodies, this can cause problems. For now, I # just strip the newlines off the end of the body when we return # from an editor. message.content = c.rstrip(b"\n") elif part == "set-cookies": self.master.switch_view("edit_focus_setcookies") elif part in ["url", "method", "status_code", "reason"]: self.master.commands.execute( "console.command flow.set @focus %s " % part )
def edit_focus(self, part: str) -> None: """ Edit a component of the currently focused flow. """ flow = self.master.view.focus.flow # This shouldn't be necessary once this command is "console.edit @focus", # but for now it is. if not flow: raise exceptions.CommandError("No flow selected.") flow.backup() require_dummy_response = ( part in ("response-headers", "response-body", "set-cookies") and flow.response is None ) if require_dummy_response: flow.response = http.HTTPResponse.make() if part == "cookies": self.master.switch_view("edit_focus_cookies") elif part == "form": self.master.switch_view("edit_focus_form") elif part == "path": self.master.switch_view("edit_focus_path") elif part == "query": self.master.switch_view("edit_focus_query") elif part == "request-headers": self.master.switch_view("edit_focus_request_headers") elif part == "response-headers": self.master.switch_view("edit_focus_response_headers") elif part in ("request-body", "response-body"): if part == "request-body": message = flow.request else: message = flow.response c = self.master.spawn_editor(message.get_content(strict=False) or b"") # Fix an issue caused by some editors when editing a # request/response body. Many editors make it hard to save a # file without a terminating newline on the last line. When # editing message bodies, this can cause problems. For now, I # just strip the newlines off the end of the body when we return # from an editor. message.content = c.rstrip(b"\n") elif part == "set-cookies": self.master.switch_view("edit_focus_setcookies") elif part in ["url", "method", "status_code", "reason"]: self.master.commands.call( "console.command flow.set @focus %s " % part )
def put(self, flow_id): flow = self.flow flow.backup() for a, b in self.json.items(): if a == "request" and hasattr(flow, "request"): request = flow.request for k, v in b.items(): if k in [ "method", "scheme", "host", "path", "http_version" ]: setattr(request, k, str(v)) elif k == "port": request.port = int(v) elif k == "headers": request.headers.clear() for header in v: request.headers.add(*header) elif k == "content": request.text = v else: print("Warning: Unknown update {}.{}: {}".format( a, k, v)) elif a == "response" and hasattr(flow, "response"): response = flow.response for k, v in b.items(): if k == "msg": response.msg = str(v) elif k == "code": response.status_code = int(v) elif k == "http_version": response.http_version = str(v) elif k == "headers": response.headers.clear() for header in v: response.headers.add(*header) elif k == "content": response.text = v else: print("Warning: Unknown update {}.{}: {}".format( a, k, v)) else: print("Warning: Unknown update {}: {}".format(a, b)) self.view.update(flow)
def put(self, flow_id): flow = self.flow flow.backup() try: for a, b in self.json.items(): if a == "request" and hasattr(flow, "request"): request = flow.request for k, v in b.items(): if k in ["method", "scheme", "host", "path", "http_version"]: setattr(request, k, str(v)) elif k == "port": request.port = int(v) elif k == "headers": request.headers.clear() for header in v: request.headers.add(*header) elif k == "content": request.text = v else: raise APIError(400, "Unknown update request.{}: {}".format(k, v)) elif a == "response" and hasattr(flow, "response"): response = flow.response for k, v in b.items(): if k in ["msg", "http_version"]: setattr(response, k, str(v)) elif k == "code": response.status_code = int(v) elif k == "headers": response.headers.clear() for header in v: response.headers.add(*header) elif k == "content": response.text = v else: raise APIError(400, "Unknown update response.{}: {}".format(k, v)) else: raise APIError(400, "Unknown update {}: {}".format(a, b)) except APIError: flow.revert() raise self.view.update([flow])
def put(self, flow_id): flow = self.flow flow.backup() for a, b in self.json.items(): if a == "request" and hasattr(flow, "request"): request = flow.request for k, v in b.items(): if k in ["method", "scheme", "host", "path", "http_version"]: setattr(request, k, str(v)) elif k == "port": request.port = int(v) elif k == "headers": request.headers.clear() for header in v: request.headers.add(*header) elif k == "content": request.text = v else: print("Warning: Unknown update {}.{}: {}".format(a, k, v)) elif a == "response" and hasattr(flow, "response"): response = flow.response for k, v in b.items(): if k == "msg": response.msg = str(v) elif k == "code": response.status_code = int(v) elif k == "http_version": response.http_version = str(v) elif k == "headers": response.headers.clear() for header in v: response.headers.add(*header) elif k == "content": response.text = v else: print("Warning: Unknown update {}.{}: {}".format(a, k, v)) else: print("Warning: Unknown update {}: {}".format(a, b)) self.view.update(flow)
def edit_focus(self, flow_part: str) -> None: """ Edit a component of the currently focused flow. """ flow = self.master.view.focus.flow # This shouldn't be necessary once this command is "console.edit @focus", # but for now it is. if not flow: raise exceptions.CommandError("No flow selected.") flow.backup() require_dummy_response = ( flow_part in ("response-headers", "response-body", "set-cookies") and flow.response is None ) if require_dummy_response: flow.response = http.Response.make() if flow_part == "cookies": self.master.switch_view("edit_focus_cookies") elif flow_part == "urlencoded form": self.master.switch_view("edit_focus_urlencoded_form") elif flow_part == "multipart form": self.master.switch_view("edit_focus_multipart_form") elif flow_part == "path": self.master.switch_view("edit_focus_path") elif flow_part == "query": self.master.switch_view("edit_focus_query") elif flow_part == "request-headers": self.master.switch_view("edit_focus_request_headers") elif flow_part == "response-headers": self.master.switch_view("edit_focus_response_headers") elif flow_part in ("request-body", "response-body"): if flow_part == "request-body": message = flow.request else: message = flow.response c = self.master.spawn_editor(message.get_content(strict=False) or b"") # Many editors make it hard to save a file without a terminating # newline on the last line. When editing message bodies, this can # cause problems. We strip trailing newlines by default, but this # behavior is configurable. if self.master.options.console_strip_trailing_newlines: message.content = c.rstrip(b"\n") else: message.content = c elif flow_part == "set-cookies": self.master.switch_view("edit_focus_setcookies") elif flow_part == "url": url = flow.request.url.encode() edited_url = self.master.spawn_editor(url) url = edited_url.rstrip(b"\n") flow.request.url = url.decode() elif flow_part in ["method", "status_code", "reason"]: self.master.commands.call_strings( "console.command", ["flow.set", "@focus", flow_part] ) elif flow_part == "tcp-message": message = flow.messages[-1] c = self.master.spawn_editor(message.content or b"") message.content = c.rstrip(b"\n")
def put(self, flow_id): flow: mitmproxy.flow.Flow = self.flow flow.backup() try: for a, b in self.json.items(): if a == "request" and hasattr(flow, "request"): request: mitmproxy.http.Request = flow.request for k, v in b.items(): if k in [ "method", "scheme", "host", "path", "http_version" ]: setattr(request, k, str(v)) elif k == "port": request.port = int(v) elif k == "headers": request.headers.clear() for header in v: request.headers.add(*header) elif k == "trailers": if request.trailers is not None: request.trailers.clear() else: request.trailers = mitmproxy.http.Headers() for trailer in v: request.trailers.add(*trailer) elif k == "content": request.text = v else: raise APIError(400, f"Unknown update request.{k}: {v}") elif a == "response" and hasattr(flow, "response"): response: mitmproxy.http.Response = flow.response for k, v in b.items(): if k in ["msg", "http_version"]: setattr(response, k, str(v)) elif k == "code": response.status_code = int(v) elif k == "headers": response.headers.clear() for header in v: response.headers.add(*header) elif k == "trailers": if response.trailers is not None: response.trailers.clear() else: response.trailers = mitmproxy.http.Headers() for trailer in v: response.trailers.add(*trailer) elif k == "content": response.text = v else: raise APIError( 400, f"Unknown update response.{k}: {v}") elif a == "marked": flow.marked = b else: raise APIError(400, f"Unknown update {a}: {b}") except APIError: flow.revert() raise self.view.update([flow])