Ticket #2198: patch-sip-multiline.txt

File patch-sip-multiline.txt, 2.2 KB (added by antoine, 8 years ago)

patch to enable multiline headers for SIP

Line 
1--- twisted/protocols/sip-last.py       2006-10-27 18:36:17.000000000 +0200
2+++ twisted/protocols/sip.py    2006-10-27 18:59:43.000000000 +0200
3@@ -513,6 +513,7 @@
4         self.length = None # body length
5         self.bodyReceived = 0 # how much of the body we received
6         self.message = None
7+        self.header = None
8         self.setLineMode(remainingData)
9 
10     def invalidMessage(self):
11@@ -580,24 +581,36 @@
12         else:
13             assert self.state == "headers"
14         if line:
15-            # XXX support multi-line headers
16-            try:
17-                name, value = line.split(":", 1)
18-            except ValueError:
19-                self.invalidMessage()
20-                return
21-            self.message.addHeader(name, value.lstrip())
22-            if name.lower() == "content-length":
23+            # multi-line header
24+            if line.startswith(" ") or line.startswith("\t"):
25+                name, value = self.header
26+                self.header = name, (value + line.lstrip())
27+            else:
28+                # new header
29+                if self.header:
30+                    self.message.addHeader(*self.header)
31+                    self.header = None
32                 try:
33-                    self.length = int(value.lstrip())
34+                    name, value = line.split(":", 1)
35                 except ValueError:
36                     self.invalidMessage()
37                     return
38+                self.header = name, value.lstrip()
39+                # XXX we assume content-length won't be multiline
40+                if name.lower() == "content-length":
41+                    try:
42+                        self.length = int(value.lstrip())
43+                    except ValueError:
44+                        self.invalidMessage()
45+                        return
46         else:
47             # CRLF, we now have message body until self.length bytes,
48             # or if no length was given, until there is no more data
49             # from the connection sending us data.
50             self.state = "body"
51+            if self.header:
52+                self.message.addHeader(*self.header)
53+                self.header = None
54             if self.length == 0:
55                 self.messageDone()
56                 return