support chunked mode

This commit is contained in:
thinkerou 2018-08-20 20:35:35 +08:00
parent c6110f970c
commit 237b94cd03
3 changed files with 49 additions and 0 deletions

View File

@ -5,6 +5,7 @@
package gin package gin
import ( import (
"bytes"
"errors" "errors"
"io" "io"
"io/ioutil" "io/ioutil"
@ -820,6 +821,26 @@ func (c *Context) DataFromReader(code int, contentLength int64, contentType stri
}) })
} }
func (c *Context) DataFromReaderStream(code int, offset int, contentType string, reader io.Reader, extraHeaders map[string]string) {
p := make([]byte, offset)
for {
n, err := reader.Read(p)
if err != nil {
if err == io.EOF {
break
}
panic(err)
}
c.Render(code, render.ReaderStream{
Headers: extraHeaders,
ContentType: contentType,
Reader: bytes.NewReader(p[:n]),
})
c.Writer.Flush()
}
}
// File writes the specified file into the body stream in a efficient way. // File writes the specified file into the body stream in a efficient way.
func (c *Context) File(filepath string) { func (c *Context) File(filepath string) {
http.ServeFile(c.Writer, c.Request, filepath) http.ServeFile(c.Writer, c.Request, filepath)

View File

@ -38,3 +38,30 @@ func (r Reader) writeHeaders(w http.ResponseWriter, headers map[string]string) {
} }
} }
} }
type ReaderStream struct {
ContentType string
Reader io.Reader
Headers map[string]string
}
// Render (ReaderStream) writes data with custom ContentType and headers.
func (r ReaderStream) Render(w http.ResponseWriter) (err error) {
r.WriteContentType(w)
r.writeHeaders(w, r.Headers)
_, err = io.Copy(w, r.Reader)
return
}
func (r ReaderStream) WriteContentType(w http.ResponseWriter) {
writeContentType(w, []string{r.ContentType})
}
func (r ReaderStream) writeHeaders(w http.ResponseWriter, headers map[string]string) {
header := w.Header()
for k, v := range headers {
if val := header[k]; len(val) == 0 {
header[k] = []string{v}
}
}
}

View File

@ -26,6 +26,7 @@ var (
_ Render = YAML{} _ Render = YAML{}
_ Render = MsgPack{} _ Render = MsgPack{}
_ Render = Reader{} _ Render = Reader{}
_ Render = ReaderStream{}
_ Render = AsciiJSON{} _ Render = AsciiJSON{}
_ Render = ProtoBuf{} _ Render = ProtoBuf{}
) )