| 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 |
|---|