diff options
author | Frédéric Guillot <fred@miniflux.net> | 2018-01-02 22:04:48 -0800 |
---|---|---|
committer | Frédéric Guillot <fred@miniflux.net> | 2018-01-02 22:04:48 -0800 |
commit | 320d1b016747ba4501da9417d9ce5f99368a5768 (patch) | |
tree | 1054d96afde6022951b76cc4a09b78e1e3f05058 /ui/proxy.go | |
parent | c39f2e1a8d2de6d412bcc673d29eb0f7a2d1f5f7 (diff) |
Refactor packages to have more idiomatic code base
Diffstat (limited to 'ui/proxy.go')
-rw-r--r-- | ui/proxy.go | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/ui/proxy.go b/ui/proxy.go new file mode 100644 index 0000000..5237d00 --- /dev/null +++ b/ui/proxy.go @@ -0,0 +1,56 @@ +// Copyright 2017 Frédéric Guillot. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +package ui + +import ( + "encoding/base64" + "errors" + "io/ioutil" + "time" + + "github.com/miniflux/miniflux/crypto" + "github.com/miniflux/miniflux/http" + "github.com/miniflux/miniflux/http/handler" + "github.com/miniflux/miniflux/logger" +) + +// ImageProxy fetch an image from a remote server and sent it back to the browser. +func (c *Controller) ImageProxy(ctx *handler.Context, request *handler.Request, response *handler.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")) + return + } + + decodedURL, err := base64.URLEncoding.DecodeString(encodedURL) + if err != nil { + response.HTML().BadRequest(errors.New("Unable to decode this URL")) + return + } + + client := http.NewClient(string(decodedURL)) + resp, err := client.Get() + if err != nil { + logger.Error("[Controller:ImageProxy] %v", err) + response.HTML().NotFound() + return + } + + if resp.HasServerFailure() { + response.HTML().NotFound() + return + } + + body, _ := ioutil.ReadAll(resp.Body) + etag := crypto.HashFromBytes(body) + + response.Cache(resp.ContentType, etag, body, 72*time.Hour) +} |