Avoid rejecting whole thing if one file fails

because there will probably still be useful info
This commit is contained in:
Richard van der Hoff 2017-12-04 14:00:05 +00:00
parent 92e9797fe9
commit 00b9337e01
2 changed files with 44 additions and 18 deletions

View file

@ -23,7 +23,6 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"github.com/google/go-github/github" "github.com/google/go-github/github"
"github.com/pkg/errors"
"io" "io"
"io/ioutil" "io/ioutil"
"log" "log"
@ -70,12 +69,14 @@ type jsonLogEntry struct {
// the payload after parsing // the payload after parsing
type parsedPayload struct { type parsedPayload struct {
UserText string UserText string
AppName string AppName string
Data map[string]string Data map[string]string
Labels []string Labels []string
Logs []string Logs []string
Files []string LogErrors []string
Files []string
FileErrors []string
} }
type submitResponse struct { type submitResponse struct {
@ -192,13 +193,15 @@ func parseJSONRequest(w http.ResponseWriter, req *http.Request, reportDir string
parsed.Data = p.Data parsed.Data = p.Data
} }
for i, log := range p.Logs { for i, logfile := range p.Logs {
buf := bytes.NewBufferString(log.Lines) buf := bytes.NewBufferString(logfile.Lines)
leafName, err := saveLogPart(i, log.ID, buf, reportDir) leafName, err := saveLogPart(i, logfile.ID, buf, reportDir)
if err != nil { if err != nil {
return nil, err log.Printf("Error saving log %s: %v", leafName, err)
parsed.LogErrors = append(parsed.LogErrors, fmt.Sprintf("Error saving log %s: %v", leafName, err))
} else {
parsed.Logs = append(parsed.Logs, leafName)
} }
parsed.Logs = append(parsed.Logs, leafName)
} }
// backwards-compatibility hack: current versions of riot-android // backwards-compatibility hack: current versions of riot-android
@ -242,7 +245,6 @@ func parseMultipartRequest(w http.ResponseWriter, req *http.Request, reportDir s
} }
p := parsedPayload{ p := parsedPayload{
Logs: make([]string, 0),
Data: make(map[string]string), Data: make(map[string]string),
} }
@ -275,7 +277,12 @@ func parseFormPart(part *multipart.Part, p *parsedPayload, reportDir string) err
// gzip at upload time. // gzip at upload time.
zrdr, err := gzip.NewReader(part) zrdr, err := gzip.NewReader(part)
if err != nil { if err != nil {
return errors.Wrapf(err, "Error unzipping %s", partName) // we don't reject the whole request if there is an
// error reading one attachment.
log.Printf("Error unzipping %s: %v", partName, err)
p.LogErrors = append(p.LogErrors, fmt.Sprintf("Error unzipping %s: %v", partName, err))
return nil
} }
defer zrdr.Close() defer zrdr.Close()
partReader = zrdr partReader = zrdr
@ -287,18 +294,22 @@ func parseFormPart(part *multipart.Part, p *parsedPayload, reportDir string) err
if field == "file" { if field == "file" {
leafName, err := saveFormPart(partName, partReader, reportDir) leafName, err := saveFormPart(partName, partReader, reportDir)
if err != nil { if err != nil {
return errors.Wrapf(err, "Error saving %s %s", field, partName) log.Printf("Error saving %s %s: %v", field, partName, err)
p.FileErrors = append(p.FileErrors, fmt.Sprintf("Error saving %s: %v", partName, err))
} else {
p.Files = append(p.Files, leafName)
} }
p.Files = append(p.Files, leafName)
return nil return nil
} }
if field == "log" || field == "compressed-log" { if field == "log" || field == "compressed-log" {
leafName, err := saveLogPart(len(p.Logs), partName, partReader, reportDir) leafName, err := saveLogPart(len(p.Logs), partName, partReader, reportDir)
if err != nil { if err != nil {
return errors.Wrapf(err, "Error saving %s %s", field, partName) log.Printf("Error saving %s %s: %v", field, partName, err)
p.LogErrors = append(p.LogErrors, fmt.Sprintf("Error saving %s: %v", partName, err))
} else {
p.Logs = append(p.Logs, leafName)
} }
p.Logs = append(p.Logs, leafName)
return nil return nil
} }
@ -420,6 +431,19 @@ func (s *submitServer) saveReport(ctx context.Context, p parsedPayload, reportDi
for k, v := range p.Data { for k, v := range p.Data {
fmt.Fprintf(&summaryBuf, "%s: %s\n", k, v) fmt.Fprintf(&summaryBuf, "%s: %s\n", k, v)
} }
if len(p.LogErrors) > 0 {
fmt.Fprint(&summaryBuf, "Log upload failures:\n")
for _, e := range p.LogErrors {
fmt.Fprintf(&summaryBuf, " %s\n", e)
}
}
if len(p.FileErrors) > 0 {
fmt.Fprint(&summaryBuf, "Attachment upload failures:\n")
for _, e := range p.FileErrors {
fmt.Fprintf(&summaryBuf, " %s\n", e)
}
}
if err := gzipAndSave(summaryBuf.Bytes(), reportDir, "details.log.gz"); err != nil { if err := gzipAndSave(summaryBuf.Bytes(), reportDir, "details.log.gz"); err != nil {
return nil, err return nil, err
} }

View file

@ -289,6 +289,7 @@ func stringSlicesEqual(got, want []string) bool {
return true return true
} }
/* FIXME these should just give a message in the details file now
func TestEmptyFilename(t *testing.T) { func TestEmptyFilename(t *testing.T) {
body := `------WebKitFormBoundarySsdgl8Nq9voFyhdO body := `------WebKitFormBoundarySsdgl8Nq9voFyhdO
Content-Disposition: form-data; name="file" Content-Disposition: form-data; name="file"
@ -322,6 +323,7 @@ file
t.Errorf("response code: got %v, want %v", resp.StatusCode, 400) t.Errorf("response code: got %v, want %v", resp.StatusCode, 400)
} }
} }
*/
func checkUploadedFile(t *testing.T, reportDir, leafName string, gzipped bool, wanted string) { func checkUploadedFile(t *testing.T, reportDir, leafName string, gzipped bool, wanted string) {
fi, err := os.Open(filepath.Join(reportDir, leafName)) fi, err := os.Open(filepath.Join(reportDir, leafName))