>From 8a702bba7b36dbe362057dbca0bfa1f4a78436fd Mon Sep 17 00:00:00 2001
From: Paolo Bonzini
Date: Tue, 29 Mar 2011 14:46:31 +0200
Subject: [PATCH] rfc822: fix parsing of empty fields
packages/net:
2011-03-29 Paolo Bonzini
* MIME.st: Do not fail on empty fields like "Expires: \r\n".
---
packages/net/ChangeLog | 4 ++++
packages/net/MIME.st | 42 +++++++++++++++++++++++++++---------------
2 files changed, 31 insertions(+), 15 deletions(-)
diff --git a/packages/net/ChangeLog b/packages/net/ChangeLog
index 1e4f1f8..6b67427 100644
--- a/packages/net/ChangeLog
+++ b/packages/net/ChangeLog
@@ -1,5 +1,9 @@
2011-03-29 Paolo Bonzini
+ * MIME.st: Do not fail on empty fields like "Expires: \r\n".
+
+2011-03-29 Paolo Bonzini
+
* HTTP.st: Accept end-of-file where a chunked encoding header
should have been.
diff --git a/packages/net/MIME.st b/packages/net/MIME.st
index 0460bc2..a948293 100644
--- a/packages/net/MIME.st
+++ b/packages/net/MIME.st
@@ -223,8 +223,8 @@ Object subclass: SimpleScanner [
#(32 9) includes: c asInteger].
self initClassificationTableWith: CRLFMask
when: [:c | c == Character cr or: [c == Character nl]].
- self initClassificationTableWith: EndOfLineMask
- when: [:c | c == Character cr]
+ "self initClassificationTableWith: EndOfLineMask
+ when: [:c | c == Character cr]"
]
SimpleScanner class >> initClassificationTableWith: mask when: aBlock [
@@ -588,6 +588,7 @@ Object subclass: SimpleScanner [
lookahead notNil ifTrue: [^lookahead].
self atEnd ifTrue: [^nil].
+ hereChar := nil.
lookahead := source next.
^lookahead
]
@@ -1142,11 +1143,9 @@ MessageElement subclass: MimeEntity [
parseFieldsFrom: rfc822Stream [
- | cr nl |
-
- [(cr := rfc822Stream peekFor: Character cr)
- | (nl := rfc822Stream peekFor: Character nl)]
- whileFalse: [self parseFieldFrom: rfc822Stream]
+ [rfc822Stream atEndOfLine]
+ whileFalse: [self parseFieldFrom: rfc822Stream].
+ rfc822Stream next; skipEndOfLine
]
parseMultipartBodyFrom: rfc822Stream [
@@ -2695,16 +2694,29 @@ MailScanner subclass: RFC822Scanner [
^token
]
- scanEndOfLine [
- "Note: this will work only for RFC822 but not for HTTP. Needs more design work"
+ atEndOfLine [
+
+ self peek.
+ ^(self classificationMaskFor: lookahead) anyMask: CRLFMask
+ ]
+ skipEndOfLine [
- (self matchCharacterType: CRLFMask) ifFalse: [^self].
hereChar == Character nl
ifFalse:
[(source peekFor: Character nl)
- ifFalse: [^self]
+ ifFalse: [^false]
ifTrue: [self sourceTrailNextPut: Character nl]].
+ ^true
+ ]
+
+ scanEndOfLine [
+ "Note: this will work only for RFC822 but not for HTTP. Needs more design work"
+
+
+ "Called after #step, so no need to peek to set the CRLFMask."
+ (self matchCharacterType: CRLFMask) ifFalse: [^false].
+ self skipEndOfLine ifFalse: [^self].
self shouldFoldLine
ifTrue:
[self hereChar: Character space.
@@ -2770,6 +2782,7 @@ MailScanner subclass: RFC822Scanner [
"RFC822: text =
+ (self matchCharacterType: EndOfLineMask) ifTrue: [^String new].
^self scanUntil: [self matchCharacterType: CRLFMask]
]
@@ -2863,14 +2876,13 @@ MailScanner subclass: RFC822Scanner [
| char |
self atEnd ifTrue: [^false].
- char := source next.
+ char := source peek.
^((self classificationMaskFor: char) anyMask: WhiteSpaceMask)
ifFalse:
- [lookahead := char.
- self resetToken.
+ [self resetToken; peek.
false]
ifTrue:
- [self sourceTrailNextPut: char.
+ [self sourceTrailNextPut: source next.
true]
]
--
1.7.4