From b13acd7956f2e09bf5f9001f8f55d018a381f6c2 Mon Sep 17 00:00:00 2001 From: Maximilian Hils Date: Sat, 26 Sep 2015 01:23:59 +0200 Subject: adjust to netlib request changes + docs --- libmproxy/console/common.py | 2 +- libmproxy/dump.py | 6 ++++- libmproxy/flow.py | 2 +- libmproxy/models/http.py | 65 +++++++++++++-------------------------------- 4 files changed, 25 insertions(+), 50 deletions(-) (limited to 'libmproxy') diff --git a/libmproxy/console/common.py b/libmproxy/console/common.py index 4a2310c9..48cb0f87 100644 --- a/libmproxy/console/common.py +++ b/libmproxy/console/common.py @@ -390,7 +390,7 @@ def format_flow(f, focus, extended=False, hostheader=False, padding=2, req_timestamp = f.request.timestamp_start, req_is_replay = f.request.is_replay, req_method = f.request.method, - req_url = f.request.pretty_url(hostheader=hostheader), + req_url = f.request.pretty_url if hostheader else f.request.url, err_msg = f.error.msg if f.error else None, resp_code = f.response.status_code if f.response else None, diff --git a/libmproxy/dump.py b/libmproxy/dump.py index 3915d4c8..43af953c 100644 --- a/libmproxy/dump.py +++ b/libmproxy/dump.py @@ -241,7 +241,11 @@ class DumpMaster(flow.FlowMaster): DELETE="red" ).get(method.upper(), "magenta") method = click.style(method, fg=method_color, bold=True) - url = click.style(flow.request.pretty_url(self.showhost), bold=True) + if self.showhost: + url = flow.request.pretty_url + else: + url = flow.request.url + url = click.style(url, bold=True) line = "{stickycookie}{client} {method} {url}".format( stickycookie=stickycookie, diff --git a/libmproxy/flow.py b/libmproxy/flow.py index 7d51b6d1..55a4dbcf 100644 --- a/libmproxy/flow.py +++ b/libmproxy/flow.py @@ -252,7 +252,7 @@ class ServerPlaybackState: ] if not self.ignore_content: - form_contents = r.get_form() + form_contents = r.urlencoded_form or r.multipart_form if self.ignore_payload_params and form_contents: key.extend( p for p in form_contents diff --git a/libmproxy/models/http.py b/libmproxy/models/http.py index 5a83cb46..101df7e6 100644 --- a/libmproxy/models/http.py +++ b/libmproxy/models/http.py @@ -6,9 +6,8 @@ import time from libmproxy import utils from netlib import encoding -from netlib.http import status_codes, Headers, Request, Response, CONTENT_MISSING +from netlib.http import status_codes, Headers, Request, Response, CONTENT_MISSING, decoded from netlib.tcp import Address -from netlib.utils import native from .. import version, stateobject from .flow import Flow @@ -17,7 +16,6 @@ class MessageMixin(stateobject.StateObject): _stateobject_attributes = dict( http_version=bytes, headers=Headers, - body=bytes, timestamp_start=float, timestamp_end=float ) @@ -74,6 +72,9 @@ class MessageMixin(stateobject.StateObject): def copy(self): c = copy.copy(self) + if hasattr(self, "data"): # FIXME remove condition + c.data = copy.copy(self.data) + c.headers = self.headers.copy() return c @@ -147,7 +148,7 @@ class HTTPRequest(MessageMixin, Request): def __init__( self, - form_in, + first_line_format, method, scheme, host, @@ -155,14 +156,14 @@ class HTTPRequest(MessageMixin, Request): path, http_version, headers, - body, + content, timestamp_start=None, timestamp_end=None, form_out=None, ): Request.__init__( self, - form_in, + first_line_format, method, scheme, host, @@ -170,11 +171,11 @@ class HTTPRequest(MessageMixin, Request): path, http_version, headers, - body, + content, timestamp_start, timestamp_end, ) - self.form_out = form_out or form_in + self.form_out = form_out or first_line_format # FIXME remove # Have this request's cookies been modified by sticky cookies or auth? self.stickycookie = False @@ -185,7 +186,8 @@ class HTTPRequest(MessageMixin, Request): _stateobject_attributes = MessageMixin._stateobject_attributes.copy() _stateobject_attributes.update( - form_in=str, + content=bytes, + first_line_format=str, method=bytes, scheme=bytes, host=bytes, @@ -225,7 +227,7 @@ class HTTPRequest(MessageMixin, Request): @classmethod def wrap(self, request): req = HTTPRequest( - form_in=request.form_in, + first_line_format=request.form_in, method=request.method, scheme=request.scheme, host=request.host, @@ -233,7 +235,7 @@ class HTTPRequest(MessageMixin, Request): path=request.path, http_version=request.http_version, headers=request.headers, - body=request.body, + content=request.content, timestamp_start=request.timestamp_start, timestamp_end=request.timestamp_end, form_out=(request.form_out if hasattr(request, 'form_out') else None), @@ -311,6 +313,7 @@ class HTTPResponse(MessageMixin, Response): _stateobject_attributes = MessageMixin._stateobject_attributes.copy() _stateobject_attributes.update( + body=bytes, status_code=int, msg=bytes ) @@ -400,22 +403,20 @@ class HTTPResponse(MessageMixin, Response): class HTTPFlow(Flow): """ A HTTPFlow is a collection of objects representing a single HTTP - transaction. The main attributes are: + transaction. + Attributes: request: HTTPRequest object response: HTTPResponse object error: Error object server_conn: ServerConnection object client_conn: ClientConnection object + intercepted: Is this flow currently being intercepted? + live: Does this flow have a live client connection? Note that it's possible for a Flow to have both a response and an error object. This might happen, for instance, when a response was received from the server, but there was an error sending it back to the client. - - The following additional attributes are exposed: - - intercepted: Is this flow currently being intercepted? - live: Does this flow have a live client connection? """ def __init__(self, client_conn, server_conn, live=None): @@ -485,36 +486,6 @@ class HTTPFlow(Flow): return c -class decoded(object): - """ - A context manager that decodes a request or response, and then - re-encodes it with the same encoding after execution of the block. - - Example: - with decoded(request): - request.content = request.content.replace("foo", "bar") - """ - - def __init__(self, o): - self.o = o - ce = o.headers.get("content-encoding") - if ce: - ce = native(ce, "ascii", "ignore") - if ce in encoding.ENCODINGS: - self.ce = ce - else: - self.ce = None - - def __enter__(self): - if self.ce: - if not self.o.decode(): - self.ce = None - - def __exit__(self, type, value, tb): - if self.ce: - self.o.encode(self.ce) - - def make_error_response(status_code, message, headers=None): response = status_codes.RESPONSES.get(status_code, "Unknown") body = """ -- cgit v1.2.3