Added url parsing. Added unittest.
This commit is contained in:
parent
95a34f7efe
commit
657b658142
40
http.py
40
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
|
||||
|
59
test/test_http.py
Executable file
59
test/test_http.py
Executable 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()
|
Loading…
x
Reference in New Issue
Block a user