Browse Source

mime() no longer returns io.EOF when no errors happened, but nil instead.
Also NotMime error now returned correctly when email is not a mime message

flashmob 5 years ago
parent
commit
455e0a2493
2 changed files with 17 additions and 5 deletions
  1. 11 0
      mail/mime/mime.go
  2. 6 5
      mail/mime/mime_test.go

+ 11 - 0
mail/mime/mime.go

@@ -828,6 +828,10 @@ func (p *Parser) mime(part *Part, cb string) (err error) {
 		part = newPart()
 		part = newPart()
 		p.addPart(part, first)
 		p.addPart(part, first)
 		defer func() {
 		defer func() {
+			// err is io.EOF if nothing went with parsing
+			if err == io.EOF {
+				err = nil
+			}
 			if err != MaxNodesErr {
 			if err != MaxNodesErr {
 				part.EndingPosBody = p.lastBoundaryPos
 				part.EndingPosBody = p.lastBoundaryPos
 				part.EndingPos = p.msgPos
 				part.EndingPos = p.msgPos
@@ -836,6 +840,13 @@ func (p *Parser) mime(part *Part, cb string) (err error) {
 				var parts []*Part
 				var parts []*Part
 				p.Parts = append(parts, p.Parts[:p.maxNodes]...)
 				p.Parts = append(parts, p.Parts[:p.maxNodes]...)
 			}
 			}
+			// not a mime email (but is an rfc5322 message)
+			if len(p.Parts) == 1 &&
+				len(part.Headers) > 0 &&
+				part.Headers.Get("MIME-Version") == "" &&
+				err == nil {
+				err = NotMime
+			}
 		}()
 		}()
 	}
 	}
 
 

+ 6 - 5
mail/mime/mime_test.go

@@ -560,7 +560,7 @@ func TestNestedEmail(t *testing.T) {
 		//os.Exit(1)
 		//os.Exit(1)
 	}()
 	}()
 
 
-	if err := p.mime(nil, ""); err != nil && err != io.EOF {
+	if err := p.mime(nil, ""); err != nil {
 		t.Error(err)
 		t.Error(err)
 	}
 	}
 	//output := email
 	//output := email
@@ -603,9 +603,10 @@ This is not a an MIME email
 func TestNonMineEmail(t *testing.T) {
 func TestNonMineEmail(t *testing.T) {
 	p = NewMimeParser()
 	p = NewMimeParser()
 	p.inject([]byte(email4))
 	p.inject([]byte(email4))
-	if err := p.mime(nil, ""); err != nil && err != NotMime && err != io.EOF {
+	if err := p.mime(nil, ""); err != nil && err != NotMime {
 		t.Error(err)
 		t.Error(err)
 	} else {
 	} else {
+		// err should be NotMime
 		for part := range p.Parts {
 		for part := range p.Parts {
 			fmt.Println(p.Parts[part].Node + "  " + strconv.Itoa(int(p.Parts[part].StartingPos)) + "  " + strconv.Itoa(int(p.Parts[part].StartingPosBody)) + "  " + strconv.Itoa(int(p.Parts[part].EndingPosBody)))
 			fmt.Println(p.Parts[part].Node + "  " + strconv.Itoa(int(p.Parts[part].StartingPos)) + "  " + strconv.Itoa(int(p.Parts[part].StartingPosBody)) + "  " + strconv.Itoa(int(p.Parts[part].EndingPosBody)))
 		}
 		}
@@ -617,7 +618,7 @@ func TestNonMineEmail(t *testing.T) {
 
 
 	// what if we pass an empty string?
 	// what if we pass an empty string?
 	p.inject([]byte{' '})
 	p.inject([]byte{' '})
-	if err := p.mime(nil, ""); err == nil || err == NotMime || err == io.EOF {
+	if err := p.mime(nil, ""); err == nil || err == NotMime {
 		t.Error("unexpected error", err)
 		t.Error("unexpected error", err)
 	}
 	}
 
 
@@ -675,7 +676,7 @@ func TestNonMineEmailBigBody(t *testing.T) {
 		in = append(in, b[i:to+i])
 		in = append(in, b[i:to+i])
 	}
 	}
 	p.inject(in...)
 	p.inject(in...)
-	if err := p.mime(nil, ""); err != nil && err != NotMime && err != io.EOF {
+	if err := p.mime(nil, ""); err != nil && err != NotMime {
 		t.Error(err)
 		t.Error(err)
 	} else {
 	} else {
 		for part := range p.Parts {
 		for part := range p.Parts {
@@ -689,7 +690,7 @@ func TestNonMineEmailBigBody(t *testing.T) {
 
 
 	// what if we pass an empty string?
 	// what if we pass an empty string?
 	p.inject([]byte{' '})
 	p.inject([]byte{' '})
-	if err := p.mime(nil, ""); err == nil || err == NotMime || err == io.EOF {
+	if err := p.mime(nil, ""); err == nil || err == NotMime {
 		t.Error("unexpected error", err)
 		t.Error("unexpected error", err)
 	}
 	}