diff options
Diffstat (limited to 'libmproxy/utils.py')
-rw-r--r-- | libmproxy/utils.py | 144 |
1 files changed, 26 insertions, 118 deletions
diff --git a/libmproxy/utils.py b/libmproxy/utils.py index ff56aa13..c9a8fd29 100644 --- a/libmproxy/utils.py +++ b/libmproxy/utils.py @@ -12,8 +12,8 @@ # # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. -import re, os, subprocess, datetime, textwrap -import time, functools, copy, cgi +import re, os, subprocess, datetime, urlparse, string +import time, functools, copy, cgi, textwrap import json CERT_SLEEP_TIME = 1 @@ -151,122 +151,6 @@ def del_all(dict, keys): del dict[key] -class Headers: - def __init__(self, lst=None): - if lst: - self.lst = lst - else: - self.lst = [] - - def _kconv(self, s): - return s.lower() - - def __eq__(self, other): - return self.lst == other.lst - - def __getitem__(self, k): - ret = [] - k = self._kconv(k) - for i in self.lst: - if self._kconv(i[0]) == k: - ret.append(i[1]) - return ret - - def _filter_lst(self, k, lst): - new = [] - for i in lst: - if self._kconv(i[0]) != k: - new.append(i) - return new - - def __setitem__(self, k, hdrs): - k = self._kconv(k) - new = self._filter_lst(k, self.lst) - for i in hdrs: - new.append((k, i)) - self.lst = new - - def __delitem__(self, k): - self.lst = self._filter_lst(k, self.lst) - - def __contains__(self, k): - for i in self.lst: - if self._kconv(i[0]) == k: - return True - return False - - def add(self, key, value): - self.lst.append([key, str(value)]) - - def get_state(self): - return [tuple(i) for i in self.lst] - - @classmethod - def from_state(klass, state): - return klass([list(i) for i in state]) - - def copy(self): - lst = copy.deepcopy(self.lst) - return Headers(lst) - - def __repr__(self): - """ - Returns a string containing a formatted header string. - """ - headerElements = [] - for itm in self.lst: - headerElements.append(itm[0] + ": " + itm[1]) - headerElements.append("") - return "\r\n".join(headerElements) - - def match_re(self, expr): - """ - Match the regular expression against each header (key, value) pair. - """ - for k, v in self.lst: - s = "%s: %s"%(k, v) - if re.search(expr, s): - return True - return False - - def read(self, fp): - """ - Read a set of headers from a file pointer. Stop once a blank line - is reached. - """ - ret = [] - name = '' - while 1: - line = fp.readline() - if not line or line == '\r\n' or line == '\n': - break - if line[0] in ' \t': - # continued header - ret[-1][1] = ret[-1][1] + '\r\n ' + line.strip() - else: - i = line.find(':') - # We're being liberal in what we accept, here. - if i > 0: - name = line[:i] - value = line[i+1:].strip() - ret.append([name, value]) - self.lst = ret - - def replace(self, pattern, repl, *args, **kwargs): - """ - Replaces a regular expression pattern with repl in both header keys - and values. Returns the number of replacements made. - """ - nlst, count = [], 0 - for i in self.lst: - k, c = re.subn(pattern, repl, i[0], *args, **kwargs) - count += c - v, c = re.subn(pattern, repl, i[1], *args, **kwargs) - count += c - nlst.append([k, v]) - self.lst = nlst - return count - def pretty_size(size): suffixes = [ @@ -499,3 +383,27 @@ class LRUCache: cache.pop(d) return ret return wrap + + +def parse_url(url): + """ + Returns a (scheme, host, port, path) tuple, or None on error. + """ + scheme, netloc, path, params, query, fragment = urlparse.urlparse(url) + if not scheme: + return None + if ':' in netloc: + host, port = string.split(netloc, ':') + port = int(port) + else: + host = netloc + if scheme == "https": + port = 443 + else: + port = 80 + path = urlparse.urlunparse(('', '', path, params, query, fragment)) + if not path.startswith("/"): + path = "/" + path + return scheme, host, port, path + + |