#2426 refactor to use predetermined referer

This commit is contained in:
Toks
2015-07-05 11:02:01 -04:00
parent 50f28e780a
commit 0a5f1b53ba
5 changed files with 51 additions and 20 deletions

View File

@@ -34,24 +34,8 @@ class UploadsController < ApplicationController
end end
def image_proxy def image_proxy
if params[:url].blank? || params[:ref].blank? resp = ImageProxy.get_image(params[:url])
raise "Must specify url and referer" send_data resp.body, :type => resp.content_type, :disposition => "inline"
end
url = URI.parse(params[:url])
headers = {
"Referer" => params[:ref],
"User-Agent" => "#{Danbooru.config.safe_app_name}/#{Danbooru.config.version}"
}
Net::HTTP.start(url.host, url.port) do |http|
resp = http.request_get(url.request_uri, headers)
if resp.is_a?(Net::HTTPSuccess)
send_data resp.body, type: resp.content_type, disposition: "inline"
else
raise "HTTP error code: #{resp.code} #{resp.message}"
end
end
end end
def index def index

View File

@@ -0,0 +1,34 @@
class ImageProxy
def self.needs_proxy?(url)
fake_referer_for(url).present?
end
def self.fake_referer_for(url)
Sources::Site.new(url).strategy.fake_referer
end
def self.get_image(url)
if url.blank?
raise "Must specify url"
end
if !needs_proxy?(url)
raise "Proxy not allowed for this site"
end
uri = URI.parse(url)
headers = {
"Referer" => fake_referer_for(url),
"User-Agent" => "#{Danbooru.config.safe_app_name}/#{Danbooru.config.version}"
}
Net::HTTP.start(uri.host, uri.port) do |http|
resp = http.request_get(uri.request_uri, headers)
if resp.is_a?(Net::HTTPSuccess)
return resp
else
raise "HTTP error code: #{resp.code} #{resp.message}"
end
end
end
end

View File

@@ -74,6 +74,11 @@ module Sources
[image_url] [image_url]
end end
# Should be set to a url for sites that prevent hotlinking, or left nil for sites that don't.
def fake_referer
nil
end
protected protected
def agent def agent
raise NotImplementedError raise NotImplementedError

View File

@@ -6,7 +6,7 @@ module Sources
module Strategies module Strategies
class Pixiv < Base class Pixiv < Base
attr_reader :zip_url, :ugoira_frame_data, :ugoira_content_type attr_reader :zip_url, :ugoira_frame_data, :ugoira_content_type
MONIKER = '(?:[a-zA-Z0-9_-]+)' MONIKER = '(?:[a-zA-Z0-9_-]+)'
TIMESTAMP = '(?:[0-9]{4}/[0-9]{2}/[0-9]{2}/[0-9]{2}/[0-9]{2}/[0-9]{2})' TIMESTAMP = '(?:[0-9]{4}/[0-9]{2}/[0-9]{2}/[0-9]{2}/[0-9]{2}/[0-9]{2})'
EXT = "(?:jpg|jpeg|png|gif)" EXT = "(?:jpg|jpeg|png|gif)"
@@ -35,6 +35,10 @@ module Sources
@pixiv_moniker @pixiv_moniker
end end
def fake_referer
"http://www.pixiv.net"
end
def has_artist_commentary? def has_artist_commentary?
@artist_commentary_desc.present? @artist_commentary_desc.present?
end end

View File

@@ -1,5 +1,9 @@
<% if params[:url] %> <% if params[:url] %>
<%= image_tag(image_proxy_uploads_path(:url => @normalized_url, :ref => params[:ref]), :title => "Preview", :id => "image") %> <% if ImageProxy.needs_proxy?(@normalized_url) %>
<%= image_tag(image_proxy_uploads_path(:url => @normalized_url), :title => "Preview", :id => "image") %>
<% else %>
<%= image_tag(@normalized_url, :title => "Preview", :id => "image") %>
<% end %>
<ul> <ul>
<% if @remote_size %> <% if @remote_size %>