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.

Reply via email to