使用 http.Client 创建一个损坏的表格
Create a broken form with http.Client
如何使用 http.Client
创建用于测试目的的 'broken' 表单,它将在处理程序函数中触发 ParseForm()
上的响应错误?
我有以下代码:
func (app *App) signupUser(w http.ResponseWriter, r *http.Request) {
err := r.ParseForm()
if err != nil { // how to trigger this if statement?
sendStatus(w, http.StatusBadRequest, "error parsing form")
return
}
...
然后在测试期间我使用 http.Client
来测试这个控制器:
resp, err = client.PostForm(ts.URL+"/user/signup", url.Values{
"email": {testEmail},
"password": {goodPassword},
)
if err != nil {
t.Error(err) // I never get here
}
首先 client.PostForm
会正确填充 post 表单,因此您必须手动填充它。
然后,如果您深入研究 r.ParseForm()
的调用堆栈,您最终会找到错误产生者(除了读取问题等):
"net/url".QueryUnescape
其中“returns 如果任何 % 后面没有跟两个十六进制数字,则会出错。”
因此,例如:
r := &http.Request{
// ensures it reads the body
Method: "POST",
// string with bad url encoding '%3z'
Body: io.NopCloser(strings.NewReader("foo%3z1%26bar%3D2")),
// ensures it parses the body as post form
Header: map[string][]string{
"Content-Type": []string{
"application/x-www-form-urlencoded",
},
},
}
err := r.ParseForm()
if err == nil {
panic("no err")
}
// err -> invalid URL escape "%3z"
如何使用 http.Client
创建用于测试目的的 'broken' 表单,它将在处理程序函数中触发 ParseForm()
上的响应错误?
我有以下代码:
func (app *App) signupUser(w http.ResponseWriter, r *http.Request) {
err := r.ParseForm()
if err != nil { // how to trigger this if statement?
sendStatus(w, http.StatusBadRequest, "error parsing form")
return
}
...
然后在测试期间我使用 http.Client
来测试这个控制器:
resp, err = client.PostForm(ts.URL+"/user/signup", url.Values{
"email": {testEmail},
"password": {goodPassword},
)
if err != nil {
t.Error(err) // I never get here
}
首先 client.PostForm
会正确填充 post 表单,因此您必须手动填充它。
然后,如果您深入研究 r.ParseForm()
的调用堆栈,您最终会找到错误产生者(除了读取问题等):
"net/url".QueryUnescape
其中“returns 如果任何 % 后面没有跟两个十六进制数字,则会出错。”
因此,例如:
r := &http.Request{
// ensures it reads the body
Method: "POST",
// string with bad url encoding '%3z'
Body: io.NopCloser(strings.NewReader("foo%3z1%26bar%3D2")),
// ensures it parses the body as post form
Header: map[string][]string{
"Content-Type": []string{
"application/x-www-form-urlencoded",
},
},
}
err := r.ParseForm()
if err == nil {
panic("no err")
}
// err -> invalid URL escape "%3z"