From 214030fad4b4601fdaf0c17e0f4c548f20e40fbf Mon Sep 17 00:00:00 2001 From: JessonChan Date: Thu, 12 Nov 2015 11:44:29 +0800 Subject: [PATCH] bytes reader replace string reader --- context/acceptencoder.go | 15 +++++---------- staticfile.go | 4 ++-- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/context/acceptencoder.go b/context/acceptencoder.go index c2a79fa1..c252cf6b 100644 --- a/context/acceptencoder.go +++ b/context/acceptencoder.go @@ -15,6 +15,7 @@ package context import ( + "bytes" "compress/flate" "compress/gzip" "io" @@ -22,30 +23,24 @@ import ( "os" "strconv" "strings" - - "io/ioutil" ) // WriteFile reads from file and writes to writer by the specific encoding(gzip/deflate) func WriteFile(encoding string, writer io.Writer, file *os.File) (bool, string, error) { - content, err := ioutil.ReadAll(file) - if err != nil { - return false, "", err - } - return writeLevel(encoding, writer, content, flate.BestCompression) + return writeLevel(encoding, writer, file, flate.BestCompression) } // WriteBody reads writes content to writer by the specific encoding(gzip/deflate) func WriteBody(encoding string, writer io.Writer, content []byte) (bool, string, error) { - return writeLevel(encoding, writer, content, flate.BestSpeed) + return writeLevel(encoding, writer, bytes.NewReader(content), flate.BestSpeed) } // writeLevel reads from reader,writes to writer by specific encoding and compress level // the compress level is defined by deflate package -func writeLevel(encoding string, writer io.Writer, content []byte, level int) (bool, string, error) { +func writeLevel(encoding string, writer io.Writer, reader io.Reader, level int) (bool, string, error) { var outputWriter io.Writer var err error if cf, ok := encoderMap[encoding]; ok { @@ -57,7 +52,7 @@ func writeLevel(encoding string, writer io.Writer, content []byte, level int) (b if err != nil { return false, "", err } - outputWriter.Write(content) + io.Copy(outputWriter, reader) switch outputWriter.(type) { case io.WriteCloser: outputWriter.(io.WriteCloser).Close() diff --git a/staticfile.go b/staticfile.go index 894d5c8d..5dae81ac 100644 --- a/staticfile.go +++ b/staticfile.go @@ -87,7 +87,7 @@ func serverStaticRouter(ctx *context.Context) { } type serveContentHolder struct { - *strings.Reader + *bytes.Reader modTime time.Time size int64 encoding string @@ -120,7 +120,7 @@ func openFile(filePath string, fi os.FileInfo, acceptEncoding string) (bool, str if err != nil { return false, "", nil, err } - mapFile = &serveContentHolder{Reader: strings.NewReader(string(bufferWriter.Bytes())), modTime: fi.ModTime(), size: int64(bufferWriter.Len()), encoding: n} + mapFile = &serveContentHolder{Reader: bytes.NewReader(bufferWriter.Bytes()), modTime: fi.ModTime(), size: int64(bufferWriter.Len()), encoding: n} staticFileMap[mapKey] = mapFile }