diff options
| author | Rouli <rouli.net@gmail.com> | 2013-01-28 17:37:25 +0200 | 
|---|---|---|
| committer | Rouli <rouli.net@gmail.com> | 2013-01-28 17:37:25 +0200 | 
| commit | 330fbfe8cc54449b3e7c0fe8305b13f29b47c15c (patch) | |
| tree | 3e18b2cad965d75357119fe2ef0d4420c38130c2 /libmproxy | |
| parent | 1e0bab65e3131829560383d147a192e0912c2fe9 (diff) | |
| download | mitmproxy-330fbfe8cc54449b3e7c0fe8305b13f29b47c15c.tar.gz mitmproxy-330fbfe8cc54449b3e7c0fe8305b13f29b47c15c.tar.bz2 mitmproxy-330fbfe8cc54449b3e7c0fe8305b13f29b47c15c.zip  | |
adding helper functions to make HAR export easier
Diffstat (limited to 'libmproxy')
| -rw-r--r-- | libmproxy/flow.py | 59 | 
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):      """  | 
