| Index: experimental/webtry/webtry.go | 
| diff --git a/experimental/webtry/webtry.go b/experimental/webtry/webtry.go | 
| index bf352fb13178b0573a4128365f8695a1ac255c19..4c340142fb70a7ce3078c3babec9107d87a52ea9 100644 | 
| --- a/experimental/webtry/webtry.go | 
| +++ b/experimental/webtry/webtry.go | 
| @@ -8,8 +8,6 @@ import ( | 
| "encoding/json" | 
| "flag" | 
| "fmt" | 
| -	_ "github.com/go-sql-driver/mysql" | 
| -	_ "github.com/mattn/go-sqlite3" | 
| htemplate "html/template" | 
| "io/ioutil" | 
| "log" | 
| @@ -24,6 +22,12 @@ import ( | 
| "time" | 
| ) | 
|  | 
| +import ( | 
| +	"github.com/fiorix/go-web/autogzip" | 
| +	_ "github.com/go-sql-driver/mysql" | 
| +	_ "github.com/mattn/go-sqlite3" | 
| +) | 
| + | 
| const ( | 
| RESULT_COMPILE = `../../experimental/webtry/safec++ -DSK_GAMMA_SRGB -DSK_GAMMA_APPLY_TO_A8 -DSK_SCALAR_TO_FLOAT_EXCLUDED -DSK_ALLOW_STATIC_GLOBAL_INITIALIZERS=1 -DSK_SUPPORT_GPU=0 -DSK_SUPPORT_OPENCL=0 -DSK_FORCE_DISTANCEFIELD_FONTS=0 -DSK_SCALAR_IS_FLOAT -DSK_CAN_USE_FLOAT -DSK_SAMPLES_FOR_X -DSK_BUILD_FOR_UNIX -DSK_USE_POSIX_THREADS -DSK_SYSTEM_ZLIB=1 -DSK_DEBUG -DSK_DEVELOPER=1 -I../../src/core -I../../src/images -I../../tools/flags -I../../include/config -I../../include/core -I../../include/pathops -I../../include/pipe -I../../include/effects -I../../include/ports -I../../src/sfnt -I../../include/utils -I../../src/utils -I../../include/images -g -fno-exceptions -fstrict-aliasing -Wall -Wextra -Winit-self -Wpointer-arith -Wno-unused-parameter -m64 -fno-rtti -Wnon-virtual-dtor -c ../../../cache/%s.cpp -o ../../../cache/%s.o` | 
| LINK           = `../../experimental/webtry/safec++ -m64 -lstdc++ -lm -o ../../../inout/%s -Wl,--start-group ../../../cache/%s.o obj/experimental/webtry/webtry.main.o obj/gyp/libflags.a libskia_images.a libskia_core.a libskia_effects.a obj/gyp/libjpeg.a obj/gyp/libwebp_dec.a obj/gyp/libwebp_demux.a obj/gyp/libwebp_dsp.a obj/gyp/libwebp_enc.a obj/gyp/libwebp_utils.a libskia_utils.a libskia_opts.a libskia_opts_ssse3.a libskia_ports.a libskia_sfnt.a -Wl,--end-group -lpng -lz -lgif -lpthread -lfontconfig -ldl -lfreetype` | 
| @@ -328,6 +332,7 @@ func doCmd(commandLine string, moveToDebug bool) (string, error) { | 
| // reportError formats an HTTP error response and also logs the detailed error message. | 
| func reportError(w http.ResponseWriter, r *http.Request, err error, message string) { | 
| log.Printf("Error: %s\n%s", message, err.Error()) | 
| +	w.Header().Set("Content-Type", "text/plain") | 
| http.Error(w, message, 500) | 
| } | 
|  | 
| @@ -343,6 +348,7 @@ func reportTryError(w http.ResponseWriter, r *http.Request, err error, message, | 
| http.Error(w, "Failed to serialize a response", 500) | 
| return | 
| } | 
| +	w.Header().Set("Content-Type", "text/plain") | 
| w.Write(resp) | 
| } | 
|  | 
| @@ -373,6 +379,7 @@ func imageHandler(w http.ResponseWriter, r *http.Request) { | 
| return | 
| } | 
| filename := match[1] | 
| +	w.Header().Set("Content-Type", "image/png") | 
| http.ServeFile(w, r, fmt.Sprintf("../../../inout/%s", filename)) | 
| } | 
|  | 
| @@ -406,6 +413,7 @@ func recentHandler(w http.ResponseWriter, r *http.Request) { | 
| } | 
| recent = append(recent, Try{Hash: hash, CreateTS: create_ts.Format("2006-02-01")}) | 
| } | 
| +	w.Header().Set("Content-Type", "text/html") | 
| if err := recentTemplate.Execute(w, Recent{Tries: recent, Titlebar: Titlebar{GitHash: gitHash, GitInfo: gitInfo}}); err != nil { | 
| log.Printf("ERROR: Failed to expand template: %q\n", err) | 
| } | 
| @@ -476,6 +484,7 @@ func workspaceHandler(w http.ResponseWriter, r *http.Request) { | 
| hash = tries[len(tries)-1].Hash | 
| code, _ = getCode(hash) | 
| } | 
| +		w.Header().Set("Content-Type", "text/html") | 
| if err := workspaceTemplate.Execute(w, Workspace{Tries: tries, Code: code, Name: name, Hash: hash, Titlebar: Titlebar{GitHash: gitHash, GitInfo: gitInfo}}); err != nil { | 
| log.Printf("ERROR: Failed to expand template: %q\n", err) | 
| } | 
| @@ -529,6 +538,7 @@ func iframeHandler(w http.ResponseWriter, r *http.Request) { | 
| return | 
| } | 
| // Expand the template. | 
| +	w.Header().Set("Content-Type", "text/html") | 
| if err := iframeTemplate.Execute(w, userCode{Code: code, Hash: hash}); err != nil { | 
| log.Printf("ERROR: Failed to expand template: %q\n", err) | 
| } | 
| @@ -596,6 +606,7 @@ func mainHandler(w http.ResponseWriter, r *http.Request) { | 
| } | 
| } | 
| // Expand the template. | 
| +		w.Header().Set("Content-Type", "text/html") | 
| if err := indexTemplate.Execute(w, userCode{Code: code, Hash: hash, Titlebar: Titlebar{GitHash: gitHash, GitInfo: gitInfo}}); err != nil { | 
| log.Printf("ERROR: Failed to expand template: %q\n", err) | 
| } | 
| @@ -675,23 +686,24 @@ func mainHandler(w http.ResponseWriter, r *http.Request) { | 
| reportTryError(w, r, err, "Failed to serialize a response.", hash) | 
| return | 
| } | 
| +		w.Header().Set("Content-Type", "application/json") | 
| w.Write(resp) | 
| } | 
| } | 
|  | 
| func main() { | 
| flag.Parse() | 
| -	http.HandleFunc("/i/", imageHandler) | 
| -	http.HandleFunc("/w/", workspaceHandler) | 
| -	http.HandleFunc("/recent/", recentHandler) | 
| -	http.HandleFunc("/iframe/", iframeHandler) | 
| -	http.HandleFunc("/json/", tryInfoHandler) | 
| +	http.HandleFunc("/i/", autogzip.HandleFunc(imageHandler)) | 
| +	http.HandleFunc("/w/", autogzip.HandleFunc(workspaceHandler)) | 
| +	http.HandleFunc("/recent/", autogzip.HandleFunc(recentHandler)) | 
| +	http.HandleFunc("/iframe/", autogzip.HandleFunc(iframeHandler)) | 
| +	http.HandleFunc("/json/", autogzip.HandleFunc(tryInfoHandler)) | 
|  | 
| // Resources are served directly | 
| // TODO add support for caching/etags/gzip | 
| -	http.Handle("/res/", http.FileServer(http.Dir("./"))) | 
| +	http.Handle("/res/", autogzip.Handle(http.FileServer(http.Dir("./")))) | 
|  | 
| // TODO Break out /c/ as it's own handler. | 
| -	http.HandleFunc("/", mainHandler) | 
| +	http.HandleFunc("/", autogzip.HandleFunc(mainHandler)) | 
| log.Fatal(http.ListenAndServe(*port, nil)) | 
| } | 
|  |