From bb80acbd0ceb6333da8a1cace1655968b9f17403 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Sun, 6 Nov 2011 20:56:22 +0100 Subject: [PATCH] Added some URL manipulation functions to wrw.proto. --- wrw/proto.py | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/wrw/proto.py b/wrw/proto.py index 62d1769..6b43396 100644 --- a/wrw/proto.py +++ b/wrw/proto.py @@ -39,6 +39,56 @@ def urlq(url): ret += c return ret +class urlerror(ValueError): + pass + +def parseurl(url): + p = url.find("://") + if p < 0: + raise urlerror("Protocol not found in absolute URL `%s'" % url) + proto = url[:p] + l = url.find("/", p + 3) + if l < 0: + raise urlerror("Local part not found in absolute URL `%s'" % url) + host = url[p + 3:l] + local = url[l:] + q = local.find("?") + if q < 0: + query = "" + else: + query = local[q + 1:] + local = local[:q] + return proto, host, local, query + +def consurl(proto, host, local, query = ""): + if len(local) < 1 and local[0] != '/': + raise urlerror("Local part of URL must begin with a slash") + ret = "%s://%s%s" % (proto, host, local) + if len(query) > 0: + ret += "?" + query + return ret + +def appendurl(url, other): + if "://" in other: + return other + proto, host, local, query = parseurl(url) + if len(other) > 0 and other[0] == '/': + return consurl(proto, host, other) + else: + p = local.rfind('/') + return consurl(proto, host, local[:p + 1] + other) + +def requrl(req): + host = req.ihead.get("Host", None) + if host is None: + raise Exception("Could not reconstruct URL because no Host header was sent") + proto = "http" + if req.https: + proto = "https" + if req.uri[0] != '/': + raise Exception("Malformed local part when reconstructing URL") + return "%s://%s%s" % (proto, host, req.uri) + def parstring(pars = {}, **augment): buf = "" for key in pars: -- 2.11.0