class Seojs::Middleware
Public Class Methods
new(app)
click to toggle source
# File lib/seojs/middleware.rb, line 7 def initialize(app) @app = app end
Public Instance Methods
call(env)
click to toggle source
# File lib/seojs/middleware.rb, line 11 def call(env) @env = env if test? return [ 200, {"Content-Type" => "text/html"}, ['SEO.js Middleware Found!'] ] elsif Seojs.url && escaped_fragment_query? triplet = get_snapshot return triplet if triplet end @app.call(env) end
Private Instance Methods
escaped_fragment_query?()
click to toggle source
# File lib/seojs/middleware.rb, line 86 def escaped_fragment_query? @env['QUERY_STRING'].match(/_escaped_fragment_/) end
extract_http_request_headers(env)
click to toggle source
# File lib/seojs/middleware.rb, line 71 def extract_http_request_headers(env) headers = env.reject do |k, v| !(/^HTTP_[A-Z_]+$/ === k) || v.nil? end.map do |k, v| [reconstruct_header_name(k), v] end.select do |k,v| ["IF-NONE-MATCH", "IF-MODIFIED-SINCE", "CACHE-CONTROL", "USER-AGENT"].include? k end Hash[headers] end
get_snapshot()
click to toggle source
# File lib/seojs/middleware.rb, line 25 def get_snapshot url, headers = snapshot_request Timeout.timeout(10) do req = Net::HTTP::Get.new(url.to_s) headers.each_pair do |key, value| req[key] = value end snapshot_response = Net::HTTP.start(url.hostname, url.port, :use_ssl => url.scheme == 'https') {|http| http.request(req) } if [200, 301, 302, 304].include? snapshot_response.code.to_i body = snapshot_response.body || "" body = [body] unless body.respond_to?(:each) headers = snapshot_response.to_hash headers.each_key do |k| v = headers[k] headers[k] = v.join(', ') if v.kind_of? Array end headers.delete("status") if headers.key?("status") [snapshot_response.code, headers, body] else nil end end rescue Exception => e nil end
reconstruct_header_name(name)
click to toggle source
# File lib/seojs/middleware.rb, line 82 def reconstruct_header_name(name) name.sub(/^HTTP_/, "").gsub("_", "-") end
snapshot_request()
click to toggle source
# File lib/seojs/middleware.rb, line 55 def snapshot_request source_request = Rack::Request.new(@env) if source_request.fullpath == "" full_path = URI.parse(@env['REQUEST_URI']).request_uri else full_path = source_request.fullpath end scheme, host, port = source_request.scheme, source_request.host, source_request.port url = URI.parse("#{Seojs.url}/v3/#{scheme}://#{host}:#{port}#{full_path}") headers = extract_http_request_headers(@env) [url, headers] end
test?()
click to toggle source
# File lib/seojs/middleware.rb, line 90 def test? @env["PATH_INFO"] == "/seojs/test" end