【问题标题】:Create a broken form with http.Client使用 http.Client 创建一个损坏的表单
【发布时间】:2021-07-06 21:26:15
【问题描述】:

如何使用http.Client 创建一个用于测试目的的“损坏”表单,这将在处理程序函数中触发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
}

【问题讨论】:

    标签: forms go testing http.client


    【解决方案1】:

    首先client.PostForm 会正确填写帖子表单,因此您必须手动填写。

    然后,如果您深入了解r.ParseForm() 的调用堆栈,您最终会找到错误产生者(除非出现读取问题等):

    "net/url".QueryUnescape 其中“如果任何 % 后面没有两个十六进制数字,则返回错误。

    所以,例如:

        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"
    

    【讨论】:

    • 谢谢!这正是我一直在寻找的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多