From 1f5445e0e3d767196b902075360432233b29040b Mon Sep 17 00:00:00 2001 From: Phil <phil@secdev.org> Date: Thu, 25 Dec 2008 01:10:54 +0100 Subject: [PATCH] WARNING: API change. Work on Packet.__getitem__(), __setitem__() and __delitem__() - Packet.__getitem__() raises an IndexError if asked layer is not found - Added Packet.__setitem__() to replace a layer by another ex: del(pkt[Raw]) - Added Packet.__delitem__() to remove a layer and its sublayers ex: pkt[Raw] = Raw(load="another payload") --- scapy/packet.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/scapy/packet.py b/scapy/packet.py index db7b68c2..be6aa222 100644 --- a/scapy/packet.py +++ b/scapy/packet.py @@ -718,16 +718,30 @@ Creates an EPS file describing a packet. If filename is not provided a temporary def __getitem__(self, cls): if type(cls) is slice: + lname = cls.start if cls.stop: ret = self.getlayer(cls.start, cls.stop) else: ret = self.getlayer(cls.start) if ret is None and cls.step is not None: ret = cls.step - return ret else: - return self.getlayer(cls) - + lname=cls + ret = self.getlayer(cls) + if ret is None: + if type(lname) is Packet_metaclass: + lname = lname.__name__ + elif type(lname) is not str: + lname = repr(lname) + raise IndexError("Layer [%s] not found" % lname) + return ret + + def __delitem__(self, cls): + del(self[cls].underlayer.payload) + + def __setitem__(self, cls, val): + self[cls].underlayer.payload = val + def __contains__(self, cls): """"cls in self" returns true if self has a layer which is an instance of cls.""" return self.haslayer(cls) -- GitLab