渲染后返回语句的 Golang lint

标签 go

如果您不在渲染语句后编写return,您将向客户端发送多个HTTP 状态。我真的很想避免这种情况,因为它既可能具有安全隐患,但也只是……奇怪的行为。

例子:

if passwordNotCorrect {
    w.WriteHeader(http.StatusUnauthorized)
    render.JSON(w, r, nil)
    return // If this is missing, we will return both 401 and 200.
}

w.WriteHeader(http.StatusOK)
render.JSON(w, r, nil)
return

是否有任何 linter 可以就此向您发出警告,以避免愚蠢的错误?

最佳答案

我认为这是一个不错的单元测试案例。像您所描述的那样,模拟会很高兴地失败:

// foo.go

package foo

type Foo struct{
  render Renderer
}

func New(r Renderer) *Foo {
  return &Foo{render: r}
}

func (f *Foo) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  if passwordNotCorrect {
    w.WriteHeader(http.StatusUnauthorized)
    render.JSON(w, r, nil)
    return // If this is missing, we will return both 401 and 200.
  }

  w.WriteHeader(http.StatusOK)
  render.JSON(w, r, nil)
  return
}

现在进行测试...

// foo_test.go

package foo_test

import (
  "github.com/something/whatever/foo"
  "github.com/golang/mock/gomock"
)

//go:generate mockgen --source=foo.go --destination=mock_test.go --package=foo_test

func TestFoo(t *testing.T) {
  ctrl := gomock.NewController(t)
  defer ctrl.Finish()

  mockRenderer := NewMockRenderer(ctrl)
  mockRenderer.
    EXPECT().
    JSON(gomock.Any(), gomock.Any(), gomock.Any()) // This will fail JSON is invoked twice

  f := foo.New(mockRenderer)
  req := httptest.NewRequest(http.MethodGet, "http://some.url", nil)
  f.ServeHTTP(httptest.NewRecorder(), req)
}

这假设 render 不是一个包。然后需要进行一些调整。

关于渲染后返回语句的 Golang lint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53808582/

相关文章:

go - 为什么我不能导入 pkg "builtin"?

file - 检查文件是否位于基本目录中的最安全方法是什么?

go - GoLand找不到引用: “Unresolved reference ' NewRGBA' ”

google-app-engine - Cron Job在Google云端上多次运行

multithreading - Go 调度器什么时候会创建新的 M 和 P?

go - sort.Search,寻找一个不在 slice 中的数

用于 Web 应用程序的 node.js golang 复合架构

go - 如何在编码(marshal)中省略结构的条件字段

javascript - 从服务器发送 JSON 需要 JSON.parse 两次

pointers - 在golang中使用指针进行多次分配和创建