Skip to content

Commit 8e4c7da

Browse files
authored
Merge pull request #448 from wneessen/chrore/444_remove-base64linebreaker-from-api
Make Base64LineBreaker private
2 parents 033a85e + 8ce4e71 commit 8e4c7da

File tree

3 files changed

+25
-26
lines changed

3 files changed

+25
-26
lines changed

b64linebreaker.go

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,26 +13,23 @@ import (
1313
// in encoding processes.
1414
var newlineBytes = []byte(SingleNewLine)
1515

16-
// ErrNoOutWriter is the error returned when no io.Writer is set for Base64LineBreaker.
17-
var ErrNoOutWriter = errors.New("no io.Writer set for Base64LineBreaker")
18-
19-
// Base64LineBreaker handles base64 encoding with the insertion of new lines after a certain number
16+
// base64LineBreaker handles base64 encoding with the insertion of new lines after a certain number
2017
// of characters.
2118
//
2219
// This struct is used to manage base64 encoding while ensuring that new lines are inserted after
2320
// reaching a specific line length. It satisfies the io.WriteCloser interface.
2421
//
2522
// References:
2623
// - https://datatracker.ietf.org/doc/html/rfc2045 (Base64 and line length limitations)
27-
type Base64LineBreaker struct {
24+
type base64LineBreaker struct {
2825
line [MaxBodyLength]byte
2926
used int
3027
out io.Writer
3128
}
3229

33-
// Write writes data to the Base64LineBreaker, ensuring lines do not exceed MaxBodyLength.
30+
// Write writes data to the base64LineBreaker, ensuring lines do not exceed MaxBodyLength.
3431
//
35-
// This method writes the provided data to the Base64LineBreaker. It ensures that the written
32+
// This method writes the provided data to the base64LineBreaker. It ensures that the written
3633
// lines do not exceed the MaxBodyLength. If the data exceeds the limit, it handles the
3734
// continuation by splitting the data and writing new lines as necessary.
3835
//
@@ -42,9 +39,9 @@ type Base64LineBreaker struct {
4239
// Returns:
4340
// - numBytes: The number of bytes written.
4441
// - err: An error if one occurred during the write operation.
45-
func (l *Base64LineBreaker) Write(data []byte) (numBytes int, err error) {
42+
func (l *base64LineBreaker) Write(data []byte) (numBytes int, err error) {
4643
if l.out == nil {
47-
err = ErrNoOutWriter
44+
err = errors.New("no io.Writer set for base64LineBreaker")
4845
return
4946
}
5047
if l.used+len(data) < MaxBodyLength {
@@ -73,15 +70,15 @@ func (l *Base64LineBreaker) Write(data []byte) (numBytes int, err error) {
7370
return l.Write(data[excess:])
7471
}
7572

76-
// Close finalizes the Base64LineBreaker, writing any remaining buffered data and appending a newline.
73+
// Close finalizes the base64LineBreaker, writing any remaining buffered data and appending a newline.
7774
//
7875
// This method ensures that any remaining data in the buffer is written to the output and appends
79-
// a newline. It is used to finalize the Base64LineBreaker and should be called when no more data
76+
// a newline. It is used to finalize the base64LineBreaker and should be called when no more data
8077
// is expected to be written.
8178
//
8279
// Returns:
8380
// - err: An error if one occurred during the final write operation.
84-
func (l *Base64LineBreaker) Close() (err error) {
81+
func (l *base64LineBreaker) Close() (err error) {
8582
if l.used > 0 {
8683
_, err = l.out.Write(l.line[0:l.used])
8784
if err != nil {

b64linebreaker_test.go

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"errors"
1111
"io"
1212
"os"
13+
"strings"
1314
"testing"
1415
)
1516

@@ -22,7 +23,7 @@ var (
2223
func TestBase64LineBreaker(t *testing.T) {
2324
t.Run("write, copy and close", func(t *testing.T) {
2425
logoWriter := bytes.NewBuffer(nil)
25-
lineBreaker := &Base64LineBreaker{out: logoWriter}
26+
lineBreaker := &base64LineBreaker{out: logoWriter}
2627
t.Cleanup(func() {
2728
if err := lineBreaker.Close(); err != nil {
2829
t.Errorf("failed to close line breaker: %s", err)
@@ -44,7 +45,7 @@ func TestBase64LineBreaker(t *testing.T) {
4445
})
4546

4647
logoWriter := bytes.NewBuffer(nil)
47-
lineBreaker := &Base64LineBreaker{out: logoWriter}
48+
lineBreaker := &base64LineBreaker{out: logoWriter}
4849
t.Cleanup(func() {
4950
if err := lineBreaker.Close(); err != nil {
5051
t.Errorf("failed to close line breaker: %s", err)
@@ -86,16 +87,17 @@ func TestBase64LineBreaker(t *testing.T) {
8687
}
8788
})
8889
t.Run("fail with no writer defined", func(t *testing.T) {
89-
lineBreaker := &Base64LineBreaker{}
90+
lineBreaker := &base64LineBreaker{}
9091
_, err := lineBreaker.Write([]byte("testdata"))
9192
if err == nil {
92-
t.Errorf("writing to Base64LineBreaker with no output io.Writer was supposed to failed, but didn't")
93+
t.Errorf("writing to base64LineBreaker with no output io.Writer was supposed to failed, but didn't")
9394
}
94-
if !errors.Is(err, ErrNoOutWriter) {
95-
t.Errorf("unexpected error while writing to empty Base64LineBreaker: %s", err)
95+
expErr := "no io.Writer set for base64LineBreaker"
96+
if !strings.Contains(err.Error(), expErr) {
97+
t.Errorf("unexpected error while writing to empty base64LineBreaker: %s", err)
9698
}
97-
if err := lineBreaker.Close(); err != nil {
98-
t.Errorf("failed to close Base64LineBreaker: %s", err)
99+
if err = lineBreaker.Close(); err != nil {
100+
t.Errorf("failed to close base64LineBreaker: %s", err)
99101
}
100102
})
101103
t.Run("write on an already closed output writer", func(t *testing.T) {
@@ -110,14 +112,14 @@ func TestBase64LineBreaker(t *testing.T) {
110112
})
111113

112114
writeBuffer := &errorWriter{}
113-
lineBreaker := &Base64LineBreaker{out: writeBuffer}
115+
lineBreaker := &base64LineBreaker{out: writeBuffer}
114116
_, err = io.Copy(lineBreaker, logo)
115117
if err == nil {
116-
t.Errorf("writing to Base64LineBreaker with an already closed output io.Writer was " +
118+
t.Errorf("writing to base64LineBreaker with an already closed output io.Writer was " +
117119
"supposed to failed, but didn't")
118120
}
119121
if !errors.Is(err, errClosedWriter) {
120-
t.Errorf("unexpected error while writing to Base64LineBreaker: %s", err)
122+
t.Errorf("unexpected error while writing to base64LineBreaker: %s", err)
121123
}
122124
})
123125
t.Run("fail on different scenarios with mock writer", func(t *testing.T) {
@@ -146,7 +148,7 @@ func TestBase64LineBreaker(t *testing.T) {
146148
}
147149
for _, tt := range tests {
148150
t.Run(tt.name, func(t *testing.T) {
149-
lineBreaker := &Base64LineBreaker{out: tt.writer}
151+
lineBreaker := &base64LineBreaker{out: tt.writer}
150152

151153
_, err := lineBreaker.Write(tt.data)
152154
if err != nil && !errors.Is(err, errMockDefault) && !errors.Is(err, errMockNewline) {
@@ -242,7 +244,7 @@ func FuzzBase64LineBreaker(f *testing.F) {
242244
return
243245
}
244246
buffer := bytes.NewBuffer(nil)
245-
lineBreaker := &Base64LineBreaker{
247+
lineBreaker := &base64LineBreaker{
246248
out: buffer,
247249
}
248250
base64Encoder := base64.NewEncoder(base64.StdEncoding, lineBreaker)

msgwriter.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -518,7 +518,7 @@ func (mw *msgWriter) writeBody(writeFunc func(io.Writer) (int64, error), encodin
518518
writer = mw.partWriter
519519
}
520520
writeBuffer := bytes.Buffer{}
521-
lineBreaker := Base64LineBreaker{}
521+
lineBreaker := base64LineBreaker{}
522522
lineBreaker.out = &writeBuffer
523523

524524
switch encoding {

0 commit comments

Comments
 (0)