Update tests and fix URI parsing
[electrum-nvc.git] / lib / util.py
index 81892f1..e734341 100644 (file)
@@ -153,49 +153,54 @@ def age(from_date, since_date = None, target_tz=None, include_seconds=False):
         return "over %d years ago" % (round(distance_in_minutes / 525600))
 
 
-
-
 # URL decode
-_ud = re.compile('%([0-9a-hA-H]{2})', re.MULTILINE)
-urldecode = lambda x: _ud.sub(lambda m: chr(int(m.group(1), 16)), x)
+#_ud = re.compile('%([0-9a-hA-H]{2})', re.MULTILINE)
+#urldecode = lambda x: _ud.sub(lambda m: chr(int(m.group(1), 16)), x)
 
-def parse_url(url):
+def parse_URI(uri):
+    import urlparse
+    import urllib
+    import bitcoin
     from decimal import Decimal
-    url = str(url)
-    o = url[8:].split('?')
-    address = o[0]
-    if len(o)>1:
-        params = o[1].split('&')
-    else:
-        params = []
 
-    kv = {}
+    if ':' not in uri:
+        assert bitcoin.is_address(uri)
+        return uri, None, None, None, None
+
+    u = urlparse.urlparse(uri)
+    assert u.scheme == 'bitcoin'
+
+    address = u.path
+    valid_address = bitcoin.is_address(address)
 
-    amount = label = message = signature = identity = ''
-    for p in params:
-        k,v = p.split('=')
-        uv = urldecode(v)
-        if k in kv:
-            raise Exception('Duplicate Keys')
-        kv[k] = uv
+    pq = urlparse.parse_qs(u.query)
+    
+    for k, v in pq.items():
+        if len(v)!=1:
+            raise Exception('Duplicate Key', k)
 
-    if 'amount' in kv:
-        am = kv['amount']
+    amount = label = message = request_url = ''
+    if 'amount' in pq:
+        am = pq['amount'][0]
         m = re.match('([0-9\.]+)X([0-9])', am)
         if m:
             k = int(m.group(2)) - 8
             amount = Decimal(m.group(1)) * pow(  Decimal(10) , k)
         else:
-            amount = Decimal(am)
-    if 'message' in kv:
-        message = kv['message']
-    if 'label' in kv:
-        label = kv['label']
-    if 'signature' in kv:
-        identity, signature = kv['signature'].split(':')
-        url = url.replace('&%s=%s'%('signature',kv['signature']),'')
-
-    return address, amount, label, message, signature, identity, url
+            amount = Decimal(am) * 100000000
+    if 'message' in pq:
+        message = pq['message'][0]
+    if 'label' in pq:
+        label = pq['label'][0]
+    if 'r' in pq:
+        request_url = urllib.quote(pq['r'][0], '/:?')
+        
+    if request_url != '':
+        return address, amount, label, message, request_url
+
+    assert valid_address
+
+    return address, amount, label, message, request_url
 
 
 # Python bug (http://bugs.python.org/issue1927) causes raw_input