Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 61de450

Browse filesBrowse files
committed
Fixed compressor to function before data is passed to stream
1 parent f07a561 commit 61de450
Copy full SHA for 61de450

File tree

2 files changed

+31
-30
lines changed
Filter options

2 files changed

+31
-30
lines changed

‎compress.go

Copy file name to clipboardExpand all lines: compress.go
+27-26Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ type WriteFlusher interface {
4040
}
4141

4242
type CompressResponseWriter struct {
43-
ServerResponse
43+
Header ServerHeader
44+
OriginalWriter io.Writer
4445
compressWriter WriteFlusher
4546
compressionType string
4647
headersWritten bool
@@ -52,20 +53,20 @@ type CompressResponseWriter struct {
5253
// CompressFilter does compresssion of response body in gzip/deflate if
5354
// `results.compressed=true` in the app.conf
5455
func CompressFilter(c *Controller, fc []Filter) {
55-
fc[0](c, fc[1:])
5656
if Config.BoolDefault("results.compressed", false) {
5757
if c.Response.Status != http.StatusNoContent && c.Response.Status != http.StatusNotModified {
58-
writer := CompressResponseWriter{c.Response.Out, nil, "", false, make(chan bool, 1), nil, false}
59-
writer.DetectCompressionType(c.Request, c.Response)
60-
w, ok := c.Response.Out.(http.CloseNotifier)
61-
if ok {
62-
writer.parentNotify = w.CloseNotify()
58+
if found, compressType, compressWriter := detectCompressionType(c.Request, c.Response); found {
59+
writer := CompressResponseWriter{c.Response.Out.Header(), c.Response.Out.GetWriter(), compressWriter, compressType, false, make(chan bool, 1), nil, false}
60+
if w, ok := c.Response.Out.(http.CloseNotifier); ok {
61+
writer.parentNotify = w.CloseNotify()
62+
}
63+
c.Response.Out.SetWriter(&writer)
6364
}
64-
c.Response.Out.SetWriter(&writer)
6565
} else {
6666
TRACE.Printf("Compression disabled for response status (%d)", c.Response.Status)
6767
}
6868
}
69+
fc[0](c, fc[1:])
6970
}
7071

7172
func (c CompressResponseWriter) CloseNotify() <-chan bool {
@@ -77,16 +78,16 @@ func (c CompressResponseWriter) CloseNotify() <-chan bool {
7778

7879
func (c *CompressResponseWriter) prepareHeaders() {
7980
if c.compressionType != "" {
80-
responseMime := c.Header().Get("Content-Type")
81+
responseMime := c.Header.Get("Content-Type")
8182
responseMime = strings.TrimSpace(strings.SplitN(responseMime, ";", 2)[0])
8283
shouldEncode := false
8384

84-
if c.Header().Get("Content-Encoding") == "" {
85+
if c.Header.Get("Content-Encoding") == "" {
8586
for _, compressableMime := range compressableMimes {
8687
if responseMime == compressableMime {
8788
shouldEncode = true
88-
c.Header().Set("Content-Encoding", c.compressionType)
89-
c.Header().Del("Content-Length")
89+
c.Header.Set("Content-Encoding", c.compressionType)
90+
c.Header.Del("Content-Length")
9091
break
9192
}
9293
}
@@ -102,15 +103,14 @@ func (c *CompressResponseWriter) prepareHeaders() {
102103
func (c *CompressResponseWriter) WriteHeader(status int) {
103104
c.headersWritten = true
104105
c.prepareHeaders()
105-
c.ServerResponse.Header().SetStatus(status)
106+
c.Header.SetStatus(status)
106107
}
107108

108109
func (c *CompressResponseWriter) Close() error {
109110
if c.compressionType != "" {
110-
_ = c.compressWriter.Close()
111-
}
112-
if w, ok := c.ServerResponse.GetWriter().(io.Closer); ok {
113-
_ = w.Close()
111+
if err := c.compressWriter.Close(); err != nil {
112+
ERROR.Println("Error closing compress writer", err)
113+
}
114114
}
115115
// Non-blocking write to the closenotifier, if we for some reason should
116116
// get called multiple times
@@ -139,17 +139,15 @@ func (c *CompressResponseWriter) Write(b []byte) (int, error) {
139139
c.prepareHeaders()
140140
c.headersWritten = true
141141
}
142-
143142
if c.compressionType != "" {
144143
return c.compressWriter.Write(b)
145144
}
146-
147-
return c.ServerResponse.GetWriter().Write(b)
145+
return c.OriginalWriter.Write(b)
148146
}
149147

150-
// DetectCompressionType method detects the comperssion type
148+
// DetectCompressionType method detects the compression type
151149
// from header "Accept-Encoding"
152-
func (c *CompressResponseWriter) DetectCompressionType(req *Request, resp *Response) {
150+
func detectCompressionType(req *Request, resp *Response) (found bool, compressionType string, compressionKind WriteFlusher) {
153151
if Config.BoolDefault("results.compressed", false) {
154152
acceptedEncodings := strings.Split(req.In.GetHeader().Get("Accept-Encoding"), ",")
155153

@@ -216,13 +214,16 @@ func (c *CompressResponseWriter) DetectCompressionType(req *Request, resp *Respo
216214
return
217215
}
218216

219-
c.compressionType = compressionTypes[chosenEncoding]
217+
compressionType = compressionTypes[chosenEncoding]
220218

221-
switch c.compressionType {
219+
switch compressionType {
222220
case "gzip":
223-
c.compressWriter = gzip.NewWriter(resp.Out.GetWriter())
221+
compressionKind = gzip.NewWriter(resp.Out.GetWriter())
222+
found = true
224223
case "deflate":
225-
c.compressWriter = zlib.NewWriter(resp.Out.GetWriter())
224+
compressionKind = zlib.NewWriter(resp.Out.GetWriter())
225+
found = true
226226
}
227227
}
228+
return
228229
}

‎engine_adapter_go.go

Copy file name to clipboardExpand all lines: engine_adapter_go.go
+4-4Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -223,10 +223,10 @@ func (r *GOResponse) SetWriter(writer io.Writer) {
223223
}
224224
func (r *GOResponse) WriteStream(name string, contentlen int64, modtime time.Time,reader io.Reader) error {
225225

226-
if rs, ok := reader.(io.ReadSeeker); ok {
227-
// http.ServeContent doesn't know about response.ContentType, so we set the respective header.
226+
if rs, ok := reader.(io.ReadSeeker); ok {
227+
// Call ServeContent to serve the content
228228
http.ServeContent(r.Original, r.Request, name, modtime, rs)
229-
} else {
229+
} else {
230230
// Else, do a simple io.Copy.
231231
ius := r.Request.Header.Get("If-Unmodified-Since")
232232
if t, err := http.ParseTime(ius); err == nil && !modtime.IsZero() {
@@ -253,7 +253,7 @@ func (r *GOResponse) WriteStream(name string, contentlen int64, modtime time.Tim
253253
} else {
254254
r.Original.WriteHeader(http.StatusOK)
255255
}
256-
}
256+
}
257257
return nil
258258
}
259259

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.