Merge 04eb752099d3efaadbc2095d6fa20cb358fc91bb into ecdbbbe9483dd12222f2085f717a2c7cb5ac55fe

This commit is contained in:
thinkerou 2024-02-19 20:29:33 -08:00 committed by GitHub
commit 17c89d6392
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 49 additions and 0 deletions

View File

@ -5,6 +5,7 @@
package gin
import (
"bytes"
"errors"
"io"
"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.
func (c *Context) File(filepath string) {
http.ServeFile(c.Writer, c.Request, filepath)

View File

@ -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}
}
}
}

View File

@ -28,6 +28,7 @@ var (
_ HTMLRender = HTMLProduction{}
_ Render = YAML{}
_ Render = Reader{}
_ Render = ReaderStream{}
_ Render = AsciiJSON{}
_ Render = ProtoBuf{}
_ Render = TOML{}