code: func (h *Handler) passUpstream(w http.ResponseWriter, r *cacheRequest) {
  	rw := newResponseStreamer(w)
  	rdr, err := rw.Stream.NextReader()
  	if err != nil {
  		debugf("error creating next stream reader: %v", err)
  		w.Header().Set(CacheHeader, "SKIP")
  		h.upstream.ServeHTTP(w, r.Request)
  		return
  	}
  
  	t := Clock()
  	debugf("passing request upstream")
  	rw.Header().Set(CacheHeader, "MISS")
  
  	go func() {
  		h.upstream.ServeHTTP(rw, r.Request)
  		rw.Stream.Close()
  	}()
  	rw.WaitHeaders()
  	debugf("upstream responded headers in %s", Clock().Sub(t).String())
  
  	// just the headers!
  	res := NewResourceBytes(rw.StatusCode, nil, rw.Header())
  	if !h.isCacheable(res, r) {
  		rdr.Close()
  		debugf("resource is uncacheable")
  		rw.Header().Set(CacheHeader, "SKIP")
  		return
  	}
  	b, err := ioutil.ReadAll(rdr)
  	rdr.Close()
  	if err != nil {
  		debugf("error reading stream: %v", err)
  		rw.Header().Set(CacheHeader, "SKIP")
  		return
  	}
  	debugf("full upstream response took %s", Clock().Sub(t).String())
  	res.ReadSeekCloser = &byteReadSeekCloser{bytes.NewReader(b)}
  
  	if age, err := correctedAge(res.Header(), t, Clock()); err == nil {
  		res.Header().Set("Age", strconv.Itoa(int(math.Ceil(age.Seconds()))))
  	} else {
  		debugf("error calculating corrected age: %s", err.Error())
  	}
  
  	rw.Header().Set(ProxyDateHeader, Clock().Format(http.TimeFormat))
  	h.storeResource(res, r)
  }
docs: // passUpstream makes the request via the upstream handler and stores the result