func newPart(mr *Reader) (*Part, error) { bp := &Part{ Header: make(map[string][]string), mr: mr, buffer: new(bytes.Buffer), } err := bp.populateHeaders() bp.r = partReader{bp} const cte = "Content-Transfer-Encoding" if bp.Header.Get(cte) == "quoted-printable" { bp.Header.Del(cte) bp.r = quotedprintable.NewReader(bp.r) } return bp, err }
// decodeSection attempts to decode the data from reader using the algorithm listed in // the Content-Transfer-Encoding header, returning the raw data if it does not known // the encoding type. func decodeSection(encoding string, reader io.Reader) ([]byte, error) { // Default is to just read input into bytes decoder := reader switch strings.ToLower(encoding) { case "quoted-printable": decoder = quotedprintable.NewReader(reader) case "base64": // cleaner := NewBase64Cleaner(reader) // decoder = base64.NewDecoder(base64.StdEncoding, cleaner) decoder = NewBase64Combiner(reader) case "uuencode": decoder = transform.NewReader(reader, uuencode.NewDecFirstOne()) } // Read bytes into buffer buf := new(bytes.Buffer) _, err := buf.ReadFrom(decoder) if err != nil { return nil, err } return buf.Bytes(), nil }