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