Files
cloud-services/pkg/utils/multipart_parser_test.go

172 lines
3.6 KiB
Go

package utils_test
import (
"errors"
"fmt"
"io"
"io/ioutil"
"mime"
"net/http"
"strings"
"testing"
"github.com/fiskerinc/cloud-services/pkg/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
}