// PreRenderHandler is a net/http compatible handler that proxies a request to // the configured Prerender.io URL. All upstream requests are made with an // Accept-Encoding=gzip header. Responses are provided either uncompressed or // gzip compressed based on the downstream requests Accept-Encoding header func (p *Prerender) PreRenderHandler(rw http.ResponseWriter, or *http.Request) { client := &http.Client{} req, err := http.NewRequest("GET", p.buildURL(or), nil) e.Check(err) if p.Options.Token != "" { req.Header.Set("X-Prerender-Token", p.Options.Token) } req.Header.Set("User-Agent", or.Header.Get("User-Agent")) req.Header.Set("Content-Type", or.Header.Get("Content-Type")) req.Header.Set("Accept-Encoding", "gzip") res, err := client.Do(req) //fmt.Println(res) e.Check(err) rw.Header().Set("Content-Type", res.Header.Get("Content-Type")) defer res.Body.Close() //Figure out whether the client accepts gzip responses doGzip := strings.Contains(or.Header.Get("Accept-Encoding"), "gzip") isGzip := strings.Contains(res.Header.Get("Content-Encoding"), "gzip") if doGzip && !isGzip { // gzip raw response rw.Header().Set("Content-Encoding", "gzip") gz := gzip.NewWriter(rw) defer gz.Close() io.Copy(gz, res.Body) gz.Flush() } else if !doGzip && isGzip { // gunzip response gz, err := gzip.NewReader(res.Body) e.Check(err) defer gz.Close() io.Copy(rw, gz) } else { // Pass through, gzip/gzip or raw/raw rw.Header().Set("Content-Encoding", res.Header.Get("Content-Encoding")) io.Copy(rw, res.Body) } }
func Get(connectionVariable string) *mgo.Session { if session == nil { var cs string if strings.HasPrefix(connectionVariable, "mongodb://") { cs = connectionVariable } else { cs = os.Getenv(connectionVariable) } var err error session, err = mgo.Dial(cs) errors.Check(err) // http://godoc.org/labix.org/v2/mgo#Session.SetMode session.SetMode(mgo.Monotonic, true) } return session.Copy() }