func ServeUserContent(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
ctx := appengine.NewContext(r)
dbn, _ := aefile.DefaultBucketName(ctx)
// XXX I'm not sure why the slash has to be removed here.
// It must have something to do with httprouter
path := fmt.Sprintf("/gs/%s/users%s", dbn, ps.ByName("path"))
blobKey, err := blobstore.BlobKeyForFile(ctx, path)
if err != nil {
log.Infof(ctx, `/// ServeUserContent /// err: %#v `, err)
common.SendError(w, r, http.StatusNotFound, string(http.StatusNotFound))
}
seconds := 84000
w.Header().Add("Cache-Control", fmt.Sprintf("public, max-age=%d", seconds))
blobstore.Send(w, appengine.BlobKey(blobKey))
}