Merge pull request #336 from scott-hand/py3http
Python 3 support for bytes in and out of http module classes
diff --git a/README.md b/README.md
index 0505b8d..4978720 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,6 @@
[![coveralls](http://img.shields.io/coveralls/kbandla/dpkt.svg)](https://coveralls.io/r/kbandla/dpkt)
[![landscape](https://landscape.io/github/kbandla/dpkt/master/landscape.svg)](https://landscape.io/github/kbandla/dpkt/master)
[![version](http://img.shields.io/pypi/v/dpkt.svg)](https://pypi.python.org/pypi/dpkt)
-[![downloads](https://img.shields.io/pypi/dm/dpkt.svg)](https://pypi.python.org/pypi/dpkt)
[![wheel](https://img.shields.io/pypi/wheel/dpkt.svg)](https://pypi.python.org/pypi/dpkt)
[![supported-versions](https://img.shields.io/pypi/pyversions/dpkt.svg)](https://pypi.python.org/pypi/dpkt)
diff --git a/README.rst b/README.rst
index b4e1b96..2a414cd 100644
--- a/README.rst
+++ b/README.rst
@@ -3,8 +3,8 @@
dpkt
====
-| |travis| |coveralls| |landscape| |downloads|
-| |version| |wheel| |supported-versions| |supported-implementations|
+| |travis| |coveralls| |landscape| |version|
+| |wheel| |supported-versions| |supported-implementations|
.. |travis| image:: http://img.shields.io/travis/kbandla/dpkt.svg
:alt: Travis-CI Build Status
@@ -22,10 +22,6 @@
:alt: PyPI Package latest release
:target: https://pypi.python.org/pypi/dpkt
-.. |downloads| image:: http://img.shields.io/pypi/dm/dpkt.svg
- :alt: PyPI Package monthly downloads
- :target: https://pypi.python.org/pypi/dpkt
-
.. |wheel| image:: https://img.shields.io/pypi/wheel/dpkt.svg
:alt: PyPI Wheel
:target: https://pypi.python.org/pypi/dpkt
diff --git a/dpkt/aim.py b/dpkt/aim.py
index 86d3b08..5b7bd4c 100644
--- a/dpkt/aim.py
+++ b/dpkt/aim.py
@@ -60,10 +60,10 @@
try:
t, l = struct.unpack('>HH', buf[:n])
except struct.error:
- raise dpkt.UnpackError
+ raise dpkt.UnpackError('invalid type, length fields')
v = buf[n:n + l]
if len(v) < l:
- raise dpkt.NeedData
+ raise dpkt.NeedData('%d left, %d needed' % (len(v), l))
buf = buf[n + l:]
return t, l, v, buf
@@ -71,3 +71,58 @@
# TOC 2.0: http://www.firestuff.org/projects/firetalk/doc/toc2.txt
+def testAIM():
+ testdata = b'*\x02\xac\xf3\x00\x81\x00\x03\x00\x0b\x00\x00\xfaEUd\x0eusrnameremoved\x00\x00\x00\n\x00\x01\x00\x02\x12\x90\x00D\x00\x01\x00\x00\x03\x00\x04X\x90T6\x00E\x00\x04\x00\x00\x0f\x93\x00!\x00\x08\x00\x85\x00}\x00}\x00\x00\x00A\x00\x01\x00\x007\x00\x04\x00\x00\x00\x00\x00\r\x00\x00\x00\x19\x00\x00\x00\x1d\x00$\x00\x00\x00\x05\x02\x01\xd2\x04r\x00\x01\x00\x05\x02\x01\xd2\x04r\x00\x03\x00\x05+\x00\x00*\xcc\x00\x81\x00\x05+\x00\x00\x13\xf1'
+
+ flap = FLAP(testdata)
+ assert flap.ast == 0x2a
+ assert flap.type == 0x02
+ assert flap.seq == 44275
+ assert flap.len == 129
+ assert flap.data == b'\x00\x03\x00\x0b\x00\x00\xfaEUd\x0eusrnameremoved\x00\x00\x00\n\x00\x01\x00\x02\x12\x90\x00D\x00\x01\x00\x00\x03\x00\x04X\x90T6\x00E\x00\x04\x00\x00\x0f\x93\x00!\x00\x08\x00\x85\x00}\x00}\x00\x00\x00A\x00\x01\x00\x007\x00\x04\x00\x00\x00\x00\x00\r\x00\x00\x00\x19\x00\x00\x00\x1d\x00$\x00\x00\x00\x05\x02\x01\xd2\x04r\x00\x01\x00\x05\x02\x01\xd2\x04r\x00\x03\x00\x05+\x00\x00*\xcc\x00\x81\x00\x05+\x00\x00\x13\xf1'
+
+ snac = SNAC(flap.data)
+ assert snac.family == 3
+ assert snac.subtype == 11
+ assert snac.flags == 0
+ assert snac.reqid == 0xfa455564
+ assert snac.data == b'\x0eusrnameremoved\x00\x00\x00\n\x00\x01\x00\x02\x12\x90\x00D\x00\x01\x00\x00\x03\x00\x04X\x90T6\x00E\x00\x04\x00\x00\x0f\x93\x00!\x00\x08\x00\x85\x00}\x00}\x00\x00\x00A\x00\x01\x00\x007\x00\x04\x00\x00\x00\x00\x00\r\x00\x00\x00\x19\x00\x00\x00\x1d\x00$\x00\x00\x00\x05\x02\x01\xd2\x04r\x00\x01\x00\x05\x02\x01\xd2\x04r\x00\x03\x00\x05+\x00\x00*\xcc\x00\x81\x00\x05+\x00\x00\x13\xf1'
+
+ #skip over the buddyname and TLV count in Oncoming Buddy message
+ tlvdata = snac.data[19:]
+
+ tlvCount = 0
+ while tlvdata:
+ t, l, v, tlvdata = tlv(tlvdata)
+ tlvCount += 1
+ if tlvCount == 1:
+ # just check function return for first TLV
+ assert t == 0x01
+ assert l == 2
+ assert v == b'\x12\x90'
+ assert tlvdata == b'\x00D\x00\x01\x00\x00\x03\x00\x04X\x90T6\x00E\x00\x04\x00\x00\x0f\x93\x00!\x00\x08\x00\x85\x00}\x00}\x00\x00\x00A\x00\x01\x00\x007\x00\x04\x00\x00\x00\x00\x00\r\x00\x00\x00\x19\x00\x00\x00\x1d\x00$\x00\x00\x00\x05\x02\x01\xd2\x04r\x00\x01\x00\x05\x02\x01\xd2\x04r\x00\x03\x00\x05+\x00\x00*\xcc\x00\x81\x00\x05+\x00\x00\x13\xf1'
+
+ # make sure we extracted 10 TLVs
+ assert tlvCount == 10
+
+
+def testExceptions():
+ testdata = b'xxxxxx'
+ try:
+ flap = FLAP(testdata)
+ except dpkt.UnpackError as e:
+ assert str(e) == 'invalid FLAP header'
+ testdata = b'*\x02\x12\x34\x00\xff'
+ try:
+ flap = FLAP(testdata)
+ except dpkt.NeedData as e:
+ assert str(e) == '0 left, 255 needed'
+ try:
+ t, l, v, _ = tlv(b'x')
+ except dpkt.UnpackError as e:
+ assert str(e) == 'invalid type, length fields'
+
+ try:
+ t, l, v, _ = tlv(b'\x00\x01\x00\xff')
+ except dpkt.NeedData as e:
+ assert str(e) == '0 left, 255 needed'
diff --git a/dpkt/ip.py b/dpkt/ip.py
index 451106b..49e13ce 100644
--- a/dpkt/ip.py
+++ b/dpkt/ip.py
@@ -373,6 +373,8 @@
ip.data = u
ip.len += len(u)
assert (bytes(ip) == s)
+ assert (ip.v == 4)
+ assert (ip.hl == 5)
ip = IP(s)
assert (bytes(ip) == s)
diff --git a/dpkt/pim.py b/dpkt/pim.py
index 3753da6..629ae86 100644
--- a/dpkt/pim.py
+++ b/dpkt/pim.py
@@ -58,3 +58,13 @@
if not self.sum:
self.sum = dpkt.in_cksum(dpkt.Packet.__bytes__(self))
return dpkt.Packet.__bytes__(self)
+
+def test_pim():
+ pimdata = PIM(b'\x20\x00\x9f\xf4\x00\x01\x00\x02\x00\x69')
+ assert pimdata.v == 2
+ assert pimdata.type == 0
+
+ # test setters
+ pimdata.v = 3
+ pimdata.type = 1
+ assert bytes(pimdata) == b'\x31\x00\x9f\xf4\x00\x01\x00\x02\x00\x69'
diff --git a/dpkt/rtp.py b/dpkt/rtp.py
index f138908..924fb57 100644
--- a/dpkt/rtp.py
+++ b/dpkt/rtp.py
@@ -135,3 +135,29 @@
self.csrc = buf[self.__hdr_len__:self.__hdr_len__ + self.cc * 4]
self.data = buf[self.__hdr_len__ + self.cc * 4:]
+def test_rtp():
+ rtp = RTP(b"\x80\x08\x4d\x01\x00\x01\x00\xe0\x34\x3f\xfa\x34\x53\x53\x53\x56\x53\x5d\x56\x57\xd5\xd6\xd1\xde\xdf\xd3\xd9\xda\xdf\xdc\xdf\xd8\xdd\xd4\xdd\xd9\xd1\xd6\xdc\xda\xde\xdd\xc7\xc1\xdf\xdf\xda\xdb\xdd\xdd\xc4\xd9\x55\x57\xd4\x50\x44\x44\x5b\x44\x4f\x4c\x47\x40\x4c\x47\x59\x5b\x58\x5d\x56\x56\x53\x56\xd5\xd5\x54\x55\xd6\xd6\xd4\xd1\xd1\xd0\xd1\xd5\xdd\xd6\x55\xd4\xd6\xd1\xd4\xd6\xd7\xd7\xd5\xd4\xd0\xd7\xd1\xd4\xd2\xdc\xd6\xdc\xdf\xdc\xdd\xd2\xde\xdc\xd0\xdd\xdc\xd0\xd6\xd6\xd6\x55\x54\x55\x57\x57\x56\x50\x50\x5c\x5c\x52\x5d\x5d\x5f\x5e\x5d\x5e\x52\x50\x52\x56\x54\x57\x55\x55\xd4\xd7\x55\xd5\x55\x55\x55\x55\x55\x54\x57\x54\x55\x55\xd5\xd5\xd7\xd6\xd7\xd1\xd1\xd3\xd2\xd3\xd2\xd2\xd3\xd3")
+ assert (rtp.version == 2)
+ assert (rtp.p == 0)
+ assert (rtp.x == 0)
+ assert (rtp.cc == 0)
+ assert (rtp.m == 0)
+ assert (rtp.pt == 8)
+ assert (rtp.seq == 19713)
+ assert (rtp.ts == 65760)
+ assert (rtp.ssrc == 0x343ffa34)
+ assert (len(rtp) == 172)
+ assert (bytes(rtp) == b"\x80\x08\x4d\x01\x00\x01\x00\xe0\x34\x3f\xfa\x34\x53\x53\x53\x56\x53\x5d\x56\x57\xd5\xd6\xd1\xde\xdf\xd3\xd9\xda\xdf\xdc\xdf\xd8\xdd\xd4\xdd\xd9\xd1\xd6\xdc\xda\xde\xdd\xc7\xc1\xdf\xdf\xda\xdb\xdd\xdd\xc4\xd9\x55\x57\xd4\x50\x44\x44\x5b\x44\x4f\x4c\x47\x40\x4c\x47\x59\x5b\x58\x5d\x56\x56\x53\x56\xd5\xd5\x54\x55\xd6\xd6\xd4\xd1\xd1\xd0\xd1\xd5\xdd\xd6\x55\xd4\xd6\xd1\xd4\xd6\xd7\xd7\xd5\xd4\xd0\xd7\xd1\xd4\xd2\xdc\xd6\xdc\xdf\xdc\xdd\xd2\xde\xdc\xd0\xdd\xdc\xd0\xd6\xd6\xd6\x55\x54\x55\x57\x57\x56\x50\x50\x5c\x5c\x52\x5d\x5d\x5f\x5e\x5d\x5e\x52\x50\x52\x56\x54\x57\x55\x55\xd4\xd7\x55\xd5\x55\x55\x55\x55\x55\x54\x57\x54\x55\x55\xd5\xd5\xd7\xd6\xd7\xd1\xd1\xd3\xd2\xd3\xd2\xd2\xd3\xd3")
+
+ # the following tests RTP header setters
+ rtp = RTP()
+ rtp.m = 1
+ rtp.pt = 3
+ rtp.seq = 1234
+ rtp.ts = 5678
+ rtp.ssrc = 0xabcdef01
+ assert (rtp.m == 1)
+ assert (rtp.pt == 3)
+ assert (rtp.seq == 1234)
+ assert (rtp.ts == 5678)
+ assert (rtp.ssrc == 0xabcdef01)
diff --git a/dpkt/sll.py b/dpkt/sll.py
index 4ebc413..5294e36 100644
--- a/dpkt/sll.py
+++ b/dpkt/sll.py
@@ -34,3 +34,16 @@
setattr(self, self.data.__class__.__name__.lower(), self.data)
except (KeyError, dpkt.UnpackError):
pass
+
+def test_sll():
+ slldata = b'\x00\x00\x00\x01\x00\x06\x00\x0b\xdb\x52\x0e\x08\xf6\x7f\x08\x00\x45\x00\x00\x34\xcc\x6c\x40\x00\x40\x06\x74\x08\x82\xd9\xfa\x8e\x82\xd9\xfa\x0d'
+ slltest = SLL(slldata)
+ assert slltest.type == 0
+ assert slltest.hrd == 1
+ assert slltest.hlen == 6
+ assert slltest.hdr == b'\x00\x0b\xdb\x52\x0e\x08\xf6\x7f'
+ assert slltest.ethtype == 0x0800
+
+ # give invalid ethtype of 0x1234 to make sure error is caught
+ slldata2 = b'\x00\x00\x00\x01\x00\x06\x00\x0b\xdb\x52\x0e\x08\xf6\x7f\x12\x34\x45\x00\x00\x34\xcc\x6c\x40\x00\x40\x06\x74\x08\x82\xd9\xfa\x8e\x82\xd9\xfa\x0d'
+ slltest = SLL(slldata2)
diff --git a/dpkt/tcp.py b/dpkt/tcp.py
index 4818e8a..c051b2f 100644
--- a/dpkt/tcp.py
+++ b/dpkt/tcp.py
@@ -159,8 +159,16 @@
opts = parse_opts(buf)
assert opts == [None]
+def test_offset():
+ tcpheader = TCP(b'\x01\xbb\xc0\xd7\xb6\x56\xa8\xb9\xd1\xac\xaa\xb1\x50\x18\x40\x00\x56\xf8\x00\x00')
+ assert tcpheader.off == 5
+
+ # test setting header offset
+ tcpheader.off = 8
+ assert bytes(tcpheader) == b'\x01\xbb\xc0\xd7\xb6\x56\xa8\xb9\xd1\xac\xaa\xb1\x80\x18\x40\x00\x56\xf8\x00\x00'
if __name__ == '__main__':
# Runs all the test associated with this class/file
test_parse_opts()
+ test_offset()
print('Tests Successful...')