fix \r\n trim for multipart lines
This commit is contained in:
parent
0974658bf2
commit
ff9ff23e5a
|
@ -2,6 +2,8 @@ package multipart
|
|||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"io"
|
||||
"strings"
|
||||
)
|
||||
|
||||
|
@ -85,8 +87,10 @@ func (comp *Component) read(_reader *bufio.Reader, _boundary string) error {
|
|||
// 1. Stop on error
|
||||
if err != nil {
|
||||
// remove last CR (newline)
|
||||
if string(comp.Data[len(comp.Data)-1]) == "\n" {
|
||||
if strings.HasSuffix(string(comp.Data), "\n") {
|
||||
comp.Data = comp.Data[0 : len(comp.Data)-1]
|
||||
} else if strings.HasSuffix(string(comp.Data), "\r\n") {
|
||||
comp.Data = comp.Data[0 : len(comp.Data)-2]
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
@ -95,14 +99,22 @@ func (comp *Component) read(_reader *bufio.Reader, _boundary string) error {
|
|||
if strings.HasPrefix(string(line), _boundary) {
|
||||
|
||||
// remove last CR (newline)
|
||||
if string(comp.Data[len(comp.Data)-1]) == "\n" {
|
||||
if strings.HasSuffix(string(comp.Data), "\n") {
|
||||
comp.Data = comp.Data[0 : len(comp.Data)-1]
|
||||
} else if strings.HasSuffix(string(comp.Data), "\r\n") {
|
||||
comp.Data = comp.Data[0 : len(comp.Data)-2]
|
||||
}
|
||||
|
||||
// io.EOF if last boundary
|
||||
if strings.Trim(string(line), " \t\r\n") == fmt.Sprintf("%s--", _boundary) {
|
||||
return io.EOF
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// 3. Ignore empty lines
|
||||
if string(line) != "\n" && len(line) > 0 {
|
||||
if len(strings.Trim(string(line), " \t\r\n")) > 0 {
|
||||
|
||||
// add to header if not finished
|
||||
if !headerRead {
|
||||
|
|
|
@ -44,21 +44,21 @@ func (reader *Reader) Parse() error {
|
|||
/* (1) For each component (until boundary) */
|
||||
for {
|
||||
|
||||
mpd := &Component{
|
||||
comp := &Component{
|
||||
ContentType: "raw",
|
||||
Data: make([]byte, 0),
|
||||
Headers: make(map[string]string),
|
||||
}
|
||||
|
||||
// 1. Read and parse data
|
||||
err := mpd.read(reader.reader, reader.boundary)
|
||||
err := comp.read(reader.reader, reader.boundary)
|
||||
|
||||
// 3. Dispatch error
|
||||
if err != nil && err != io.EOF {
|
||||
return err
|
||||
}
|
||||
|
||||
name := mpd.GetHeader("name")
|
||||
name := comp.GetHeader("name")
|
||||
if len(name) < 1 {
|
||||
return ErrMissingDataName
|
||||
}
|
||||
|
@ -67,7 +67,7 @@ func (reader *Reader) Parse() error {
|
|||
return ErrDataNameConflict
|
||||
}
|
||||
|
||||
reader.Data[name] = mpd
|
||||
reader.Data[name] = comp
|
||||
|
||||
if err == io.EOF {
|
||||
return nil
|
||||
|
|
Loading…
Reference in New Issue