- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我试图在 golang 中使用 httptest
包。我发现了一些我不明白的东西。这是 code :
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
"net/http/httptest"
)
func main() {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello1"))
}))
ts.Close()
ts = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello2"))
}))
ts.Close()
ts = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(100)
w.Write([]byte("Hello3"))
}))
res, err := http.Get(ts.URL)
if err != nil {
log.Fatal(err)
}
greeting, err := ioutil.ReadAll(res.Body)
res.Body.Close()
if err != nil {
log.Fatal(err)
}
ts.Close()
fmt.Printf("%s", greeting)
}
在此代码示例中,我多次尝试打开和关闭 httptest
服务器。它以某种方式在 The Go Playground 中造成了僵局。我在自己的环境(Go版本:go1.7.4 darwin/amd64)上试了一下,导致挂了,一点 react 都没有。
我的问题是:为什么 w.WriteHeader(100)
导致了死锁,而 w.WriteHeader(200)
却没有?是 Golang 核心库的错误还是我误解了一些用法?谢谢!
最佳答案
如果稍微修改一下代码:
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
"net/http/httptest"
)
func main() {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello1"))
}))
ts.Close()
ts = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello2"))
}))
ts.Close()
ts = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(100)
w.Write([]byte("Hello3"))
}))
fmt.Println("before get") ///// . <----
res, err := http.Get(ts.URL)
fmt.Println("after get") ///// . <----
if err != nil {
log.Fatal(err)
}
greeting, err := ioutil.ReadAll(res.Body)
res.Body.Close()
if err != nil {
log.Fatal(err)
}
ts.Close()
fmt.Printf("%s", greeting)
}
然后运行它 - 你只会看到第一行。
这意味着 Go http 客户端需要您提供更多数据。所以就挂线上了
res, err := http.Get(ts.URL)
并且无法到达下面的 ts.Close()
。
下一步 - 让我们修改一个测试,它会关闭一个连接,并以此方式释放一个客户端等待锁:
ts = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(100)
w.Write([]byte("Hello3"))
hj, _ := w.(http.Hijacker)
conn, _, _ := hj.Hijack()
conn.Close()
}))
我明确地关闭了连接,但是这样你就可以同时获得检查字符串和测试完成。试试吧。
当然这是违反 HTTP 协议(protocol)的,所以我得到一个错误:
Get http://127.0.0.1:54243: net/http: HTTP/1.x transport connection broken: unexpected EOF
关于http.ResponseWriter.WriteHeader() 导致死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47923284/
我知道 ResponseWriter 上的 startElement、endElement 和 writeAttribute 方法。我的问题是,例如,我想通过将 h:commandLink 声明为 H
我从 Brian W. Kernighan 和 Alan Donovan 的书 The Go Programming Language 中编写了任务。这是任务 № 3.4我的请求处理程序如下所示: f
出于调试原因,我想直接在标准输出中查看我的 ResponseWriter 的输出。因为响应将由 JavaScript 处理,所以我无法在那里看到输出。 是否有一种简单的解决方案可以将 Response
我无法理解 ResponseWriter 语法的一部分。 type ResponseWriter interface { Header() Header Write([]byte) (
我无法理解 ResponseWriter 语法的一部分。 type ResponseWriter interface { Header() Header Write([]byte) (
我不明白为什么代码正确生成了 view.html 和 post.html 数据,但将其全部显示为原始文本。我一直在关注指南 here在我构建它时,我认为从 Execute 函数生成的 html 将被发
func main() { http.HandleFunc("/", foo) http.ListenAndServe(":3000", nil) } func foo(w http.Resp
我试图在 golang 中使用 httptest 包。我发现了一些我不明白的东西。这是 code : package main import ( "fmt" "io/ioutil"
我想弄清楚是否有可能在编写 Web 应用程序时不必随处传递 http.ResponseWriter。我正在设置一个简单的 mvc web 框架,我发现自己必须通过各种函数传递 http.Respons
假设我有一个向 http.ResponseWriter 添加特定 header 的中心方法。我不想使用 HandleFunc 包装器。 我想知道,我是否会通过引用发送 ResponseWriter。那
我正在做一些测试,我意识到编写器不会自动刷新,即在所有组件都已呈现之前,我在客户端看不到任何响应? 我还尝试手动刷新响应编写器,但没有任何区别。有没有办法允许手动刷新,以便客户端更早地获得响应? 谢谢
我编写了一个简单的http HandleFunc,需要2秒钟来处理,然后我将超时时间为1秒的请求发送到服务器。我希望调用ResponseWriter.Write会返回错误,但不会。请给我解释一下。 服
我正在尝试创建一个存储 http.ResponseWriters 的映射,以便稍后在单独的线程完成相关计算后写入它们。该 map 在我的主要定义如下: jobs := make(map[uint32]
在我点击前端的发布按钮后,我将数据接收到我的处理程序,创建电子邮件并发送它,但我想通知用户电子邮件的状态(已发送或未发送)并将其重定向回主页。问题是我不知道如何同时传递 alert 和 redirec
我正在用 GoLang 编写代码。作为其中的一部分,我通过使用 github.com/mongodb/mongo-go-driver/mongo、github.com/mongodb/mongo-go
我是 Go 的新手。但是我正在玩 REST Api。在我拥有的两个函数中,我无法从 json.Marshal 获得与 json.Encoder 相同的行为 我想使用这个函数来 gzip 我的回复: f
我有一个 Web 应用程序需要不断写入(可能永远不会结束)http.ResponseWriter,并将这些输出显示到 html 页面。它是这样的: func handler(w http.Respon
我正在使用 go 1.4.2 并且实现似乎没有 CloseNotifier 因为我想在长轮询处理程序中使用它,例如: func Pollhandler(w http.ResponseWriter, r
我对 go http 包进行了一些实验。 看下面的代码片段,一个非常简单的http服务器: package main import ( "fmt" "github.com/codega
给定一个http.ResponseWriter,它已经完成了一些.Write(),是否可以直接获得响应的当前累计长度? 我很确定这可以通过 Hijack 转换来完成,但我想知道是否可以直接完成。 最佳
我是一名优秀的程序员,十分优秀!