package utils_test import ( "errors" "fmt" "io" "io/ioutil" "mime" "net/http" "strings" "testing" "fiskerinc.com/modules/utils" ) func TestMultipartParser(t *testing.T) { err := execMultipartParser() if err != nil { t.Error(err) } } func BenchmarkMutipartParser(b *testing.B) { b.ReportAllocs() for i := 0; i < b.N; i++ { execMultipartParser() } } func execMultipartParser() error { r := getRequestPOSTFormFile() mediaType, params, err := mime.ParseMediaType(r.Header.Get("Content-Type")) if err != nil { return err } if !strings.HasPrefix(mediaType, "multipart/") { return errors.New("requires multipart") } if len(params["boundary"]) > 70 { return errors.New("boundary too long") } info, err := utils.FindFilePart(r, params["boundary"], "file", nil) if info.Part == nil { return errors.New("file not found") } if err != nil { return err } encryptor := func(input []byte) []byte { return input } pReader, pWriter := io.Pipe() defer pReader.Close() defer info.Part.Close() go utils.ChunkFilePart(pWriter, info, encryptor) err = func() error { _, err := ioutil.ReadAll(pReader) return err }() if err != nil { return err } return nil } func getRequestPOSTFormFile() *http.Request { postData := `--xxx Content-Disposition: form-data; name="field1" value1 --xxx Content-Disposition: form-data; name="file"; filename="test.txt" Content-Type: text/plain We're leavin' together But still it's farewell And maybe we'll come back To Earth, who can tell? I guess there is no one to blame We're leaving ground (leaving ground) Will things ever be the same again? It's the final countdown The final countdown We're leavin' together But still it's farewell And maybe we'll come back To Earth, who can tell? I guess there is no one to blame We're leaving ground (leaving ground) Will things ever be the same again? It's the final countdown The final countdown We're leavin' together But still it's farewell And maybe we'll come back To Earth, who can tell? I guess there is no one to blame We're leaving ground (leaving ground) Will things ever be the same again? It's the final countdown The final countdown We're leavin' together But still it's farewell And maybe we'll come back To Earth, who can tell? I guess there is no one to blame We're leaving ground (leaving ground) Will things ever be the same again? It's the final countdown The final countdown We're leavin' together But still it's farewell And maybe we'll come back To Earth, who can tell? I guess there is no one to blame We're leaving ground (leaving ground) Will things ever be the same again? It's the final countdown The final countdown We're leavin' together But still it's farewell And maybe we'll come back To Earth, who can tell? I guess there is no one to blame We're leaving ground (leaving ground) Will things ever be the same again? It's the final countdown The final countdown We're leavin' together But still it's farewell And maybe we'll come back To Earth, who can tell? I guess there is no one to blame We're leaving ground (leaving ground) Will things ever be the same again? It's the final countdown The final countdown We're leavin' together But still it's farewell And maybe we'll come back To Earth, who can tell? I guess there is no one to blame We're leaving ground (leaving ground) Will things ever be the same again? It's the final countdown The final countdown --xxx-- ` request, err := http.NewRequest(http.MethodPost, "/", ioutil.NopCloser(strings.NewReader(postData))) if err != nil { fmt.Print(err) } request.Header.Add("Content-Type", "multipart/form-data; boundary=xxx") return request }