diff --git a/_examples/response-writer/http2push/main.go b/_examples/response-writer/http2push/main.go index af0a5f97..f6b9f4d9 100644 --- a/_examples/response-writer/http2push/main.go +++ b/_examples/response-writer/http2push/main.go @@ -27,7 +27,7 @@ func pushHandler(ctx iris.Context) { // parent request. target := "/main.js" - if pusher, ok := ctx.ResponseWriter().(http.Pusher); ok { + if pusher, ok := ctx.ResponseWriter().Naive().(http.Pusher); ok { err := pusher.Push(target, nil) if err != nil { if err == iris.ErrPushNotSupported { diff --git a/_examples/view/template_jet_0/main.go b/_examples/view/template_jet_0/main.go index f2090807..a7cb43c8 100644 --- a/_examples/view/template_jet_0/main.go +++ b/_examples/view/template_jet_0/main.go @@ -97,8 +97,11 @@ func main() { } app.Get("/", func(ctx iris.Context) { - ctx.View("todos/index.jet", todos) // <-- + err := ctx.View("todos/index.jet", todos) // <-- // Note that the `ctx.View` already logs the error if logger level is allowing it and returns the error. + if err != nil { + ctx.StopWithText(iris.StatusInternalServerError, "Templates not rendered!") + } }) app.Get("/todo", func(ctx iris.Context) { diff --git a/context/compress.go b/context/compress.go index dda4c0d7..cdb62cb0 100644 --- a/context/compress.go +++ b/context/compress.go @@ -184,10 +184,6 @@ type CompressResponseWriter struct { CompressWriter ResponseWriter - http.Pusher - http.Hijacker - http.CloseNotifier - Disabled bool Encoding string Level int @@ -234,26 +230,6 @@ func AcquireCompressResponseWriter(w ResponseWriter, r *http.Request, level int) v.CompressWriter = encWriter AddCompressHeaders(w.Header(), encoding) - - pusher, ok := w.(http.Pusher) - if !ok { - pusher = nil // make sure interface value is nil. - } - - hijacker, ok := w.(http.Hijacker) - if !ok { - hijacker = nil - } - - closeNotifier, ok := w.(http.CloseNotifier) - if !ok { - closeNotifier = nil - } - - v.Pusher = pusher - v.Hijacker = hijacker - v.CloseNotifier = closeNotifier - return v, nil } diff --git a/context/response_recorder.go b/context/response_recorder.go index caf511a3..6e2de58d 100644 --- a/context/response_recorder.go +++ b/context/response_recorder.go @@ -33,9 +33,6 @@ func releaseResponseRecorder(w *ResponseRecorder) { type ResponseRecorder struct { ResponseWriter - http.Hijacker - http.CloseNotifier - // keep track of the body in order to be // resetable and useful inside custom transactions chunks []byte @@ -55,20 +52,6 @@ func (w *ResponseRecorder) Naive() http.ResponseWriter { // prepares itself, the response recorder, to record and send response to the client. func (w *ResponseRecorder) BeginRecord(underline ResponseWriter) { w.ResponseWriter = underline - - hijacker, ok := underline.(http.Hijacker) - if !ok { - hijacker = nil - } - - closeNotifier, ok := underline.(http.CloseNotifier) - if !ok { - closeNotifier = nil - } - - w.Hijacker = hijacker - w.CloseNotifier = closeNotifier - w.headers = underline.Header() w.ResetBody() } @@ -282,7 +265,7 @@ var ErrPushNotSupported = errors.New("push feature is not supported by this Resp func (w *ResponseRecorder) Push(target string, opts *http.PushOptions) (err error) { w.FlushResponse() - if pusher, ok := w.ResponseWriter.(http.Pusher); ok { + if pusher, ok := w.ResponseWriter.Naive().(http.Pusher); ok { err = pusher.Push(target, opts) if err != nil && err.Error() == http.ErrNotSupported.ErrorString { return ErrPushNotSupported diff --git a/context/response_writer.go b/context/response_writer.go index 05a20474..4caa9b94 100644 --- a/context/response_writer.go +++ b/context/response_writer.go @@ -132,10 +132,6 @@ func releaseResponseWriter(w ResponseWriter) { // it writes directly to the underline http.ResponseWriter type responseWriter struct { http.ResponseWriter - http.Pusher - http.Hijacker // Note: - // The http.CloseNotifier interface is deprecated. New code should use Request.Context instead. - http.CloseNotifier statusCode int // the saved status code which will be used from the cache service // statusCodeSent bool // reply header has been (logically) written | no needed any more as we have a variable to catch total len of written bytes @@ -176,29 +172,6 @@ func (w *responseWriter) BeginResponse(underline http.ResponseWriter) { // that this responseWriter should write on. func (w *responseWriter) SetWriter(underline http.ResponseWriter) { w.ResponseWriter = underline - - pusher, ok := underline.(http.Pusher) - if !ok { - pusher = nil // make sure interface value is nil. - } - - hijacker, ok := underline.(http.Hijacker) - if !ok { - hijacker = nil - } - - // This interface is obselete by Go authors - // and we only capture it - // for compatible reasons. End-developers SHOULD replace - // the use of CloseNotifier with the: Request.Context().Done() channel. - closeNotifier, ok := underline.(http.CloseNotifier) - if !ok { - closeNotifier = nil - } - - w.Pusher = pusher - w.Hijacker = hijacker - w.CloseNotifier = closeNotifier } // EndResponse is the last function which is called right before the server sent the final response. diff --git a/core/router/fs.go b/core/router/fs.go index 3f366328..874cc2e1 100644 --- a/core/router/fs.go +++ b/core/router/fs.go @@ -302,18 +302,18 @@ func FileServer(fs http.FileSystem, options DirOptions) context.Handler { if indexFound && !options.Attachments.Enable { if indexAssets, ok := options.PushTargets[name]; ok { - if pusher, ok := ctx.ResponseWriter().(http.Pusher); ok { + if pusher, ok := ctx.ResponseWriter().Naive().(http.Pusher); ok { + var pushOpts *http.PushOptions + if encoding != "" { + pushOpts = &http.PushOptions{Header: r.Header} + } + for _, indexAsset := range indexAssets { if indexAsset[0] != '/' { // it's relative path. indexAsset = path.Join(r.RequestURI, indexAsset) } - var pushOpts *http.PushOptions - if encoding != "" { - pushOpts = &http.PushOptions{Header: r.Header} - } - if err = pusher.Push(indexAsset, pushOpts); err != nil { break } @@ -322,7 +322,12 @@ func FileServer(fs http.FileSystem, options DirOptions) context.Handler { } if regex, ok := options.PushTargetsRegexp[r.URL.Path]; ok { - if pusher, ok := ctx.ResponseWriter().(http.Pusher); ok { + if pusher, ok := ctx.ResponseWriter().Naive().(http.Pusher); ok { + var pushOpts *http.PushOptions + if encoding != "" { + pushOpts = &http.PushOptions{Header: r.Header} + } + prefixURL := strings.TrimSuffix(r.RequestURI, name) names, err := findNames(fs, name) if err == nil { @@ -335,10 +340,6 @@ func FileServer(fs http.FileSystem, options DirOptions) context.Handler { // match using relative path (without the first '/' slash) // to keep consistency between the `PushTargets` behavior if regex.MatchString(indexAsset) { - var pushOpts *http.PushOptions - if encoding != "" { - pushOpts = &http.PushOptions{Header: r.Header} - } // println("Regex Matched: " + indexAsset) if err = pusher.Push(path.Join(prefixURL, indexAsset), pushOpts); err != nil {