Added url parsing. Added unittest.

This commit is contained in:
Markus Birth 2015-10-27 15:47:35 +01:00
parent 95a34f7efe
commit 657b658142
2 changed files with 92 additions and 7 deletions

40
http.py
View File

@ -11,15 +11,41 @@ import socket
class HTTP:
def parse_url(self, url):
# Taken from: https://tools.ietf.org/html/rfc3986#appendix-B
re = re.match('^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?', url)
scheme = re.group(2)
hostpart = re.group(4) # user:pass@host:port
uri = re.group(5)
query = re.group(7)
fragment = re.group(9)
re1 = re.match('^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?', url)
scheme = re1.group(2)
hostpart = re1.group(4) # user:pass@host:port
uri = re1.group(5)
query = re1.group(7)
fragment = re1.group(9)
# TODO: Not IPv6 ready!!!
re2 = re.match('^(([^:]+)(:([^@]*))?@)?([^:]+)(:(\d+))?$', hostpart)
#for i in range(0, 10):
# print(str(i) + ': ' + re2.group(i))
username = re2.group(2) or None
password = re2.group(4) or None
hostname = re2.group(5) or None
port = re2.group(7) or None
if port:
port = int(port)
return ParseResult(scheme, hostpart, uri, None, query, fragment, username, password, hostname, port)
def do_request(self, url, payload=False, type="GET"):
# explode url into: protocol, host, port, uri (maybe GET parameters), hash
urlparts = self.parse_url(url)
pass
class ParseResult():
def __init__(self, scheme, netloc, path, params, query, fragment, username, password, hostname, port):
self.scheme = scheme
self.netloc = netloc
self.path = path
self.params = params
self.query = query
self.fragment = fragment
self.username = username
self.password = password
self.hostname = hostname
self.port = port

59
test/test_http.py Executable file
View File

@ -0,0 +1,59 @@
#!/usr/bin/env micropython
import sys
import unittest
sys.path.insert(0, '..')
class TestHttp(unittest.TestCase):
def setUp(self):
import http
self.http = http.HTTP()
def test_parse_url(self):
urlparts = self.http.parse_url('https://user:passwd@example.org:1234/test?x=3&y=4#fragme')
self.assertEqual(urlparts.scheme, 'https')
self.assertEqual(urlparts.hostname, 'example.org')
self.assertEqual(urlparts.path, '/test')
self.assertEqual(urlparts.query, 'x=3&y=4')
self.assertEqual(urlparts.fragment, 'fragme')
self.assertEqual(urlparts.username, 'user')
self.assertEqual(urlparts.password, 'passwd')
self.assertEqual(urlparts.port, 1234)
def test_parse_url2(self):
urlparts = self.http.parse_url('http://example.org/test')
self.assertEqual(urlparts.scheme, 'http')
self.assertEqual(urlparts.hostname, 'example.org')
self.assertEqual(urlparts.path, '/test')
self.assertEqual(urlparts.query, '')
self.assertEqual(urlparts.fragment, '')
self.assertEqual(urlparts.username, None)
self.assertEqual(urlparts.password, None)
self.assertEqual(urlparts.port, None)
def test_parse_url3(self):
urlparts = self.http.parse_url('http://user@example.org/test')
self.assertEqual(urlparts.scheme, 'http')
self.assertEqual(urlparts.hostname, 'example.org')
self.assertEqual(urlparts.path, '/test')
self.assertEqual(urlparts.query, '')
self.assertEqual(urlparts.fragment, '')
self.assertEqual(urlparts.username, 'user')
self.assertEqual(urlparts.password, None)
self.assertEqual(urlparts.port, None)
def test_parse_url4(self):
urlparts = self.http.parse_url('http://example.org:1234/test')
self.assertEqual(urlparts.scheme, 'http')
self.assertEqual(urlparts.hostname, 'example.org')
self.assertEqual(urlparts.path, '/test')
self.assertEqual(urlparts.query, '')
self.assertEqual(urlparts.fragment, '')
self.assertEqual(urlparts.username, None)
self.assertEqual(urlparts.password, None)
self.assertEqual(urlparts.port, 1234)
if __name__ == '__main__':
unittest.main()