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:
|
class HTTP:
|
||||||
def parse_url(self, url):
|
def parse_url(self, url):
|
||||||
# Taken from: https://tools.ietf.org/html/rfc3986#appendix-B
|
# Taken from: https://tools.ietf.org/html/rfc3986#appendix-B
|
||||||
re = re.match('^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?', url)
|
re1 = re.match('^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?', url)
|
||||||
scheme = re.group(2)
|
scheme = re1.group(2)
|
||||||
hostpart = re.group(4) # user:pass@host:port
|
hostpart = re1.group(4) # user:pass@host:port
|
||||||
uri = re.group(5)
|
uri = re1.group(5)
|
||||||
query = re.group(7)
|
query = re1.group(7)
|
||||||
fragment = re.group(9)
|
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"):
|
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
|
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