echo服务器扭曲图像响应体

时间:2014-06-23 19:25:28

标签: go

尝试为图像编写一个简单的echo服务器,但它会扭曲文件。出了什么问题?

package main

import (
    "fmt"
    "io"
    "net/http"
)

type FlushWriter struct {
    w io.Writer
}

func (fw *FlushWriter) Write(bytes []byte) (int, error) {
    count, e := fw.w.Write(bytes)
    fw.w.(http.Flusher).Flush()
    return count, e
}

func main() {
    http.HandleFunc("/", index)
    fmt.Println("listening on 8000")
    http.ListenAndServe(":8000", nil)
}

func index(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "image/jpeg")
    fw := &FlushWriter{ w: w }
    io.Copy(fw, r.Body)
}

并测试它。

$ curl --data-binary @image.jpg -o test.jpg localhost:8000

1 个答案:

答案 0 :(得分:2)

您忽略了代码中的错误,错过了ErrBodyReadAfterClose

一旦开始写http.Request.Body

,就无法从http.ResponseWriter读取内容

http://golang.org/pkg/net/http/#pkg-variables

  

读取请求或响应时返回ErrBodyReadAfterClose   身体关闭后的身体。这通常发生在   在HTTP处理程序调用WriteHeader或Write之后读取body   ResponseWriter

在写回之前,您需要在服务器上缓冲图像。

除了Go不会让你这样做之外,即使你要制作一个有效的处理程序,大多数客户端都会因为图像大于所涉及的所有缓冲区的总和而导致死锁。这需要一个可以同时发送和接收的客户端,如果有的话,很少会发送和接收。