aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--server/core/response.go5
-rw-r--r--server/ui/controller/proxy.go25
2 files changed, 21 insertions, 9 deletions
diff --git a/server/core/response.go b/server/core/response.go
index 3acc453..3bce9d9 100644
--- a/server/core/response.go
+++ b/server/core/response.go
@@ -46,6 +46,11 @@ func (r *Response) Redirect(path string) {
http.Redirect(r.writer, r.request, path, http.StatusFound)
}
+// NotModified sends a response with a 304 status code.
+func (r *Response) NotModified() {
+ r.writer.WriteHeader(http.StatusNotModified)
+}
+
// Cache returns a response with caching headers.
func (r *Response) Cache(mimeType, etag string, content []byte, duration time.Duration) {
r.writer.Header().Set("Content-Type", mimeType)
diff --git a/server/ui/controller/proxy.go b/server/ui/controller/proxy.go
index 19a6436..fdbdb4e 100644
--- a/server/ui/controller/proxy.go
+++ b/server/ui/controller/proxy.go
@@ -7,15 +7,23 @@ package controller
import (
"encoding/base64"
"errors"
- "github.com/miniflux/miniflux2/helper"
- "github.com/miniflux/miniflux2/server/core"
"io/ioutil"
"log"
- "net/http"
"time"
+
+ "github.com/miniflux/miniflux2/helper"
+ "github.com/miniflux/miniflux2/reader/http"
+ "github.com/miniflux/miniflux2/server/core"
)
+// ImageProxy fetch an image from a remote server and sent it back to the browser.
func (c *Controller) ImageProxy(ctx *core.Context, request *core.Request, response *core.Response) {
+ // If we receive a "If-None-Match" header we assume the image in stored in browser cache
+ if request.Request().Header.Get("If-None-Match") != "" {
+ response.NotModified()
+ return
+ }
+
encodedURL := request.StringParam("encodedURL", "")
if encodedURL == "" {
response.HTML().BadRequest(errors.New("No URL provided"))
@@ -28,22 +36,21 @@ func (c *Controller) ImageProxy(ctx *core.Context, request *core.Request, respon
return
}
- resp, err := http.Get(string(decodedURL))
+ client := http.NewClient(string(decodedURL))
+ resp, err := client.Get()
if err != nil {
- log.Println(err)
+ log.Println("[ImageProxy]", err)
response.HTML().NotFound()
return
}
- defer resp.Body.Close()
- if resp.StatusCode != http.StatusOK {
+ if resp.HasServerFailure() {
response.HTML().NotFound()
return
}
body, _ := ioutil.ReadAll(resp.Body)
etag := helper.HashFromBytes(body)
- contentType := resp.Header.Get("Content-Type")
- response.Cache(contentType, etag, body, 72*time.Hour)
+ response.Cache(resp.ContentType, etag, body, 72*time.Hour)
}