Първата ми идея беше да получа тялото на отговора във филтъра, след това да използвам една от библиотеките за минимизиране като tdewolff/minify и да пиша в отговора, но не мога да намеря начин да получа тялото на отговора. Има ли по-добри решения?
Как да извършите минимизиране на html с Revel framework
Отговори (1)
Изглежда, като се гледат документите, филтърът може да има достъп до типа Controller
, който съдържа Response
. Този отговор съдържа Out
, който е ResponseWriter (и следователно също io.Writer). Трябва да заменим само метода Write, за да пренасочи записа към минификатора, който след това пише към записващия отговор. Трябва да използваме io.Pipe
и goroutine за това.
type MinifyResponseWriter struct {
http.ResponseWriter
io.Writer
}
func (f MinifyResponseWriter) Write(b []byte) (int, error) {
return f.Writer.Write(b)
}
func MinifyFilter(c *Controller, fc []Filter) {
pr, pw := io.Pipe()
go func(w io.Writer) {
m := minify.New()
m.AddFunc("text/css", css.Minify)
m.AddFunc("text/html", html.Minify)
m.AddFunc("text/javascript", js.Minify)
m.AddFunc("image/svg+xml", svg.Minify)
m.AddFuncRegexp(regexp.MustCompile("[/+]json$"), json.Minify)
m.AddFuncRegexp(regexp.MustCompile("[/+]xml$"), xml.Minify)
if err := m.Minify("mimetype", w, pr); err != nil {
panic(err)
}
}(c.Response.Out)
c.Response.Out = MinifyResponseWriter{c.Response.Out, pw}
}
Нещо в този дух (не е тествано). Тук вземаме входящото io.Writer
(което е част от ResponseWriter
) и обгръщаме структура около него. Той запазва оригиналните методи за записващия отговор, но методът Write се отменя, за да бъде заменен от PipeWriter
. Това означава, че всеки запис към новия писател на отговор отива към PipeWriter
, който е свързан с PipeReader
. Минимизиране Чете от този четец и пише на автора на оригиналния отговор.
Тъй като променяме стойността на c.Response.Out
, трябва да я предадем изрично на goroutine. Уверете се, че сте получили правилния mimetype (чрез разширение?) или извикайте директно съответната функция за минимизиране.
go test -race
) или нещо подобно. Но ако искате да го компресирате в текстовия редактор, този инструмент ще ви помогне: pi.tacodewolff.nl:8080/ минимизиране
- person Taco de Wolff; 14.10.2015