diff --git a/http.py b/http.py index db18826..ac5bdf2 100644 --- a/http.py +++ b/http.py @@ -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 diff --git a/test/test_http.py b/test/test_http.py new file mode 100755 index 0000000..4fe1a52 --- /dev/null +++ b/test/test_http.py @@ -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()