aboutsummaryrefslogtreecommitdiffstats
path: root/libmproxy
diff options
context:
space:
mode:
authorAldo Cortesi <aldo@corte.si>2013-01-28 13:28:49 -0800
committerAldo Cortesi <aldo@corte.si>2013-01-28 13:28:49 -0800
commit6f157d936f89a50927849611bdff3f1e8e1bb43b (patch)
tree91c04333f033de24debb75dc01189aff9025593d /libmproxy
parenta74ca40660a0796fbcc5494bfab31e46c3cec4d6 (diff)
parent330fbfe8cc54449b3e7c0fe8305b13f29b47c15c (diff)
downloadmitmproxy-6f157d936f89a50927849611bdff3f1e8e1bb43b.tar.gz
mitmproxy-6f157d936f89a50927849611bdff3f1e8e1bb43b.tar.bz2
mitmproxy-6f157d936f89a50927849611bdff3f1e8e1bb43b.zip
Merge pull request #99 from rouli/master
Adding helper functions to make HAR export easier
Diffstat (limited to 'libmproxy')
-rw-r--r--libmproxy/flow.py59
1 files changed, 59 insertions, 0 deletions
diff --git a/libmproxy/flow.py b/libmproxy/flow.py
index 2c4c5513..9238cfbf 100644
--- a/libmproxy/flow.py
+++ b/libmproxy/flow.py
@@ -197,6 +197,16 @@ class decoded(object):
class HTTPMsg(controller.Msg):
+ def get_decoded_content(self):
+ """
+ Returns the decoded content based on the current Content-Encoding header.
+ Doesn't change the message iteself or its headers.
+ """
+ ce = self.headers.get_first("content-encoding")
+ if not self.content or ce not in encoding.ENCODINGS:
+ return self.content
+ return encoding.decode(ce, self.content)
+
def decode(self):
"""
Decodes content based on the current Content-Encoding header, then
@@ -232,7 +242,15 @@ class HTTPMsg(controller.Msg):
else:
return hl
+ def get_content_type(self):
+ return self.headers.get_first("content-type")
+ def get_transmitted_size(self):
+ # FIXME: this is inprecise in case chunking is used
+ # (we should count the chunking headers)
+ if not self.content:
+ return 0
+ return len(self.content)
class Request(HTTPMsg):
"""
@@ -459,6 +477,28 @@ class Request(HTTPMsg):
self.scheme, self.host, self.port, self.path = parts
return True
+ def get_cookies(self):
+ cookie_headers = self.headers.get("cookie")
+ if not cookie_headers:
+ return None
+
+ cookies = []
+ for header in cookie_headers:
+ pairs = [pair.partition("=") for pair in header.split(';')]
+ cookies.extend((pair[0],(pair[2],{})) for pair in pairs)
+ return dict(cookies)
+
+ def get_header_size(self):
+ FMT = '%s %s HTTP/%s.%s\r\n%s\r\n'
+ assembled_header = FMT % (
+ self.method,
+ self.path,
+ self.httpversion[0],
+ self.httpversion[1],
+ str(self.headers)
+ )
+ return len(assembled_header)
+
def _assemble_head(self, proxy=False):
FMT = '%s %s HTTP/%s.%s\r\n%s\r\n'
FMT_PROXY = '%s %s://%s:%s%s HTTP/%s.%s\r\n%s\r\n'
@@ -713,6 +753,25 @@ class Response(HTTPMsg):
c += self.headers.replace(pattern, repl, *args, **kwargs)
return c
+ def get_header_size(self):
+ FMT = '%s\r\n%s\r\n'
+ proto = "HTTP/%s.%s %s %s"%(self.httpversion[0], self.httpversion[1], self.code, str(self.msg))
+ assembled_header = FMT % (proto, str(self.headers))
+ return len(assembled_header)
+
+ def get_cookies(self):
+ cookie_headers = self.headers.get("set-cookie")
+ if not cookie_headers:
+ return None
+
+ cookies = []
+ for header in cookie_headers:
+ pairs = [pair.partition("=") for pair in header.split(';')]
+ cookie_name = pairs[0][0] # the key of the first key/value pairs
+ cookie_value = pairs[0][2] # the value of the first key/value pairs
+ cookie_parameters = {key.strip().lower():value.strip() for key,sep,value in pairs[1:]}
+ cookies.append((cookie_name, (cookie_value, cookie_parameters)))
+ return dict(cookies)
class ClientDisconnect(controller.Msg):
"""