func handleImageRequest(w http.ResponseWriter, r *http.Request) { if r.Method != "GET" { w.WriteHeader(http.StatusMethodNotAllowed) } w.Header().Set("Cache-Control", "public, max-age=31536000") // Client is checking for a cached URI, assume it is valid // and return a 304 if r.Header.Get("If-Modified-Since") != "" { w.WriteHeader(http.StatusNotModified) return } gc := fetch.RequestContext(r) var data []byte err := cache.Get(gc, gc.CacheKey(), groupcache.AllocatingByteSliceSink(&data)) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } w.Header().Set("Content-Type", http.DetectContentType(data)) http.ServeContent(w, r, gc.ImageId, time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC), bytes.NewReader(data)) }
func main() { runtime.GOMAXPROCS(runtime.NumCPU()) awsAuth, err := aws.EnvAuth() if err != nil { log.Fatalf(err.Error()) } s3conn := s3.New(awsAuth, getRegion()) storage = store.NewS3Store(s3conn) peers = peer.DebugPool() peers.SetContext(func(r *http.Request) groupcache.Context { return fetch.RequestContext(r) }) cache = groupcache.NewGroup("ImageProxyCache", 64<<20, groupcache.GetterFunc( func(c groupcache.Context, key string, dest groupcache.Sink) error { log.Printf("Cache MISS for key -> %s", key) // Get image data from S3 b, err := fetch.ImageData(storage, c) if err != nil { return err } return dest.SetBytes(b) })) if !*verbose { logwriter, err := syslog.Dial("udp", "app_syslog:514", syslog.LOG_NOTICE, "vip") if err != nil { log.Println(err.Error()) log.Println("using default logger") } else { log.SetOutput(logwriter) } } go peers.Listen() go listenHttp() go Queue.Start(4) log.Println("Cache listening on port :" + peers.Port()) s := &http.Server{ Addr: ":" + peers.Port(), Handler: peers, } s.ListenAndServe() }