Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion modules/packages/nuget/metadata.go
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ type nuspecPackage struct {
func ParsePackageMetaData(r io.ReaderAt, size int64) (*Package, error) {
archive, err := zip.NewReader(r, size)
if err != nil {
return nil, err
return nil, util.NewInvalidArgumentErrorf("not a valid NuGet package: %v", err)
}

for _, file := range archive.File {
Expand Down
2 changes: 1 addition & 1 deletion modules/packages/nuget/symbol_extractor.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ func (l PortablePdbList) Close() {
func ExtractPortablePdb(r io.ReaderAt, size int64) (PortablePdbList, error) {
archive, err := zip.NewReader(r, size)
if err != nil {
return nil, err
return nil, util.NewInvalidArgumentErrorf("not a valid symbols package: %v", err)
}

var pdbs PortablePdbList
Expand Down
15 changes: 7 additions & 8 deletions services/context/context_request.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,16 @@ import (
// Only form files need to get closed.
func (ctx *Context) UploadStream() (rd io.ReadCloser, needToClose bool, err error) {
contentType := strings.ToLower(ctx.Req.Header.Get("Content-Type"))
if strings.HasPrefix(contentType, "application/x-www-form-urlencoded") || strings.HasPrefix(contentType, "multipart/form-data") {
if strings.HasPrefix(contentType, "multipart/form-data") {
if err := ctx.Req.ParseMultipartForm(32 << 20); err != nil {
return nil, false, err
}
if ctx.Req.MultipartForm.File == nil {
return nil, false, http.ErrMissingFile
}
for _, files := range ctx.Req.MultipartForm.File {
if len(files) > 0 {
r, err := files[0].Open()
return r, true, err
if ctx.Req.MultipartForm != nil {
for _, files := range ctx.Req.MultipartForm.File {
if len(files) > 0 {
r, err := files[0].Open()
return r, true, err
}
}
}
return nil, false, http.ErrMissingFile
Expand Down
27 changes: 27 additions & 0 deletions tests/integration/api_packages_nuget_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"encoding/xml"
"fmt"
"io"
"mime/multipart"
"net/http"
"net/http/httptest"
neturl "net/url"
Expand Down Expand Up @@ -930,4 +931,30 @@ AAAjQmxvYgAAAGm7ENm9SGxMtAFVvPUsPJTF6PbtAAAAAFcVogEJAAAAAQAAAA==`)
AddBasicAuth(user.Name)
MakeRequest(t, req, http.StatusNotFound)
})

t.Run("UploadMultipartForm", func(t *testing.T) {
defer tests.PrintCurrentTest(t)()

packageContent := createPackage(packageName, packageVersion).Bytes()

// Simulate dotnet nuget push which sends multipart/form-data
var body bytes.Buffer
mpw := multipart.NewWriter(&body)
part, err := mpw.CreateFormFile("package", "package.nupkg")
assert.NoError(t, err)
_, err = part.Write(packageContent)
assert.NoError(t, err)
err = mpw.Close()
assert.NoError(t, err)

req := NewRequestWithBody(t, "PUT", url, &body).
AddBasicAuth(user.Name).
SetHeader("Content-Type", mpw.FormDataContentType())
Comment thread
silverwind marked this conversation as resolved.
Outdated
MakeRequest(t, req, http.StatusCreated)

// Clean up
req = NewRequest(t, "DELETE", fmt.Sprintf("%s/%s/%s", url, packageName, packageVersion)).
AddBasicAuth(user.Name)
MakeRequest(t, req, http.StatusNoContent)
Comment thread
silverwind marked this conversation as resolved.
})
}
Loading