mirror of
https://github.com/gin-gonic/gin.git
synced 2025-10-16 05:16:35 +08:00
Merge 04eb752099d3efaadbc2095d6fa20cb358fc91bb into ecdbbbe9483dd12222f2085f717a2c7cb5ac55fe
This commit is contained in:
commit
17c89d6392
21
context.go
21
context.go
@ -5,6 +5,7 @@
|
|||||||
package gin
|
package gin
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
@ -1036,6 +1037,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 an efficient way.
|
// File writes the specified file into the body stream in an 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)
|
||||||
|
@ -46,3 +46,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}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -28,6 +28,7 @@ var (
|
|||||||
_ HTMLRender = HTMLProduction{}
|
_ HTMLRender = HTMLProduction{}
|
||||||
_ Render = YAML{}
|
_ Render = YAML{}
|
||||||
_ Render = Reader{}
|
_ Render = Reader{}
|
||||||
|
_ Render = ReaderStream{}
|
||||||
_ Render = AsciiJSON{}
|
_ Render = AsciiJSON{}
|
||||||
_ Render = ProtoBuf{}
|
_ Render = ProtoBuf{}
|
||||||
_ Render = TOML{}
|
_ Render = TOML{}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user