From 732438e3042d299c6dd7c096ba2eaa20035d8466 Mon Sep 17 00:00:00 2001
From: Christian Pointner <equinox@helsinki.at>
Date: Sat, 23 Jul 2016 02:29:49 +0200
Subject: improved error handling for uploadWeb


diff --git a/src/rhimportd/uploadWeb.go b/src/rhimportd/uploadWeb.go
index e014f71..7d1f460 100644
--- a/src/rhimportd/uploadWeb.go
+++ b/src/rhimportd/uploadWeb.go
@@ -60,22 +60,18 @@ const (
 	webUploadMaxRequestSize = (2 << 30) - 1 // 2GB, (2 << 30) overflows int on 32-bit systems therefore we use 2GB - 1 Byte
 )
 
-func webUploadParseForm(w http.ResponseWriter, r *http.Request) (username, sessionid, srcfile string, src *multipart.Part) {
-	mpr, err := r.MultipartReader()
-	if err != nil {
-		rhl.Printf("WebUploadHandler: error while parsing multipart-form: %v", err)
-		webUploadErrorResponse(w, http.StatusBadRequest, err.Error())
+func webUploadParseForm(r *http.Request) (username, sessionid, srcfile string, src *multipart.Part, err error) {
+	var mpr *multipart.Reader
+	if mpr, err = r.MultipartReader(); err != nil {
 		return
 	}
 
 	for {
-		p, err := mpr.NextPart()
-		if err == io.EOF {
-			return
-		}
-		if err != nil {
-			rhl.Printf("WebUploadHandler: error while parsing multipart-form: %v", err)
-			webUploadErrorResponse(w, http.StatusBadRequest, err.Error())
+		var p *multipart.Part
+		if p, err = mpr.NextPart(); err != nil {
+			if err == io.EOF {
+				err = nil
+			}
 			return
 		}
 		var dstfield *string
@@ -87,16 +83,14 @@ func webUploadParseForm(w http.ResponseWriter, r *http.Request) (username, sessi
 		case "FILENAME":
 			srcfile = p.FileName()
 			src = p
-			return // don't read any fileds beyond this point because we would need to load the whole file in order to continue parsing
+			return // don't read any fields beyond this point because we would need to load the whole file in order to continue parsing
 		default:
 			rhdl.Printf("WebUploadHandler: ingoring unknown form field: '%s'", p.FormName())
 			continue
 		}
 
 		var buf bytes.Buffer
-		if _, err := io.CopyN(&buf, p, 1<<10); err != nil && err != io.EOF { // 1kB should be enough
-			rhl.Printf("WebUploadHandler: error while extracting form field: %v", err)
-			webUploadErrorResponse(w, http.StatusBadRequest, err.Error())
+		if _, err = io.CopyN(&buf, p, 1<<10); err != nil && err != io.EOF { // 1kB should be enough
 			return
 		}
 		*dstfield = buf.String()
@@ -124,7 +118,12 @@ func webUploadHandler(conf *rhimport.Config, db *rddb.DBChan, sessions *rhimport
 	}
 	r.Body = http.MaxBytesReader(w, r.Body, webUploadMaxRequestSize)
 
-	username, sessionid, srcfile, src := webUploadParseForm(w, r)
+	username, sessionid, srcfile, src, err := webUploadParseForm(r)
+	if err != nil {
+		rhl.Printf("WebUploadHandler: error while parsing multipart-form: %v", err)
+		webUploadErrorResponse(w, http.StatusBadRequest, err.Error())
+		return
+	}
 	if username == "" {
 		webUploadErrorResponse(w, http.StatusBadRequest, "missing field LOGIN_NAME")
 		return
@@ -166,6 +165,7 @@ func webUploadHandler(conf *rhimport.Config, db *rddb.DBChan, sessions *rhimport
 		}
 		chunk.Error = err
 		if err == io.EOF {
+			rhl.Printf("WebUploadHandler: upload for file '%s' finished", srcfile)
 			webUploadSuccessResponse(w)
 			return
 		}
-- 
cgit v0.10.2