bugfix Controller SaveToFile remove all temp file
This commit is contained in:
parent
3e19b0a6aa
commit
e455869ef6
@ -5,6 +5,7 @@
|
|||||||
- [add singleflight cache for cache module](https://github.com/beego/beego/pull/5119)
|
- [add singleflight cache for cache module](https://github.com/beego/beego/pull/5119)
|
||||||
- [Fix 5129: must set formatter after init the logger](https://github.com/beego/beego/pull/5130)
|
- [Fix 5129: must set formatter after init the logger](https://github.com/beego/beego/pull/5130)
|
||||||
- [Fix 5079: only log msg when the channel is not closed](https://github.com/beego/beego/pull/5132)
|
- [Fix 5079: only log msg when the channel is not closed](https://github.com/beego/beego/pull/5132)
|
||||||
|
- [Fix 4435: Controller SaveToFile remove all temp file](https://github.com/beego/beego/pull/5138)
|
||||||
|
|
||||||
# v2.0.7
|
# v2.0.7
|
||||||
- [Upgrade github.com/go-kit/kit, CVE-2022-24450](https://github.com/beego/beego/pull/5121)
|
- [Upgrade github.com/go-kit/kit, CVE-2022-24450](https://github.com/beego/beego/pull/5121)
|
||||||
|
|||||||
@ -102,7 +102,7 @@ func TestSetCookie(t *testing.T) {
|
|||||||
output.Context.Reset(httptest.NewRecorder(), r)
|
output.Context.Reset(httptest.NewRecorder(), r)
|
||||||
for _, item := range c.valueGp {
|
for _, item := range c.valueGp {
|
||||||
params := item.item
|
params := item.item
|
||||||
var others = []interface{}{params.MaxAge, params.Path, params.Domain, params.Secure, params.HttpOnly, params.SameSite}
|
others := []interface{}{params.MaxAge, params.Path, params.Domain, params.Secure, params.HttpOnly, params.SameSite}
|
||||||
output.Context.SetCookie(params.Name, params.Value, others...)
|
output.Context.SetCookie(params.Name, params.Value, others...)
|
||||||
got := output.Context.ResponseWriter.Header().Get("Set-Cookie")
|
got := output.Context.ResponseWriter.Header().Get("Set-Cookie")
|
||||||
if got != item.want {
|
if got != item.want {
|
||||||
|
|||||||
@ -71,11 +71,13 @@ func TestBind(t *testing.T) {
|
|||||||
|
|
||||||
{"/?human.Nick=astaxie", []testItem{{"human", Human{}, Human{Nick: "astaxie"}}}},
|
{"/?human.Nick=astaxie", []testItem{{"human", Human{}, Human{Nick: "astaxie"}}}},
|
||||||
{"/?human.ID=888&human.Nick=astaxie&human.Ms=true&human[Pwd]=pass", []testItem{{"human", Human{}, Human{ID: 888, Nick: "astaxie", Ms: true, Pwd: "pass"}}}},
|
{"/?human.ID=888&human.Nick=astaxie&human.Ms=true&human[Pwd]=pass", []testItem{{"human", Human{}, Human{ID: 888, Nick: "astaxie", Ms: true, Pwd: "pass"}}}},
|
||||||
{"/?human[0].ID=888&human[0].Nick=astaxie&human[0].Ms=true&human[0][Pwd]=pass01&human[1].ID=999&human[1].Nick=ysqi&human[1].Ms=On&human[1].Pwd=pass02",
|
{
|
||||||
|
"/?human[0].ID=888&human[0].Nick=astaxie&human[0].Ms=true&human[0][Pwd]=pass01&human[1].ID=999&human[1].Nick=ysqi&human[1].Ms=On&human[1].Pwd=pass02",
|
||||||
[]testItem{{"human", []Human{}, []Human{
|
[]testItem{{"human", []Human{}, []Human{
|
||||||
{ID: 888, Nick: "astaxie", Ms: true, Pwd: "pass01"},
|
{ID: 888, Nick: "astaxie", Ms: true, Pwd: "pass01"},
|
||||||
{ID: 999, Nick: "ysqi", Ms: true, Pwd: "pass02"},
|
{ID: 999, Nick: "ysqi", Ms: true, Pwd: "pass02"},
|
||||||
}}}},
|
}}},
|
||||||
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
"/?id=123&isok=true&ft=1.2&ol[0]=1&ol[1]=2&ul[]=str&ul[]=array&human.Nick=astaxie",
|
"/?id=123&isok=true&ft=1.2&ol[0]=1&ol[1]=2&ul[]=str&ul[]=array&human.Nick=astaxie",
|
||||||
|
|||||||
@ -15,8 +15,11 @@
|
|||||||
package web
|
package web
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"math"
|
"math"
|
||||||
|
"mime/multipart"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
"os"
|
"os"
|
||||||
@ -30,6 +33,12 @@ import (
|
|||||||
"github.com/beego/beego/v2/server/web/context"
|
"github.com/beego/beego/v2/server/web/context"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
fileKey = "file1"
|
||||||
|
testFile = filepath.Join(currentWorkDir, "test/static/file.txt")
|
||||||
|
toFile = filepath.Join(currentWorkDir, "test/static/file2.txt")
|
||||||
|
)
|
||||||
|
|
||||||
func TestGetInt(t *testing.T) {
|
func TestGetInt(t *testing.T) {
|
||||||
i := context.NewInput()
|
i := context.NewInput()
|
||||||
i.SetParam("age", "40")
|
i.SetParam("age", "40")
|
||||||
@ -260,6 +269,18 @@ func (t *TestRespController) TestResponse() {
|
|||||||
_ = t.Resp(bar)
|
_ = t.Resp(bar)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *TestRespController) TestSaveToFile() {
|
||||||
|
err := t.SaveToFile(fileKey, toFile)
|
||||||
|
if err != nil {
|
||||||
|
t.Ctx.WriteString("save file fail")
|
||||||
|
}
|
||||||
|
err = os.Remove(toFile)
|
||||||
|
if err != nil {
|
||||||
|
t.Ctx.WriteString("save file fail")
|
||||||
|
}
|
||||||
|
t.Ctx.WriteString("save file success")
|
||||||
|
}
|
||||||
|
|
||||||
type respTestCase struct {
|
type respTestCase struct {
|
||||||
Accept string
|
Accept string
|
||||||
ExpectedContentLength int64
|
ExpectedContentLength int64
|
||||||
@ -309,3 +330,72 @@ func testControllerRespTestCases(t *testing.T, tc respTestCase) {
|
|||||||
t.Errorf("TestResponse() failed to validate response body '%s' for %s", bodyString, tc.Accept)
|
t.Errorf("TestResponse() failed to validate response body '%s' for %s", bodyString, tc.Accept)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func createReqBody(filePath string) (string, io.Reader, error) {
|
||||||
|
var err error
|
||||||
|
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
|
bw := multipart.NewWriter(buf) // body writer
|
||||||
|
|
||||||
|
f, err := os.Open(filePath)
|
||||||
|
if err != nil {
|
||||||
|
return "", nil, err
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
_ = f.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
|
// text part1
|
||||||
|
p1w, _ := bw.CreateFormField("name")
|
||||||
|
_, err = p1w.Write([]byte("Tony Bai"))
|
||||||
|
if err != nil {
|
||||||
|
return "", nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// text part2
|
||||||
|
p2w, _ := bw.CreateFormField("age")
|
||||||
|
_, err = p2w.Write([]byte("15"))
|
||||||
|
if err != nil {
|
||||||
|
return "", nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// file part1
|
||||||
|
_, fileName := filepath.Split(filePath)
|
||||||
|
fw1, _ := bw.CreateFormFile(fileKey, fileName)
|
||||||
|
_, err = io.Copy(fw1, f)
|
||||||
|
if err != nil {
|
||||||
|
return "", nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
_ = bw.Close() // write the tail boundry
|
||||||
|
return bw.FormDataContentType(), buf, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestControllerSaveFile(t *testing.T) {
|
||||||
|
// create body
|
||||||
|
contType, bodyReader, err := createReqBody(testFile)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
// create fake POST request
|
||||||
|
r, _ := http.NewRequest("POST", "/upload_file", bodyReader)
|
||||||
|
r.Header.Set("Accept", context.ApplicationForm)
|
||||||
|
r.Header.Set("Content-Type", contType)
|
||||||
|
w := httptest.NewRecorder()
|
||||||
|
|
||||||
|
// setup the handler
|
||||||
|
handler := NewControllerRegister()
|
||||||
|
handler.Add("/upload_file", &TestRespController{},
|
||||||
|
WithRouterMethods(&TestRespController{}, "post:TestSaveToFile"))
|
||||||
|
handler.ServeHTTP(w, r)
|
||||||
|
|
||||||
|
response := w.Result()
|
||||||
|
bs := make([]byte, 100)
|
||||||
|
n, err := response.Body.Read(bs)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
if string(bs[:n]) == "save file fail" {
|
||||||
|
t.Errorf("TestSaveToFile() failed to validate response")
|
||||||
|
}
|
||||||
|
if response.StatusCode != http.StatusOK {
|
||||||
|
t.Errorf("TestSaveToFile() failed to validate response code for %s", context.ApplicationJSON)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
45
server/web/test/static/file.txt
Normal file
45
server/web/test/static/file.txt
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
<template>
|
||||||
|
<Container>
|
||||||
|
<div class="content">
|
||||||
|
<h1>
|
||||||
|
Upload files
|
||||||
|
</h1>
|
||||||
|
<div class="forms">
|
||||||
|
<FileForm v-bind:files="files['Model']" name="Model" v-on:upload="upload_model" v-on:submit="submit_model">
|
||||||
|
</FileForm>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import axios from 'axios'
|
||||||
|
import Container from '@/components/Container.vue'
|
||||||
|
import FileForm from '@/components/FileForm.vue'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'App',
|
||||||
|
data: function() {
|
||||||
|
return {
|
||||||
|
files: {},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
components: {
|
||||||
|
Container,
|
||||||
|
FileForm
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
upload_model: function(file) {
|
||||||
|
this.files['Model'] = file
|
||||||
|
},
|
||||||
|
submit_model: function() {
|
||||||
|
let formData = new FormData();
|
||||||
|
formData.append('Model', this.files['Model']);
|
||||||
|
axios.put('http://' + document.location.host + '/api/upload_model', formData)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted () {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
@ -209,8 +209,8 @@ func TestUnregisterFixedRouteLevel2(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func testHelperFnContentCheck(t *testing.T, handler *ControllerRegister,
|
func testHelperFnContentCheck(t *testing.T, handler *ControllerRegister,
|
||||||
testName, method, path, expectedBodyContent string) {
|
testName, method, path, expectedBodyContent string,
|
||||||
|
) {
|
||||||
r, err := http.NewRequest(method, path, nil)
|
r, err := http.NewRequest(method, path, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("httpRecorderBodyTest NewRequest error: %v", err)
|
t.Errorf("httpRecorderBodyTest NewRequest error: %v", err)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user