mirror of
https://github.com/ProtonMail/proton-bridge.git
synced 2026-02-09 10:38:33 +00:00
feat: handle foreign encodings
This commit is contained in:
@ -2,8 +2,12 @@ package parser
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"unicode/utf8"
|
||||
|
||||
pmmime "github.com/ProtonMail/proton-bridge/pkg/mime"
|
||||
"github.com/emersion/go-message"
|
||||
"golang.org/x/net/html/charset"
|
||||
"golang.org/x/text/encoding"
|
||||
)
|
||||
|
||||
type Parts []*Part
|
||||
@ -30,35 +34,32 @@ func (p *Part) AddChild(child *Part) {
|
||||
p.children = append(p.children, child)
|
||||
}
|
||||
|
||||
func (p *Part) write(writer *message.Writer, w *Writer) (err error) {
|
||||
if len(p.children) > 0 {
|
||||
for _, child := range p.children {
|
||||
if err = child.writeAsChild(writer, w); err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if _, err = writer.Write(p.Body); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
return
|
||||
func (p *Part) isUTF8() bool {
|
||||
return utf8.Valid(p.Body)
|
||||
}
|
||||
|
||||
func (p *Part) writeAsChild(writer *message.Writer, w *Writer) (err error) {
|
||||
if !w.shouldWrite(p) {
|
||||
return
|
||||
}
|
||||
|
||||
childWriter, err := writer.CreatePart(p.Header)
|
||||
// TODO: Do we then need to set charset to utf-8? What if it's embedded in html?
|
||||
func (p *Part) convertToUTF8() error {
|
||||
t, params, err := p.Header.ContentType()
|
||||
if err != nil {
|
||||
return
|
||||
return err
|
||||
}
|
||||
|
||||
if err = p.write(childWriter, w); err != nil {
|
||||
return
|
||||
var decoder *encoding.Decoder
|
||||
|
||||
if knownCharset, ok := params["charset"]; !ok {
|
||||
encoding, _, _ := charset.DetermineEncoding(p.Body, t)
|
||||
decoder = encoding.NewDecoder()
|
||||
} else if decoder, err = pmmime.SelectDecoder(knownCharset); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return childWriter.Close()
|
||||
if p.Body, err = decoder.Bytes(p.Body); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
params["charset"] = "utf-8"
|
||||
p.Header.SetContentType(t, params)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user