feat: better handling of multipart messages

This commit is contained in:
James Houlahan
2020-07-30 14:51:34 +02:00
parent a7da66ccbc
commit c6b18b45b5
10 changed files with 502 additions and 214 deletions

View File

@ -23,7 +23,23 @@ func newWalker(root *Part) *Walker {
}
func (w *Walker) Walk() (err error) {
return w.root.visit(w)
return w.visitPart(w.root)
}
func (w *Walker) visitPart(p *Part) (err error) {
hdl := w.getHandler(p)
if err = hdl.handleEnter(w, p); err != nil {
return
}
for _, child := range p.children {
if err = w.visitPart(child); err != nil {
return
}
}
return hdl.handleExit(w, p)
}
func (w *Walker) WithDefaultHandler(handler handler) *Walker {
@ -46,6 +62,14 @@ func (w *Walker) RegisterContentDispositionHandler(contDisp string) *DispHandler
return hdl
}
func (w *Walker) getHandler(p *Part) handler {
if dispHandler := w.getDispHandler(p); dispHandler != nil {
return dispHandler
}
return w.getTypeHandler(p)
}
// getTypeHandler returns the appropriate PartHandler to handle the given part.
// If no specialised handler exists, it returns the default handler.
func (w *Walker) getTypeHandler(p *Part) handler {