Skip to content

Commit fa3ad1e

Browse files
alexcesarobradfitz
authored andcommitted
mime/quotedprintable: add binary mode to the writer
Change-Id: Id82c3111d7571263208ced3d011ad80f3fe55984 Reviewed-on: https://go-review.googlesource.com/7892 Reviewed-by: Brad Fitzpatrick <[email protected]> Run-TryBot: Brad Fitzpatrick <[email protected]>
1 parent d593f4a commit fa3ad1e

File tree

2 files changed

+35
-14
lines changed

2 files changed

+35
-14
lines changed

src/mime/quotedprintable/writer.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ const lineMaxLen = 76
1010

1111
// A Writer is a quoted-printable writer that implements io.WriteCloser.
1212
type Writer struct {
13+
// Binary mode treats the writer's input as pure binary and processes end of
14+
// line bytes as binary data.
15+
Binary bool
16+
1317
w io.Writer
1418
i int
1519
line [78]byte
@@ -30,7 +34,7 @@ func (w *Writer) Write(p []byte) (n int, err error) {
3034
// Simple writes are done in batch.
3135
case b >= '!' && b <= '~' && b != '=':
3236
continue
33-
case isWhitespace(b) || b == '\n' || b == '\r':
37+
case isWhitespace(b) || !w.Binary && (b == '\n' || b == '\r'):
3438
continue
3539
}
3640

src/mime/quotedprintable/writer_test.go

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,25 +12,33 @@ import (
1212
)
1313

1414
func TestWriter(t *testing.T) {
15+
testWriter(t, false)
16+
}
17+
18+
func TestWriterBinary(t *testing.T) {
19+
testWriter(t, true)
20+
}
21+
22+
func testWriter(t *testing.T, binary bool) {
1523
tests := []struct {
16-
in, want string
24+
in, want, wantB string
1725
}{
1826
{in: "", want: ""},
1927
{in: "foo bar", want: "foo bar"},
2028
{in: "foo bar=", want: "foo bar=3D"},
21-
{in: "foo bar\r", want: "foo bar\r\n"},
22-
{in: "foo bar\r\r", want: "foo bar\r\n\r\n"},
23-
{in: "foo bar\n", want: "foo bar\r\n"},
24-
{in: "foo bar\r\n", want: "foo bar\r\n"},
25-
{in: "foo bar\r\r\n", want: "foo bar\r\n\r\n"},
29+
{in: "foo bar\r", want: "foo bar\r\n", wantB: "foo bar=0D"},
30+
{in: "foo bar\r\r", want: "foo bar\r\n\r\n", wantB: "foo bar=0D=0D"},
31+
{in: "foo bar\n", want: "foo bar\r\n", wantB: "foo bar=0A"},
32+
{in: "foo bar\r\n", want: "foo bar\r\n", wantB: "foo bar=0D=0A"},
33+
{in: "foo bar\r\r\n", want: "foo bar\r\n\r\n", wantB: "foo bar=0D=0D=0A"},
2634
{in: "foo bar ", want: "foo bar=20"},
2735
{in: "foo bar\t", want: "foo bar=09"},
2836
{in: "foo bar ", want: "foo bar =20"},
29-
{in: "foo bar \n", want: "foo bar=20\r\n"},
30-
{in: "foo bar \r", want: "foo bar=20\r\n"},
31-
{in: "foo bar \r\n", want: "foo bar=20\r\n"},
32-
{in: "foo bar \n", want: "foo bar =20\r\n"},
33-
{in: "foo bar \n ", want: "foo bar =20\r\n=20"},
37+
{in: "foo bar \n", want: "foo bar=20\r\n", wantB: "foo bar =0A"},
38+
{in: "foo bar \r", want: "foo bar=20\r\n", wantB: "foo bar =0D"},
39+
{in: "foo bar \r\n", want: "foo bar=20\r\n", wantB: "foo bar =0D=0A"},
40+
{in: "foo bar \n", want: "foo bar =20\r\n", wantB: "foo bar =0A"},
41+
{in: "foo bar \n ", want: "foo bar =20\r\n=20", wantB: "foo bar =0A=20"},
3442
{in: "¡Hola Señor!", want: "=C2=A1Hola Se=C3=B1or!"},
3543
{
3644
in: "\t !\"#$%&'()*+,-./ :;<>?@[\\]^_`{|}~",
@@ -85,6 +93,15 @@ func TestWriter(t *testing.T) {
8593
for _, tt := range tests {
8694
buf := new(bytes.Buffer)
8795
w := NewWriter(buf)
96+
97+
want := tt.want
98+
if binary {
99+
w.Binary = true
100+
if tt.wantB != "" {
101+
want = tt.wantB
102+
}
103+
}
104+
88105
if _, err := w.Write([]byte(tt.in)); err != nil {
89106
t.Errorf("Write(%q): %v", tt.in, err)
90107
continue
@@ -94,8 +111,8 @@ func TestWriter(t *testing.T) {
94111
continue
95112
}
96113
got := buf.String()
97-
if got != tt.want {
98-
t.Errorf("Write(%q), got:\n%q\nwant:\n%q", tt.in, got, tt.want)
114+
if got != want {
115+
t.Errorf("Write(%q), got:\n%q\nwant:\n%q", tt.in, got, want)
99116
}
100117
}
101118
}

0 commit comments

Comments
 (0)