mirror of
https://github.com/kataras/iris.git
synced 2025-03-15 17:36:29 +01:00
fix future issues like #1607
This commit is contained in:
parent
9c56ed6261
commit
39e3911d41
|
@ -184,6 +184,8 @@ type CompressResponseWriter struct {
|
||||||
CompressWriter
|
CompressWriter
|
||||||
ResponseWriter
|
ResponseWriter
|
||||||
|
|
||||||
|
http.Hijacker
|
||||||
|
|
||||||
Disabled bool
|
Disabled bool
|
||||||
Encoding string
|
Encoding string
|
||||||
Level int
|
Level int
|
||||||
|
@ -204,6 +206,21 @@ func AcquireCompressResponseWriter(w ResponseWriter, r *http.Request, level int)
|
||||||
}
|
}
|
||||||
|
|
||||||
v := compressWritersPool.Get().(*CompressResponseWriter)
|
v := compressWritersPool.Get().(*CompressResponseWriter)
|
||||||
|
|
||||||
|
if h, ok := w.(http.Hijacker); ok {
|
||||||
|
v.Hijacker = h
|
||||||
|
} else {
|
||||||
|
v.Hijacker = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// The Naive() should be used to check for Pusher,
|
||||||
|
// as examples explicitly says, so don't do it:
|
||||||
|
// if p, ok := w.Naive().(http.Pusher); ok {
|
||||||
|
// v.Pusher = p
|
||||||
|
// } else {
|
||||||
|
// v.Pusher = nil
|
||||||
|
// }
|
||||||
|
|
||||||
v.ResponseWriter = w
|
v.ResponseWriter = w
|
||||||
v.Disabled = false
|
v.Disabled = false
|
||||||
if level == -1 && encoding == BROTLI {
|
if level == -1 && encoding == BROTLI {
|
||||||
|
@ -255,6 +272,13 @@ func (w *CompressResponseWriter) FlushResponse() {
|
||||||
// write the status, after header set and before any flushed content sent.
|
// write the status, after header set and before any flushed content sent.
|
||||||
w.ResponseWriter.FlushResponse()
|
w.ResponseWriter.FlushResponse()
|
||||||
|
|
||||||
|
if w.IsHijacked() {
|
||||||
|
// net/http docs:
|
||||||
|
// It becomes the caller's responsibility to manage
|
||||||
|
// and close the connection.
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
w.CompressWriter.Close() // flushes and closes.
|
w.CompressWriter.Close() // flushes and closes.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -259,7 +259,7 @@ func ingoreMainHandlerName(name string) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// Filter is just a type of func(Handler) bool which reports whether an action must be performed
|
// Filter is just a type of func(Context) bool which reports whether an action must be performed
|
||||||
// based on the incoming request.
|
// based on the incoming request.
|
||||||
//
|
//
|
||||||
// See `NewConditionalHandler` for more.
|
// See `NewConditionalHandler` for more.
|
||||||
|
|
|
@ -1354,7 +1354,7 @@ func getCaller() (string, int) {
|
||||||
if relFile, err := filepath.Rel(wd, file); err == nil {
|
if relFile, err := filepath.Rel(wd, file); err == nil {
|
||||||
if !strings.HasPrefix(relFile, "..") {
|
if !strings.HasPrefix(relFile, "..") {
|
||||||
// Only if it's relative to this path, not parent.
|
// Only if it's relative to this path, not parent.
|
||||||
file = "./" + relFile
|
file = "./" + filepath.ToSlash(relFile)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -324,19 +324,26 @@ func TestUseWrapOrder(t *testing.T) {
|
||||||
wrapRouter = func(w http.ResponseWriter, r *http.Request, router http.HandlerFunc) {
|
wrapRouter = func(w http.ResponseWriter, r *http.Request, router http.HandlerFunc) {
|
||||||
if r.URL.Path == "/" {
|
if r.URL.Path == "/" {
|
||||||
w.Write([]byte("#1 .WrapRouter\n"))
|
w.Write([]byte("#1 .WrapRouter\n"))
|
||||||
// Note for beginners, reading this test:
|
/* Note for new Gophers:
|
||||||
// if we write something here on a not found page,
|
|
||||||
// in the raw net/http wrapper like this one,
|
If we write something here, on a not found resource,
|
||||||
// then the response writer sends 200 status OK
|
in the raw `net/http` wrapper like this one, then the
|
||||||
// (on first write) and so any error handler will not be fired as expected,
|
response writer will send `200` status OK (on first write).
|
||||||
// these are basic things. If you w.WriteHeader you cannot change the status code later on too.
|
Any error handler will not be fired as expected.
|
||||||
// In Iris handlers, if you write before status code set, then it sends 200
|
Also, when `w.WriteHeader` is called you can NOT
|
||||||
// and it cannot change too (if you want to change that behavior you use ctx.Record()).
|
change the status code later on.
|
||||||
// However if you
|
|
||||||
// just call ctx.StatusCode without content written then you are able to change the status code
|
In Iris Handlers, if you write before status code set,
|
||||||
// later on.
|
then it sends 200 status OK and it cannot change as well.
|
||||||
|
However if we just called `ctx.StatusCode` inside an
|
||||||
|
Iris Handler without any content written then we
|
||||||
|
would able to change the status code later on.
|
||||||
|
When you need to change that behavior you should
|
||||||
|
start the handler with a [ctx.Record()](responses/recorder.md) call.
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Continue by executing the Iris Router and leave it do its job.
|
||||||
router(w, r)
|
router(w, r)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user