Skip to content

Commit

Permalink
fix: force a change in thumbnail cache using the modified_at field (#858
Browse files Browse the repository at this point in the history
)

* force to not use cache in ui for thumbnail fix #857

* use modifiedAt instead of current time

* now can define custom Header for SendFile

* remvoe use of cacheBuster

* send 304 to the user if file not change

* back to queryparameter

---------

Co-authored-by: Felipe Martin <[email protected]>
  • Loading branch information
Monirzadeh and fmartingr authored Sep 22, 2024
1 parent 9492075 commit 0128107
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 6 deletions.
17 changes: 14 additions & 3 deletions internal/http/response/file.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,12 @@ import (
"github.com/go-shiori/shiori/internal/model"
)

// SendFile sends file to client with caching header
func SendFile(c *gin.Context, storageDomain model.StorageDomain, path string) {
c.Header("Cache-Control", "public, max-age=86400")
type SendFileOptions struct {
Headers []http.Header
}

// SendFile sends file to client with caching header
func SendFile(c *gin.Context, storageDomain model.StorageDomain, path string, options *SendFileOptions) {
if !storageDomain.FileExists(path) {
c.AbortWithStatus(http.StatusNotFound)
return
Expand All @@ -24,8 +26,17 @@ func SendFile(c *gin.Context, storageDomain model.StorageDomain, path string) {
return
}

c.Header("Cache-Control", "public, max-age=86400")
c.Header("ETag", fmt.Sprintf("W/%x-%x", info.ModTime().Unix(), info.Size()))

if options != nil {
for _, header := range options.Headers {
for key, value := range header {
c.Header(key, value[0])
}
}
}

// TODO: Find a better way to send the file to the client from the FS, probably making a
// conversion between afero.Fs and http.FileSystem to use c.FileFromFS.
fileContent, err := storageDomain.FS().Open(path)
Expand Down
20 changes: 18 additions & 2 deletions internal/http/routes/bookmark.go
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,23 @@ func (r *BookmarkRoutes) bookmarkThumbnailHandler(c *gin.Context) {
return
}

response.SendFile(c, r.deps.Domains.Storage, model.GetThumbnailPath(bookmark))
etag := "w/" + model.GetThumbnailPath(bookmark) + "-" + bookmark.ModifiedAt

// Check if the client's ETag matches the current ETag
if c.GetHeader("If-None-Match") == etag {
c.Status(http.StatusNotModified)
return
}

options := &response.SendFileOptions{
Headers: []http.Header{
{"Cache-Control": {"no-cache , must-revalidate"}},
{"Last-Modified": {bookmark.ModifiedAt}},
{"ETag": {etag}},
},
}

response.SendFile(c, r.deps.Domains.Storage, model.GetThumbnailPath(bookmark), options)
}

func (r *BookmarkRoutes) bookmarkEbookHandler(c *gin.Context) {
Expand All @@ -185,5 +201,5 @@ func (r *BookmarkRoutes) bookmarkEbookHandler(c *gin.Context) {

// TODO: Potentially improve this
c.Header("Content-Disposition", `attachment; filename="`+bookmark.Title+`.epub"`)
response.SendFile(c, r.deps.Domains.Storage, model.GetEbookPath(bookmark))
response.SendFile(c, r.deps.Domains.Storage, model.GetEbookPath(bookmark), nil)
}
3 changes: 2 additions & 1 deletion internal/view/assets/js/component/bookmark.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ export default {
hasContent: Boolean,
hasArchive: Boolean,
hasEbook: Boolean,
modifiedAt: String,
index: Number,
ShowId: Boolean,
editMode: Boolean,
Expand Down Expand Up @@ -95,7 +96,7 @@ export default {
},
thumbnailStyleURL() {
return {
backgroundImage: `url("${this.imageURL}")`,
backgroundImage: `url("${this.imageURL}?modifiedAt=${this.modifiedAt}")`,
};
},
eventItem() {
Expand Down
1 change: 1 addition & 0 deletions internal/view/assets/js/page/home.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ var template = `
:excerpt="book.excerpt"
:public="book.public"
:imageURL="book.imageURL"
:modifiedAt="book.modifiedAt"
:hasContent="book.hasContent"
:hasArchive="book.hasArchive"
:hasEbook="book.hasEbook"
Expand Down

0 comments on commit 0128107

Please sign in to comment.