mirror of
https://github.com/basecamp/once-campfire.git
synced 2026-10-10 00:30:13 +09:00
Reuse epoch-verified record snapshots and avoid empty push payloads
This commit is contained in:
@@ -1,7 +1,12 @@
|
||||
module Authentication::SessionLookup
|
||||
def find_session_by_cookie
|
||||
if token = cookies.signed[:session_token]
|
||||
Session.find_by(token: token)
|
||||
version = @response_cache_version if @response_cache_version && (request.get? || request.head?)
|
||||
session, user = RecordCache.fetch([ "session", Digest::SHA256.hexdigest(token.to_s) ], version) do
|
||||
session = Session.find_by(token: token)
|
||||
[ session, session&.user ]
|
||||
end
|
||||
session&.tap { |record| record.user = user }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -35,6 +35,10 @@ module CachedResponses
|
||||
end
|
||||
|
||||
private
|
||||
def read_record_cache_version
|
||||
@response_cache_version if request.get? || request.head?
|
||||
end
|
||||
|
||||
def capture_response_cache_version
|
||||
# Capture for native HTML/JSON/stream renders too, even with page reuse off.
|
||||
# Detached renderers do not run callbacks and therefore render uncached.
|
||||
@@ -81,6 +85,10 @@ module CachedResponses
|
||||
def cache_completed_response(key, original_session, encoding)
|
||||
if response.status == 200 && response.media_type == "text/html" && session.to_hash == original_session && !response.headers["Content-Encoding"]
|
||||
body = encoding == "gzip" ? Zlib.gzip(response.body) : response.body
|
||||
unless body.empty? || response.headers["ETag"] || response.headers["Last-Modified"]
|
||||
# Match Rack::ETag once, rather than hashing the same bytes on each hit.
|
||||
response.headers["ETag"] = %(W/"#{Digest::SHA256.hexdigest(body).byteslice(0, 32)}")
|
||||
end
|
||||
response.headers["Content-Encoding"] = "gzip" if encoding == "gzip"
|
||||
response.headers["Vary"] = (response.headers["Vary"].to_s.split(/,\s*/) | [ "Accept-Encoding" ]).join(", ")
|
||||
headers = response.headers.slice(*CACHE_HEADERS).to_h.freeze
|
||||
|
||||
@@ -7,7 +7,10 @@ module RoomScoped
|
||||
|
||||
private
|
||||
def set_room
|
||||
@membership = Current.user.memberships.find_by!(room_id: params[:room_id])
|
||||
@room = @membership.room
|
||||
@membership, @room = RecordCache.fetch([ "membership", Current.user.id, params[:room_id] ], read_record_cache_version) do
|
||||
membership = Current.user.memberships.find_by!(room_id: params[:room_id])
|
||||
[ membership, membership.room ]
|
||||
end
|
||||
@membership.room = @room
|
||||
end
|
||||
end
|
||||
|
||||
@@ -21,7 +21,10 @@ class RoomsController < ApplicationController
|
||||
|
||||
private
|
||||
def set_room
|
||||
if room = room_scope.find_by(id: params[:room_id] || params[:id])
|
||||
room = RecordCache.fetch([ "room", self.class.name, Current.user.id, params[:room_id] || params[:id] ], read_record_cache_version) do
|
||||
[ room_scope.find_by(id: params[:room_id] || params[:id]) ]
|
||||
end.first
|
||||
if room
|
||||
@room = room
|
||||
else
|
||||
redirect_to root_url, alert: "Room not found or inaccessible"
|
||||
|
||||
Reference in New Issue
Block a user