From a5ed110385da9f101c17e00351663c7f3f024358 Mon Sep 17 00:00:00 2001 From: Christian Pointner <equinox@helsinki.at> Date: Sun, 16 Sep 2018 16:55:13 +0200 Subject: [PATCH] some cleanup --- api/v1/api_uploads.go | 104 ++++++++++++++++++++++++++---------------- 1 file changed, 64 insertions(+), 40 deletions(-) diff --git a/api/v1/api_uploads.go b/api/v1/api_uploads.go index d79e172..4883a40 100644 --- a/api/v1/api_uploads.go +++ b/api/v1/api_uploads.go @@ -246,6 +246,15 @@ func getOrNewFlowJSFile(job *importer.Job, flowId string, chunk, totalChunks, to //*** +const ( + FlowJSParamID string = "flowIdentifier" + FlowJSParamChunk string = "flowChunkNumber" + FlowJSParamTotalChunks string = "flowTotalChunks" + FlowJSParamCurrentChunkSize string = "flowCurrentChunkSize" + FlowJSParamTotalSize string = "flowTotalSize" + FlowJSParamFile string = "file" +) + func getFlowJSParameterFromMultipart(r *http.Request) (id string, chunk, totalChunks, chunkSize, totalSize uint64, data io.Reader, err error) { var mr *multipart.Reader if mr, err = r.MultipartReader(); err != nil { @@ -263,7 +272,7 @@ func getFlowJSParameterFromMultipart(r *http.Request) (id string, chunk, totalCh } pn := p.FormName() - if pn == "file" { + if pn == FlowJSParamFile { data = p break } @@ -272,51 +281,89 @@ func getFlowJSParameterFromMultipart(r *http.Request) (id string, chunk, totalCh return } switch pn { - case "flowIdentifier": + case FlowJSParamID: id = string(pd) - case "flowChunkNumber": + case FlowJSParamChunk: if chunk, err = strconv.ParseUint(string(pd), 10, 64); err != nil { - err = errors.New("invalid parameter 'flowChunkNumber': " + err.Error()) + err = fmt.Errorf("invalid parameter '%s': %v", FlowJSParamChunk, err.Error()) return } - case "flowTotalChunks": + case FlowJSParamTotalChunks: if totalChunks, err = strconv.ParseUint(string(pd), 10, 64); err != nil { - err = errors.New("invalid parameter 'flowTotalChunk': " + err.Error()) + err = fmt.Errorf("invalid parameter '%s': %v", FlowJSParamTotalChunks, err.Error()) return } - case "flowCurrentChunkSize": + case FlowJSParamCurrentChunkSize: if chunkSize, err = strconv.ParseUint(string(pd), 10, 64); err != nil { - err = errors.New("invalid parameter 'flowCurrentChunkSize': " + err.Error()) + err = fmt.Errorf("invalid parameter '%s': %v", FlowJSParamCurrentChunkSize, err.Error()) return } - case "flowTotalSize": + case FlowJSParamTotalSize: if totalSize, err = strconv.ParseUint(string(pd), 10, 64); err != nil { - err = errors.New("invalid parameter 'flowTotalSize': " + err.Error()) + err = fmt.Errorf("invalid parameter '%s': %v", FlowJSParamTotalSize, err.Error()) return } } } + var missing []string if id == "" { - missing = append(missing, "flowIdentifier") + missing = append(missing, FlowJSParamID) } if chunk == 0 { - missing = append(missing, "flowChunkNumber") + missing = append(missing, FlowJSParamChunk) } if totalChunks == 0 { - missing = append(missing, "flowTotalChunks") + missing = append(missing, FlowJSParamTotalChunks) } if chunkSize == 0 { - missing = append(missing, "flowCurrentChunkSize") + missing = append(missing, FlowJSParamCurrentChunkSize) } if totalSize == 0 { - missing = append(missing, "flowTotalSize") + missing = append(missing, FlowJSParamTotalSize) } if data == nil { - missing = append(missing, "file") + missing = append(missing, FlowJSParamFile) + } + if len(missing) > 0 { + err = errors.New("missing/invalid mandatory parameter: " + strings.Join(missing, ", ")) + } + return +} + +//*** + +func getFlowJSParameterFromQuery(r *http.Request) (id string, chunk, totalChunks, totalSize uint64, err error) { + q := r.URL.Query() + id = q.Get(FlowJSParamID) + if chunk, err = strconv.ParseUint(q.Get(FlowJSParamChunk), 10, 64); err != nil { + err = fmt.Errorf("invalid parameter '%s': %v", FlowJSParamChunk, err.Error()) + return + } + if totalChunks, err = strconv.ParseUint(q.Get(FlowJSParamTotalChunks), 10, 64); err != nil { + err = fmt.Errorf("invalid parameter '%s': %v", FlowJSParamTotalChunks, err.Error()) + return + } + if totalSize, err = strconv.ParseUint(q.Get(FlowJSParamTotalSize), 10, 64); err != nil { + err = fmt.Errorf("invalid parameter '%s': %v", FlowJSParamTotalSize, err.Error()) + return + } + + var missing []string + if id == "" { + missing = append(missing, FlowJSParamID) + } + if chunk == 0 { + missing = append(missing, FlowJSParamChunk) + } + if totalChunks == 0 { + missing = append(missing, FlowJSParamTotalChunks) + } + if totalSize == 0 { + missing = append(missing, FlowJSParamTotalSize) } if len(missing) > 0 { - err = errors.New("missing mandatory parameter: " + strings.Join(missing, ", ")) + err = errors.New("missing/invalid mandatory parameter: " + strings.Join(missing, ", ")) } return } @@ -380,33 +427,10 @@ func (api *API) UploadFileFlowJS() http.Handler { sendWebResponse(w, http.StatusInternalServerError, ErrorResponse{Error: "failed to mark chunk completed: " + err.Error()}) return } - // TODO: if this is the last chunk to be uploaded wait for fetch converter to finish? sendWebResponse(w, http.StatusOK, nil) }) } -func getFlowJSParameterFromQuery(r *http.Request) (id string, chunk, totalChunks, totalSize uint64, err error) { - q := r.URL.Query() - id = q.Get("flowIdentifier") - if chunk, err = strconv.ParseUint(q.Get("flowChunkNumber"), 10, 64); err != nil { - err = errors.New("invalid query parameter 'flowChunkNumber': " + err.Error()) - return - } - if chunk < 1 { - err = errors.New("invalid chunk number: 0") - return - } - if totalChunks, err = strconv.ParseUint(q.Get("flowTotalChunks"), 10, 64); err != nil { - err = errors.New("invalid query parameter 'flowTotalChunks': " + err.Error()) - return - } - if totalSize, err = strconv.ParseUint(q.Get("flowTotalSize"), 10, 64); err != nil { - err = errors.New("invalid query parameter 'flowTotalSize': " + err.Error()) - return - } - return -} - func (api *API) TestFileFlowJS() http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) -- GitLab