create a ReadSeeker that wraps the Reader providing the buffering (mark & reset) - normally the buffer only needs to be large enough to detect the format contained in the Reader.
You can search Google for PushbackReader in Go and you’ll get a basic implementation. > On Jan 12, 2025, at 12:52 PM, Rory Campbell-Lange <r...@campbell-lange.net> > wrote: > > I'm looking to develop an alternative to an existing piece of code that reads > email parts into byte slices and then returns these after decoding. > > As library users may not wish to use these email parts and because there a > multiple byte slice copies being used, I'm attempting to rationalise the > process by simply wrapping the provided io.Reader with the necessary decoders > to reduce memory usage and unnecessary processing. > > The wrapping strategy seems to work ok. However there is a particular issue > in detecting base64.StdEncoding versus base64.RawStdEncoding, which requires > draining the io.Reader using base64.StdEncoding and (based on the current > implementation) switching to base64.RawStdEncoding if an io.ErrUnexpectedEOF > is found. > > I'd be grateful for any thoughts on the most efficient way of dealing with > this type of issue, avoiding the need for lots of in-memory copies of -- say > -- a 50MB email attachment. Unfortunately neither net/mail.Message.Body or > mime/multipart.Part, which provide the input to this func, provide > ReadSeekers. > > Code snippet below. > > Thanks! > Rory > > > // decodeContent wraps the content io.Reader in either a base64 or > // quoted printable decoder if applicable. It further wraps the reader > // in a transform character decoder if an encoding is supplied. > func decodeContent(content io.Reader, e encoding.Encoding, cte > ContentTransferEncoding) io.Reader { > > var contentReader io.Reader > > switch cte { > case cteBase64: > > contentReader = base64.NewDecoder(base64.StdEncoding, content) > // ideally check for errors.Is(err, io.ErrUnexpectedEOF); switch > decoder to > // contentReader = base64.NewDecoder(base64.RawStdEncoding, > content) > > case cteQuotedPrintable: > contentReader = quotedprintable.NewReader(content) > default: > contentReader = content > } > > if e == nil { > return contentReader > } > return transform.NewReader(contentReader, e.NewDecoder()) > } > > -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to golang-nuts+unsubscr...@googlegroups.com. > To view this discussion visit > https://groups.google.com/d/msgid/golang-nuts/Z4QPbTZ4gemg9kwV%40campbell-lange.net. -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/golang-nuts/644FC184-CC66-4838-8B35-7F0D926AB52D%40ix.netcom.com.