Server now relays a 503 when upstream returns a non-200 response.
This commit is contained in:
parent
93a3795a7b
commit
c4cfb04285
15
cache/downloader.go
vendored
15
cache/downloader.go
vendored
@ -1,7 +1,6 @@
|
|||||||
package cache
|
package cache
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
@ -9,6 +8,16 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// DownloadError conveys information about a download request that failed.
|
||||||
|
type DownloadError struct {
|
||||||
|
Status string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error returns a description of the error.
|
||||||
|
func (d *DownloadError) Error() string {
|
||||||
|
return d.Status
|
||||||
|
}
|
||||||
|
|
||||||
// downloader attempts to download a file from a remote URL.
|
// downloader attempts to download a file from a remote URL.
|
||||||
type downloader struct {
|
type downloader struct {
|
||||||
doneMutex sync.Mutex
|
doneMutex sync.Mutex
|
||||||
@ -40,7 +49,9 @@ func newDownloader(rawurl, jsonFilename, dataFilename string) *downloader {
|
|||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
if resp.StatusCode != 200 {
|
if resp.StatusCode != 200 {
|
||||||
d.err = errors.New(resp.Status)
|
d.err = &DownloadError{
|
||||||
|
Status: resp.Status,
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
f, err := os.Create(dataFilename)
|
f, err := os.Create(dataFilename)
|
||||||
|
@ -48,8 +48,6 @@ func (s *Server) writeHeaders(w http.ResponseWriter, e *cache.Entry) {
|
|||||||
w.WriteHeader(http.StatusOK)
|
w.WriteHeader(http.StatusOK)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: support for HEAD requests
|
|
||||||
|
|
||||||
// ServeHTTP processes an incoming request to the proxy. GET requests are
|
// ServeHTTP processes an incoming request to the proxy. GET requests are
|
||||||
// served with the storage backend and every other request is (out of
|
// served with the storage backend and every other request is (out of
|
||||||
// necessity) rejected since it can't be cached.
|
// necessity) rejected since it can't be cached.
|
||||||
@ -67,7 +65,11 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
|||||||
defer r.Close()
|
defer r.Close()
|
||||||
e, err := r.GetEntry()
|
e, err := r.GetEntry()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
if dErr, ok := err.(*cache.DownloadError); ok {
|
||||||
|
http.Error(w, dErr.Error(), http.StatusServiceUnavailable)
|
||||||
|
} else {
|
||||||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
|
}
|
||||||
log.Println("[ERR]", err)
|
log.Println("[ERR]", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user