hack to get the <title> tag when importing a url, without CORS issues

This commit is contained in:
Devin Howard 2016-09-23 14:29:28 +08:00
parent cc986368be
commit cc2e3b9358
4 changed files with 56 additions and 0 deletions

View file

@ -0,0 +1,35 @@
# bad code that should be seriously checked over before entering one of the
# other prim and proper files in the nice section of this repo
class HacksController < ApplicationController
include ActionView::Helpers::TextHelper # string truncate method
def load_url_title
authorize :Hack
url = params[:url] # TODO verify!?!?!?!
response, url = get_with_redirects(url)
title = get_encoded_title(response)
render json: { success: true, title: title, url: url }
rescue StandardError => e
render json: { success: false, error_type: e.class.name, error_message: e.message }
end
private
def get_with_redirects(url)
uri = URI.parse(url)
response = Net::HTTP.get_response(uri)
while response.code == '301'
uri = URI.parse(response['location'])
response = Net::HTTP.get_response(uri)
end
[response, uri.to_s]
end
def get_encoded_title(http_response)
title = http_response.body.sub(/.*<title>(.*)<\/title>.*/m, '\1')
charset = http_response['content-type'].sub(/.*charset=(.*);?.*/, '\1')
charset = nil if charset == 'text/html'
title = title.force_encoding(charset) if charset
truncate(title, length: 140)
end
end

View file

@ -0,0 +1,5 @@
class HackPolicy < ApplicationPolicy
def load_url_title?
true
end
end

View file

@ -80,4 +80,8 @@ Metamaps::Application.routes.draw do
get 'users/:id/details', to: 'users#details', as: :details
post 'user/updatemetacodes', to: 'users#updatemetacodes', as: :updatemetacodes
resources :users, except: [:index, :destroy]
namespace :hacks do
get 'load_url_title'
end
end

View file

@ -88,6 +88,18 @@ const PasteInput = {
import_id,
{
success: function(topic) {
$.get('/hacks/load_url_title', {
url: text
}, function success(data, textStatus) {
var selector = '#showcard #topic_' + topic.get('id') + ' .best_in_place'
if ($(selector).find('form').length > 0) {
$(selector).find('textarea, input').val(data.title)
} else {
$(selector).html(data.title)
}
topic.set('name', data.title)
topic.save()
})
TopicCard.showCard(topic.get('node'), function() {
$('#showcard #titleActivator').click()
.find('textarea, input').focus()