mirror of
https://github.com/basecamp/once-campfire.git
synced 2026-10-08 15:50:08 +09:00
414ff3376e
The deadline in Opengraph::Fetch started after the lookup of the pasted host, and an unfurl looks up more hosts outside any fetch: the canonical URL's, and the image's, once to check its content type and again to validate it. Each of those waits as long as the resolver takes to give up. Move the deadline up to UnfurlLinksController, around everything the link leads to; Opengraph::Fetch keeps its per-operation timeouts and makes no retries. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Bj8KnxpTf9sj2Ysa8aLAVa
28 lines
760 B
Ruby
28 lines
760 B
Ruby
class UnfurlLinksController < ApplicationController
|
|
# The pasted link decides which hosts an unfurl looks up and fetches from, and how quickly they answer.
|
|
DEADLINE = 10.seconds
|
|
|
|
def create
|
|
if opengraph = unfurl(url_param)
|
|
render json: opengraph
|
|
else
|
|
head :no_content
|
|
end
|
|
end
|
|
|
|
private
|
|
def url_param
|
|
params.require(:url)
|
|
end
|
|
|
|
# One deadline for everything the link leads to: DNS lookups, redirects, the page, the image check.
|
|
def unfurl(url)
|
|
Timeout.timeout(DEADLINE) do
|
|
Opengraph::Metadata.from_url(url).then { |opengraph| opengraph if opengraph.valid? }
|
|
end
|
|
rescue Timeout::Error
|
|
Rails.logger.warn "Gave up unfurling #{url} after #{DEADLINE.inspect}"
|
|
nil
|
|
end
|
|
end
|